xsl:sort permet d'effectuer un tri des données

Tri des balises sur un attribut

Si le fichier se présente de la façon suivante :

<TARGETFIELD FIELDNUMBER="1">
<TARGETFIELD FIELDNUMBER="3">
<TARGETFIELD FIELDNUMBER="1024">
<TARGETFIELD FIELDNUMBER="5">
...

alors, l'on utilise :

<xsl:apply-templates select="TARGETFIELD">
<xsl:sort select="@FIELDNUMBER" data-type="number"/>
</xsl:apply-templates>

ce qui permet de trier les balises TARGETFIELD selon leur attribut FIELDNUMBER de type number. Si data-type n'est pas précisé, il s'agit d'une chaîne de caractère (par défaut)

<TARGETFIELD FIELDNUMBER="1">
<TARGETFIELD FIELDNUMBER="2">
<TARGETFIELD FIELDNUMBER="3">
<TARGETFIELD FIELDNUMBER="4">
...

Tri des balises selon leur valeur

Si le fichier se présente de la façon suivante :

<TARGETFIELD>
<FIELDNUMBER>1</FIELDNUMBER>
<FIELDNUMBER>3</FIELDNUMBER>
<FIELDNUMBER>1024</FIELDNUMBER>
<FIELDNUMBER>12</FIELDNUMBER>
...
</TARGETFIELD>

Ou bien, lorsqu'on veut trier sur un champ fils :

<xsl:apply-templates select="TARGETFIELD">
<xsl:sort select="FIELDNUMBER" data-type="number"/>
</xsl:apply-templates>

Ce qui permet de tri la balise, sur ses champs fils (dans l'ordre croissant par défaut) :

<TARGETFIELD>
<FIELDNUMBER>1</FIELDNUMBER>
<FIELDNUMBER>2</FIELDNUMBER>
<FIELDNUMBER>3</FIELDNUMBER>
<FIELDNUMBER>4</FIELDNUMBER>
...
</TARGETFIELD>

Préciser le sens du tri

Pour trier dans un sens bien précis, il suffit de le préciser avec l'attribut order :

<xsl:apply-templates select="TARGETFIELD">
<xsl:sort select="FIELDNUMBER" order="ascending"/>
</xsl:apply-templates>

ou bien

<xsl:apply-templates select="TARGETFIELD">
<xsl:sort select="FIELDNUMBER" order="descending"/>
</xsl:apply-templates>

Tri sur plusieurs champs ou attributs

Si l'on veut trier sur plusieurs champs ou des balises sur plusieurs attributs, chaque balise xsl:sort ne permettant que de trier un champ, il faut ajouter autant de xsl:sort qu'il y a de champs à trier, selon leur ordre d'importance :

<xsl:apply-templates select="CONNECTOR">
<xsl:sort select="@FROMINSTANCE"/>
<xsl:sort select="@FROMFIELD"/>
<xsl:sort select="@TOINSTANCE"/>
</xsl:apply-templates>