【问题标题】:Custom sort order string delimiters自定义排序顺序字符串分隔符
【发布时间】:2019-05-21 20:58:30
【问题描述】:

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

<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. 将其余的令牌反转到最后但 2 之前,例如 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>

提前谢谢你!

【问题讨论】:

标签: xslt xslt-2.0


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-08
    • 1970-01-01
    • 2012-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多