Пользовательские разделители строк порядка сортировки

Как я могу применить пользовательскую сортировку для сортировки следующего?

<maps>
  <domain>pics.siteB.com</domain>
  <domain>subdomain1.siteA.com</domain>
  <domain>pics.siteA.org</domain>
  <domain>validdomain</domain>
  <domain>siteD.com</domain>
  <domain>sub-subdomain4.subdomain.siteC.com</domain>
  <domain>sub-subdomain1.subdomain.siteC.com</domain>
  <domain>subdomain1.siteA.net</domain>
<maps>

Я пробовал следовать, затем он странным образом сортировался и удалял запись, когда разделитель недоступен.

<xsl:apply-templates select = "*">
  <!-- using <xsl:variable> throws error here -->
  <xsl:sort select = "string-join(reverse(tokenize(domain, '\.')[position() lt last()]), '.')"></xsl:sort>
</xsl:apply-templates>

Ожидаемый результат:

  1. Получите предпоследний токен, например siteA, siteB, siteC и т. д.
  2. Получить последний токен после разделителя, например, com, net, org и т. д.
  3. Переверните остальные токены перед последними, кроме 2, например pics, subdomain1, sub-subdomain1.subdomain и т. д.
  4. сортировать по этому тексту
<maps>
  <domain>subdomain1.siteA.com</domain>
  <domain>subdomain1.siteA.net</domain>
  <domain>pics.siteA.org</domain>
  <domain>pics.siteB.com</domain>
  <domain>sub-subdomain1.subdomain.siteC.com</domain>
  <domain>sub-subdomain4.subdomain.siteC.com</domain>
  <domain>siteD.com</domain>
  <domain>validdomain</domain>
<maps>

Заранее спасибо!

Похоже, это дубликат: stackoverflow.com/questions/55683106/…

michael.hor257k 21.05.2019 23:07

@ michael.hor257k да, это связано, но не совсем дублирует

Rohit 21.05.2019 23:14
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
23
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Предполагая, что строки, по которым вы хотите отсортировать домены, следующие:

<domain>siteB com pics</domain>
<domain>siteA com subdomain1</domain>
<domain>siteA org pics</domain>
<domain>validdomain</domain>
<domain>siteD com</domain>
<domain>siteC com subdomain sub-subdomain4</domain>
<domain>siteC com subdomain sub-subdomain1</domain>
<domain>siteA net subdomain1</domain>

вы можете использовать:

XSLT 2.0

<xsl:stylesheet version = "2.0" 
xmlns:xsl = "http://www.w3.org/1999/XSL/Transform">
<xsl:output method = "xml" version = "1.0" encoding = "UTF-8" indent = "yes"/>

<xsl:template match = "/maps">
    <xsl:copy>
        <xsl:for-each select = "domain">
            <xsl:sort>
                <xsl:variable name = "tokens" select = "tokenize(., '\.')" />
                <xsl:value-of select = "$tokens[position() ge last() - 1], reverse($tokens[position() lt last() - 1])"/>
            </xsl:sort>
            <xsl:copy-of select = "."/>
        </xsl:for-each>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

чтобы получить результат, показанный в вашем вопросе.


Демо: https://xsltfiddle.liberty-development.net/bFN1y9F

Другие вопросы по теме