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

XSLT sort Alphabetically then Numerically

默认情况下,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 之前出现。

在不知道将要推动什么的情况下,这是否很容易实现?

谢谢。

我认为你的意思是你想要一个字母在数字之前的排序顺序。

如果您希望 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(....)"/> 来计算按您想要的方式工作的排序键。