2008-10-16 4 views
0

Je suis en train de commander des articles sur la base d'une valeur d'attribut:valeurs d'ordre

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

Cela ne les commander, mais je ne pouvais avoir des valeurs comme 1,2,3, ... 10, 11,. .. 20 et il va les ordonner 1,10,11, ... 2,20 ... 3. etc.
Je pourrais aussi avoir des valeurs comme 1.A, 1.B, 2.A, 2.B

Comment puis-je ordonner ces valeurs pour prendre en compte le contenu numérique et l'alphabétique, dans cette priorité?

Répondre

7

Si vous savez que chaque question a un certain nombre en plusieurs parties, vous pouvez les manipuler avec deux <xsl:sort> instructions:

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

Si certains chiffres pourraient avoir plusieurs parties et d'autres pas, je suppose que le meilleur chose à faire est:

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

le concat(@Value, '.') supplémentaire ajoute un « . » à la fin de la valeur de telle sorte que la substring-before() obtient toujours le nombre.

2

Vous pouvez trier par ordre numérique en utilisant l'attribut data-type:

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

La fonction de tri intégré ne prend pas en charge pour la commande plus complexes (comme les clés multipart dont vous parlez).

0

Pour sorting chiffres que vous pouvez utiliser ceci:

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

Notez que l'attribut data-type est utilisé here. Pour des valeurs telles que 1.A, 1.B, 2.A, 2.B vous êtes de retour au texte et devrez recourir à des trucs intelligents qui ont probablement recours à l'imbrication laide. Considérons le xsl:numberelement qui peut être utilisé de manière intéressante.