Skip to content

Trier une liste en XSL – N°8/XXX

05/03/2010

Ce billet est dans la lignée du précédent, qui évoquait des limites quand on produit une liste un peu longue : comment la trier dans un ordre intéressant.

La réponse a déjà été donnée en partie en commentaire à ce billet. Mais comme tout le monde ne lit pas les commentaires…

Dans le précédent billet, donc j’obtenais un tableau à trois colonnes :

Ville Pourcentage d’inscrits en 2005 Pourcentage d’inscrits en 2008

La boucle pour chaque ville créait une ligne avec trois cellules (voir le fichier XSL entier, et ses explications) :

<xsl:for-each select="dll/ville">
<tr>
<td><xsl:value-of select="@nom"/></td>
<td><xsl:value-of select="(an2005/inscrits div an2005/population)*100"/></td>
<td><xsl:value-of select="(an2008/inscrits div an2008/population)*100"/></td>
</tr>
</xsl:for-each>

Même si le tri s’effectue pour l’ensemble de la liste, la balise <xsl:sort> qui définit le critère de tri est mise juste après la balise <xsl:for-each>.

(J’insiste peut-être inutilement : il est possible que cela ne vous semble pas contradictoire. Cela signifie donc que vous « pensez déjà XSL », félicitations !).

1. Trier par nom de ville

<xsl:for-each select="dll/ville">
<xsl:sort select="@nom" order="descending">
<tr>
<td><xsl:value-of select="@nom"/></td>
<td><xsl:value-of select="(an2005/inscrits div an2005/population)*100"/></td>
<td><xsl:value-of select="(an2008/inscrits div an2008/population)*100"/></td>
</tr>
</xsl:for-each>

Le critère est le contenu de l’attribut @nom. Comme le processeur trouve du texte, il choisira l’ordre alphabétique, ou inversement alphabétique .  order="descending" précise qu’il faut l’ordre alphabétique (l’autre valeur possible est : ascending, évidemment).

Voir le fichier XSL complet.

(Pour ceux qui lisent les exercices sans prendre le temps de les faire — pour d’excellentes raisons, d’ailleurs ! — vérifiez au passage que vous êtes tout de même toujours capables d’associer le fichier XML à cette feuille XSL pour produire un résultat)

2. Trier par taille de population

Rappelez-vous : dans ce fichier on a la population de 2005 et celle de 2008. Il faut donc choisir l’une des deux. On va prendre la plus récente. Et le tri va s’effectuer de manière à avoir les plus grosses villes en tête.

On va donc là comparer des nombres. Or par défaut, quand on ne lui précise pas s’il s’agit de nombres ou de textes, la fonction <xsl:sort> considère qu’il s’agit de texte : 2100 est donc « supérieur » à 2001000. Il faut lui préciser que nous trions des nombres.

<xsl:for-each select="dll/ville">
<xsl:sort select="an2008/population" order="descending" data-type="number">
<tr>
<td><xsl:value-of select="@nom"/></td>
<td><xsl:value-of select="(an2005/inscrits div an2005/population)*100"/></td>
<td><xsl:value-of select="(an2008/inscrits div an2008/population)*100"/></td>
</tr>
</xsl:for-each>

l’attribut @data-type peut avoir 2 valeurs possibles : text, number1

Je vous laisse modifier le fichier XSL précédent si vous voulez observer le résultat (une page HTML, bien sûr)

3. Trier par pourcentage

Il peut être intéressant aussi de trier par pourcentage : placer en tête de liste les villes ayant le plus fort taux d’inscrits au regard de la population.

Imaginons que je veuille placer en tête les villes dont le pourcentage est le plus faible : je vais donc devoir exploiter un critère qui n’est pas dans mon fichier XML de départ, puisque c’est le résultat d’une opération mathématique.

Je vais donc devoir effectuer mon opération aussi dans la balise <xsl:sort>, avec quelque chose comme :

<xsl:sort select="(an2008/inscrits div an2008/population)*100" order="ascending" data-type="number"/>

Sauf que ça ne marche pas !

Pourquoi ?

(suspense…)

——————————

1. Aux informaticiens présents dans la salle : je laisse de côté les QName.

Publicités
%d blogueurs aiment cette page :