Как я могу применить пользовательскую сортировку для сортировки следующего?
<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>
Ожидаемый результат:
siteA
, siteB
, siteC
и т. д.com
, net
, org
и т. д.pics
, subdomain1
, sub-subdomain1.subdomain
и т. д.<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>
Заранее спасибо!
@ michael.hor257k да, это связано, но не совсем дублирует
Предполагая, что строки, по которым вы хотите отсортировать домены, следующие:
<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>
чтобы получить результат, показанный в вашем вопросе.
Похоже, это дубликат: stackoverflow.com/questions/55683106/…