XSLT按字母顺序排序,然后按数字排序

时间:2015-01-21 16:08:28

标签: sorting xslt numerical alphabetical

默认情况下,xslt按字母顺序排序,然后按字母顺序排序。 如果我首先按字母顺序排在数字之后怎么办。

<root>
  <item>B3</item>
  <item>A1</item>
  <item>C2</item>
  <item>3B</item>
  <item>2C</item>
  <item>1A</item>
</root>

我想要:

<root>
  <item>A1</item>
  <item>B3</item>
  <item>C2</item>
  <item>1A</item>
  <item>2C</item>
  <item>3B</item>
</root>

问题是我不知道名字中有多少字母或多少字母。它可以是1054-FS或C104-G。 C20-H也应该在C101-H之前进行评估。

如果不知道将要推进什么,这是否容易实现?

感谢。

1 个答案:

答案 0 :(得分:0)

我认为你所说的是你想要一个字母在数字前面的整理顺序。

如果您希望C20在C101之前,那么您还在寻找一个对连续数字进行分组的排序规则,并将它们排序为数字。

说XSLT(总是)在字母前排序数字是不正确的。默认排序规则取决于您使用的XSLT处理器,它未在语言规范中定义。

在XSLT 3.0和Saxon 9.6中,您可以使用Unicode排序算法来实现此效果。你会写

<xsl:sort select="..." 
collation="http://www.w3.org/2013/collation/UCA?numeric=yes;reorder=Latn,digit"/>

(我没有测试过这个具体的例子)。

如果您正在使用其他处理器,则必须检查其文档以查看它提供的排序规则选项。你有时可以通过使用<xsl:sort select="translate(....)"/>计算一个按照你想要的方式工作的排序键来玩弄技巧。