Skip to content

Correction de l'exercice 9

11/03/2010

L’exercice 9 consistait à

  • créer un filtre dans une boucle pour que celle-ci ne prenne en compte que des balises correspondant à plusieurs conditions.
  • choisir un ordre d’affichage des résultats contenant un calcul.

Voir le fichier XSL et le fichier HTML qui en résulte.

Explications

(je n’explique que la partie sur laquelle portait réellement la difficulté)

<xsl:for-each
select="dll/ville[an2005/inscrits &gt; 0
and an2008/inscrits &gt; 0
and (an2005/inscrits div an2005/population)*100 &lt;
(an2008/inscrits div an2008/population)*100]">
On exprime donc toutes les conditions entre les mêmes crochets

Chaque condition est séparée par and

Notez que les sauts de lignes dans la valeur d’un attribut ne posent aucun problème au processeur XSL.

Si l’attribut peut contenir des espaces, espaces et sauts de ligne sont équivalents en XML

<xsl:sort select="(an2008/inscrits div an2008/population)-(an2005/inscrits div an2005/population)"
order="descending" data-type="number"/>
Le tri se fait sur la différence entre la proportion d’inscrits en 2008 et celle des inscrits de 2005.

La différence est forcément > 0 puisque c’est une condition exprimée dans le filtre lui-même

L’ordre est décroissant (les plus grandes « différences » d’abord, donc les bibliothèques qui ont le plus augmenté leur taux d’inscrits en tête)

<tr>
<td>
<xsl:value-of select="position()"/>
</td>
Affichage de la position dans la listeLa position() est celle du noeud en cours, donc, en l’occurrence, s’applique au noeud dll/ville
<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>

NB : dans la règle de tri, pour abréger un peu la formule, j’ai enlevé le *100. Cela n’a aucune incidence sur l’ordre des villes, et c’est plus court.

Advertisements
%d blogueurs aiment cette page :