在XSL中自然排序?

时间:2013-02-05 15:16:06

标签: xslt xpath

是否有可能做到,以及如何在XSL中实现自然的案例排序?

例如,给定以下XML片段:

<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的工作方式。

1 个答案:

答案 0 :(得分:0)

您可以使用多个xsl:sort s:

<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。两者都太长了,不值得在这里复制,所以请在这些链接上寻找它们。