<xsl:for-each select="noeud"> ...contenu pour chaque élément noeud <xsl:for-each>Exercices 26, 27
XSLT permet de trier des données du fichier XML associé en ordre croissant ou décroissant.
La balise <xsl:sort> ... </xsl:sort> permet d'effectuer un tri sur les données du fichier XML. La syntaxe :
<xsl:sort select = string-expression lang = { nmtoken } data-type = { "text" | "number" | qname-but-not-ncname } order = { "ascending" | "descending" } case-order = { "upper-first" | "lower-first" } />
Fichier xslt_ex_tri_data.xml (incomplet) :
<?xml version="1.0" encoding="UTF-8"?> <?xml-stylesheet type="text/xsl" href="xslt_ex_tri.xslt"?> <presidents> <president> <term from="1789" to="1797"/> <name> <first>George</first> <last>Washington</last> </name> <party>Federalist</party> <vicePresident> <name> <first>John</first> <last>Adams</last> </name> </vicePresident> </president> <president> <term from="1797" to="1801"/> <name> <first>John</first> <last>Adams</last> </name> <party>Federalist</party> <vicePresident> <name> <first>Thomas</first> <last>Jefferson</last> </name> </vicePresident> </president> </presidents>Fichier xslt_ex_tri.xslt :
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="html"/> <xsl:template match="/"> <html> <body> <h1>Exemples de tri</h1> <xsl:apply-templates select="presidents"/> </body> </html> </xsl:template> <xsl:template match="presidents"> <h2>Les présidents sont triés par leur prénom avec xsl:for-each</h2> <xsl:for-each select="president"> <xsl:sort select="name/first"/> <xsl:apply-templates select="name"/> </xsl:for-each> <h2>Les présidents sont triés par leur prénom avec xsl:apply-templates</h2> <xsl:apply-templates select="president/name"> <xsl:sort select="first"/> </xsl:apply-templates> <h2>Les présidents sont triés par la date avec xsl:apply-templates</h2> <xsl:apply-templates select="president/name"> <xsl:sort select="../term/@from" data-type="number" order="descending"/> </xsl:apply-templates> <h2>Tri par champs multiples</h2> <xsl:apply-templates select="president/name"> <xsl:sort select="last"/> <xsl:sort select="first" order="descending"/> </xsl:apply-templates> <h2>Tous les présidents et vice-présidents avec boucles imbriquées</h2> <ul> <xsl:for-each select="president"> <xsl:sort select="name/first" order="descending"/> <li> <xsl:apply-templates select="name"/> </li> <ul> <xsl:for-each select="vicePresident"> <xsl:sort select="name/first"/> <li> <xsl:apply-templates select="name"/> </li> </xsl:for-each> </ul> </xsl:for-each> </ul> <h2>Tous les présidents et vice-présidents avec xsl:apply-templates</h2> <ul> <xsl:apply-templates select="president"> <xsl:sort select="name/first" order="descending"/> </xsl:apply-templates> </ul> </xsl:template> <!-- modèle president retourne les noms du président et du vice-président --> <xsl:template match="president"> <li> <xsl:apply-templates select="name"/> </li> <ul> <xsl:for-each select="vicePresident"> <xsl:sort select="name/first"/> <li> <xsl:apply-templates select="name"/> </li> </xsl:for-each> </ul> </xsl:template> <!-- modèle name retourne prénom, autre prénom et nom --> <xsl:template match="name"> <xsl:text> </xsl:text> <xsl:value-of select="first"/> <xsl:text> </xsl:text> <xsl:value-of select="middle"/> <xsl:text> </xsl:text> <xsl:value-of select="last"/> <br/> </xsl:template> </xsl:stylesheet>Pour tester