Bonjour,
J'ai écrit une feuille de style XSLT 2.0 pour trier un fichier XML d'annonces dont la structure est la suivante:
En utilisant dans un template une suite de balises <xsl:sort>, j'arrive à trier ces annonces par ville puis par prix.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 <annonces> <annonce> <id>1</id> <ville>Paris</ville> <prix>200</prix> </annonce> <annonce> <id>2</id> <ville>Nantes</ville> <prix>150</prix> </annonce> <annonce> <id>3</id> <ville>Paris</ville> <prix>120</prix> </annonce> </annonces>
Voici la feuille de style complète, pour ceux que ça intéresse. Au passage, j'ai défini une variable "grouper" qui permet de commuter entre un tri par ville et un tri global selon sa valeur (c'est une astuce pour désactiver facilement le premier <xsl:sort>).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 <xsl:sort data-type="text" select="ville" order="ascending"/> <xsl:sort data-type="number" select="prix" order="descending"/>
Problématique actuelle : je voudrais pouvoir trier ce fichier suivant un ordre spécifique pour les villes, et non plus seulement par ordre alphabétique croissant ou décroissant. Par exemple, j'aimerais pouvoir dire "fais un tri par ville dans l'ordre Paris / Caen / Lyon / Amiens, et pour chaque ville, fais un tri par prix".
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns=""> <xsl:output method="xml" encoding="utf-8" omit-xml-declaration="yes" indent="no"/> <xsl:strip-space elements="*"/> <xsl:variable name="grouper" select="'par-ville'"/> <xsl:template match="/annonces"> <xsl:apply-templates select="annonce"> <xsl:sort data-type="text" select="ville[$grouper = 'par-ville']" order="ascending"/> <xsl:sort data-type="number" select="prix" order="descending"/> </xsl:apply-templates> </xsl:template> <xsl:template match="*|@*|text()"> <xsl:copy> <xsl:apply-templates select="*|@*|text()"/> </xsl:copy> </xsl:template> </xsl:stylesheet>
Voici une tentative (non fonctionnelle) d'utiliser un <xsl:for-each> pour parcourir les valeurs présentes dans une nouvelle variable "villes".
Questions :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns=""> <xsl:output method="xml" encoding="utf-8" omit-xml-declaration="yes" indent="no"/> <xsl:strip-space elements="*"/> <xsl:variable name="grouper" select="'par-ville'"/> <xsl:variable name="villes" select="'Paris','Caen','Lyon','Amiens'"/> <xsl:template name="trier-une-ville"> <xsl:param name="ville" /> <xsl:apply-templates select="annonce"> <xsl:sort data-type="text" select="ville[$grouper = 'par-ville'][. = $ville]" order="ascending"/> <xsl:sort data-type="number" select="prix" order="descending"/> </xsl:apply-templates> </xsl:template> <xsl:template match="/annonces"> <xsl:if test="$grouper = 'par-ville'"> <xsl:for-each select="$villes"> <xsl:call-template name="trier-une-ville"> <xsl:with-param name="ville" select="."/> </xsl:call-template> </xsl:for-each> </xsl:if> <xsl:if test="$grouper = 'liste-globale'"> <xsl:call-template name="trier-une-ville"/> </xsl:if> </xsl:template> <xsl:template match="*|@*|text()"> <xsl:copy> <xsl:apply-templates select="*|@*|text()"/> </xsl:copy> </xsl:template> </xsl:stylesheet>
- Est-il possible d'utiliser un <xsl:for-each> pour parcourir ma variable "villes"?
- Dans la négative, comment peut-on trier suivant un ordre spécifique?
Merci de vos lumières!
Grégoire
Partager