0

我正在尝试根据属性值订购商品:

<xsl:apply-templates select="Question">
    <xsl:sort order="ascending" select="@Value"></xsl:sort>
</xsl:apply-templates>

这确实对它们进行了排序,但我可以有像 1,2,3, ... 10, 11, ... 20 这样的值,它会为它们排序 1,10,11, ... 2,20... 3。等等。
我也可以有像 1.A、1.B、2.A、2.B 等这样的值。

我如何排序这些值以在该优先级中考虑数字内容和字母?

4

3 回答 3

7

如果您知道每个问题都有一个多部分编号,则可以使用两条<xsl:sort>指令来处理它们:

<xsl:apply-templates select="Question">
  <xsl:sort select="substring-before(@Value, '.')" data-type="number" />
  <xsl:sort select="substring-after(@Value, '.')" />
</xsl:apply-templates>

如果有些数字可能有多个部分,而有些则没有,我想最好的办法是:

<xsl:apply-templates select="Question">
  <xsl:sort select="substring-before(concat(@Value, '.'), '.')" data-type="number" />
  <xsl:sort select="substring-after(@Value, '.')" />
</xsl:apply-templates>

额外的在值的末尾concat(@Value, '.')添加一个 ' .' 以便substring-before()始终获取数字。

于 2008-10-16T19:04:49.997 回答
2

data-type您可以使用以下属性按数字顺序排序:

<xsl:sort order="ascending" select="@Value" data-type="number"></xsl:sort>

内置排序功能不支持更复杂的排序(例如您提到的多部分键)。

于 2008-10-16T18:25:02.867 回答
0

对于排序数字,您可以使用:

<xsl:template match="employees">
  <xsl:apply-templates>
    <xsl:sort select="salary" data-type="number"/>
  </xsl:apply-templates>
</xsl:template>

请注意,此处data-type使用了该属性。对于像 1.A, 1.B, 2.A, 2.B 这样的值,您将再次返回文本,并且将不得不求助于可能求助于丑陋嵌套的聪明东西。请考虑可以以有趣方式使用的元素。xsl:number

于 2008-10-16T18:39:59.810 回答