订购价值

时间:2008-10-16 18:20:38

标签: xml xslt

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

<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等值。

如何订购这些值以考虑该优先级中的数字内容和字母?

3 个答案:

答案 0 :(得分: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()始终获得该号码。

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:0)

对于sorting号码,您可以使用此号码:

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

请注意data-type属性使用here。对于像1.A,1.B,2.A,2.B这样的值,你会再次回到文本状态,并且必须采用可能适合丑陋嵌套的聪明东西。请考虑可以以有趣的方式使用的xsl:number element