1

是否有可能在 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的工作方式。

4

1 回答 1

0

您可以使用多个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 上提供了 XSLT 1.0 方法,另一个站点似乎有XSLT 2.0 方法。两者都太长了,不值得在这里复制,所以请在这些链接中寻找它们。

于 2013-02-05T15:39:08.730 回答