XSLT (opérations avancées) : Numérotation et ordonnancement

Trier des éléments XML avec xsl:sort

FondamentalTrier 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).

AttentionPlacement 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émentPrincipaux 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

RemarqueTri 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".

ExempleTrier une liste de personne en fonction de leur nom et de leur prénom.

XML source :

CTRL+C pour copier, CTRL+V pour coller
1
<?xml version="1.0" encoding="UTF-8"?>
2
<persons>
3
    <person>
4
        <name>Hugo</name>
5
        <surname>Pinkman</surname>
6
    </person>
7
    <person>
8
        <name>Elizabeth</name>
9
        <surname>Stonem</surname>
10
    </person>
11
    <person>
12
        <name>Alicia</name>
13
        <surname>Pinkman</surname>
14
    </person>
15
</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 :

CTRL+C pour copier, CTRL+V pour coller
1
<?xml version="1.0" encoding="UTF-8"?>
2
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
3
    xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs" version="2.0">
4
    <xsl:output method="xml" indent="yes" encoding="iso-8859-1"/>
5
    
6
    <xsl:template match="persons">
7
        <persons>
8
            <xsl:for-each select="person">
9
                <xsl:sort select="./surname" data-type="text"></xsl:sort>
10
                <xsl:sort select="./name" data-type="text"></xsl:sort>
11
                <xsl:copy-of select="."/>
12
            </xsl:for-each>
13
        </persons>
14
    </xsl:template>
15
    
16
</xsl:stylesheet>
17
<?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 :

CTRL+C pour copier, CTRL+V pour coller
1
<?xml version="1.0" encoding="iso-8859-1"?>
2
<persons>
3
   <person>
4
        <name>Alicia</name>
5
        <surname>Pinkman</surname>
6
    </person>
7
   <person>
8
        <name>Hugo</name>
9
        <surname>Pinkman</surname>
10
    </person>
11
   <person>
12
        <name>Elizabeth</name>
13
        <surname>Stonem</surname>
14
    </person>
15
</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>
PrécédentPrécédentSuivantSuivant
AccueilAccueilImprimerImprimer Benoît Villain, Thibault Brocheton, Lucas Charrier, Félix Motot, 2013-2016 (Contributions : Stéphane Crozat, les étudiants de l'UTC) Paternité - Partage des Conditions Initiales à l'IdentiqueRéalisé avec Scenari (nouvelle fenêtre)