2008-10-16 77 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