M1 Informatique Année 2015-2016
XML
TD no 10 : XSLT
(Correction)
Le sujet du TD 10 est ici.
Exercice 1 :
1. Points.xslt compte le nombre de points par semaine. Plus précisément, pour chaque
semaine, il ache le message :
Il y a <n> points cette semaine.\n
où <n> est le nombre de points de la semaine et '\n' denote un retour à la ligne.
2. On doit calculer la moyenne du total hebdomadaire sur l'ensemble des semaines. Donc
on doit 1 se placer au dessus des semaines c'est à dire au niveau de l'élément <points>
(second <xsd:apply-templates...> ci-dessous).
On va alors appeler un template comptageParSemaine, similaire au template comptage
(ici renommé comptageParJour) de la question précédente. Son rôle est de parcourir
chaque semaine. Pour chaque semaine, il nous faut le nombre total de points (de la
semaine). C'est exactement ce que faisait le template comptage à la question précédente.
On divise ensuite le résultat par le nombre de semaine (en utilisant count, c'est facile),
et on englobe tout ça dans un message :
1. On pourrait appeler directement depuis la racine, puisque qu'il n'y a qu'un ls (à savoir : <points>),
mais cela permet de mieux structurer le code et de mettre en évidence les similarité des templates recursifs
qu'on appelera.
1
M1 Informatique Année 2015-2016
Le tour est joué.
3. Pour les tests dans les <xsd:choose>, on peut se passer facilement de count en inversant
les tests comme suit :
Pour avoir le nombre total d'élément qui matchent un XPath on écrit un nouveau
template qui compte, récursivement, tous ces éléments. Le XPath souhaité est donné
en paramètre :
Il sut alors d'appeler le template avec le bon paramètre 2 . On peut, par exemple
dénir des variables globales (i.e. dans aucun template ) contenant les totaux.
Et donc, nalement, on se passe de count :
2. Vous remarquerez que certains paramètres ont été dénis avec des valeurs par défaut (attribut
select des éléments <xsl:param>) ce qui permet d'alléger le code.
2
M1 Informatique Année 2015-2016
4. Pour calculer le max, il sut de parcourir tous les jours, récursivement, et de prendre
la valeur maximale à chaque fois. Le template ci-dessous, qui ressemble beaucoup
aux templates récursif comptageParJour, comptageParSemaine et count vus dans
les questions précédentes, fait très bien l'aaire. À noter la subtilité du XPath entre
parenthèse, pour avoir une position sur l'ensemble et non parmi les ls d'un même
élément semaine.
Le reste est facile :
5. En notant n est le nombre de jour, pj le nombre de points du jour j et m est la moyenne
des points par jour, la variance est égal à :
1 X
V = (pj − m)2
n j jour
Comme toutes les fonctions se ressemblent (même condition d'arrêt, même XPath, appel
récursif quasiment identique), on décide de les fusionner en y ajoutant un paramètre mode
qui prend une valeur parmi : sum (par defaut), max et var (éventuellement count si on
veut compter les jours avec).
On obtient ainsi le super-template statJour que voici :
3
M1 Informatique Année 2015-2016
Après, il sut d'appeler le template avec le bon mode :
et le tour est joué :
4
M1 Informatique Année 2015-2016
6. Le boulot est presque déjà fait. On garde notre super-template de la question précédente,
ainsi que les variables globales maxJour, totalJour, totalPoints et moyJour. Puis
on dénit un template qui matche tout, de façon à récopier l'élément courant et,
récursivement, son contenu :
On décrit le template pour le cas où l'élément courant est un jour :
Terminé.
5
M1 Informatique Année 2015-2016
Figure 1 Full 1.5.xsl
6
M1 Informatique Année 2015-2016
Figure 2 Full 1.6.xsl