【问题标题】:Natural case sorting in XSL?XSL 中的自然大小写排序?
【发布时间】:2013-02-05 15:16:06
【问题描述】:

是否可以在 XSL 中进行自然案例排序,如何实现?

例如,给定以下 XML sn-p:

<items>
  <item>A 24</item>
  <item>B 12</item>
  <item>B 11</item>
  <item>C 10</item>
  <item>A 1</item>
  <item>B 2</item>
</item>

如何对输出进行排序,以便获得如下元素列表?

<ul>
  <li>A 1</li>
  <li>A 24</li>
  <li>B 2</li>
  <li>B 11</li>
  <li>B 12</li>
  <li>C 10</li>
</ul>

编辑:我对可以处理任意字符串的解决方案特别感兴趣,例如。那些不遵循通用模式的模式,类似于 PHP 的 natsort 的工作方式。

【问题讨论】:

    标签: xslt xpath


    【解决方案1】:

    你可以使用多个xsl:sorts:

    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
      <xsl:output method="xml" indent="yes"/>
    
      <xsl:template match="/items">
        <ul>
          <xsl:apply-templates select="item">
            <xsl:sort select="substring-before(., ' ')" />
            <xsl:sort select="substring-after(., ' ')" data-type="number" />
          </xsl:apply-templates>
        </ul>
      </xsl:template>
    
      <xsl:template match="item">
        <li>
          <xsl:value-of select="."/>
        </li>
      </xsl:template>
    </xsl:stylesheet>
    

    在您的示例输入上运行时,会产生:

    <ul>
      <li>A 1</li>
      <li>A 24</li>
      <li>B 2</li>
      <li>B 11</li>
      <li>B 12</li>
      <li>C 10</li>
    </ul>
    

    更彻底(通用)的自然排序需要更复杂的方法。 Dimitre Novatchev 在 Stack Overflow 上提供了 an XSLT 1.0 approach,另一个站点似乎有 an XSLT 2.0 approach。两者都太长了,不值得在这里复制,所以请在这些链接中寻找它们。

    【讨论】:

    • 是否可以通用地执行此操作,例如。没有在空格上拆分字符串?例如,如果我有一个文件列表:200327582_RFTS, 138082008_RFTS, 138012009 RFTS, 10101010, ABCDEF.
    • @unpluggd Here 是 Dimitre Novatchev 的一个 SO 答案,它似乎是一个有一些限制的实现。 This 似乎是 XSLT 2.0 实现。
    猜你喜欢
    • 2014-03-27
    • 2019-06-19
    • 1970-01-01
    • 2016-01-04
    • 2012-12-04
    • 2021-02-01
    • 2013-06-20
    • 1970-01-01
    • 2012-12-27
    相关资源
    最近更新 更多