Trier des éléments XML avec xsl:sort
Fondamental : Trier avec xsl:sort
L'instruction xsl:sort permet de définir l'ordre dans lequel des éléments seront traités (et affichés par exemple).
Attention : Placement de xsl :sort
xsl:sort un sous élément du xsl:for-each et de xsl:apply-templates.
Il doit donc être placé après un de ces deux éléments.
Complément : Principaux attributs de xsl:sort
select = string-expression. Spécifie quels sont les nœuds que l'on veut trier.
data-type = { "text" | "number" | QName }. Spécifie le type des données à trier.
order = { "ascending" | "descending" }. Spécifie dans quel ordre on souhaite trier les nœuds.
Pour plus d'informations sur les attributs de xsl:sort, je vous invite à jeter un œil sur : http://www.w3schools.com/xml/ref_xsl_el_sort.asp
Remarque : Tri stable
xsl:sort nous permet d'obtenir un tri stable.
Pour rappel, un tri stable est un tri qui ne bouleverse pas l'ordre relatif entre des éléments "identiques".
Exemple : Trier une liste de personne en fonction de leur nom et de leur prénom.
XML source :
<persons>
<person>
<name>Hugo</name>
<surname>Pinkman</surname>
</person>
<person>
<name>Elizabeth</name>
<surname>Stonem</surname>
</person>
<person>
<name>Alicia</name>
<surname>Pinkman</surname>
</person>
</persons>
<?xml version="1.0" encoding="UTF-8"?> <persons> <person> <name>Hugo</name> <surname>Pinkman</surname> </person> <person> <name>Elizabeth</name> <surname>Stonem</surname> </person> <person> <name>Alicia</name> <surname>Pinkman</surname> </person> </persons>
XSLT :
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="2.0">
<xsl:output method="xml" indent="yes" encoding="iso-8859-1"/>
<xsl:template match="persons">
<persons>
<xsl:for-each select="person">
<xsl:sort select="./surname" data-type="text"></xsl:sort>
<xsl:sort select="./name" data-type="text"></xsl:sort>
<xsl:copy-of select="."/>
</xsl:for-each>
</persons>
</xsl:template>
</xsl:stylesheet>
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="2.0"> <xsl:output method="xml" indent="yes" encoding="iso-8859-1"/> <xsl:template match="persons"> <persons> <xsl:for-each select="person"> <xsl:sort select="./surname" data-type="text"></xsl:sort> <xsl:sort select="./name" data-type="text"></xsl:sort> <xsl:copy-of select="."/> </xsl:for-each> </persons> </xsl:template> </xsl:stylesheet>
XML obtenu :
<persons>
<person>
<name>Alicia</name>
<surname>Pinkman</surname>
</person>
<person>
<name>Hugo</name>
<surname>Pinkman</surname>
</person>
<person>
<name>Elizabeth</name>
<surname>Stonem</surname>
</person>
</persons>
<?xml version="1.0" encoding="iso-8859-1"?> <persons> <person> <name>Alicia</name> <surname>Pinkman</surname> </person> <person> <name>Hugo</name> <surname>Pinkman</surname> </person> <person> <name>Elizabeth</name> <surname>Stonem</surname> </person> </persons>