2008-10-16 52 views
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等等

我该如何订购这些值来考虑数字内容和字母,在这个优先级?

回答

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()总是得到编号。

2

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

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

内置的排序功能,不具备更为复杂的排序支持(如你所提到的多键)。

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:numberelement