自定义排序顺序字符串定界符

时间:2019-05-21 20:58:30

标签: xslt xslt-2.0

如何应用自定义排序对以下内容进行排序?

<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. 获取最后一个令牌,例如siteAsiteBsiteC
  2. 获取定界符后的最后一个令牌,例如comnetorg
  3. 颠倒倒数第二个令牌之前的其余令牌,例如picssubdomain1sub-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>

提前谢谢!

1 个答案:

答案 0 :(得分:0)

假设您要对域进行排序的字符串是:

<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