TP noté n°2 (rattrapage)
XML — Licence Pro BDISE — 30 mars 2015 — Durée: 1h45
Préambule
- Le sujet comporte plusieurs questions indépendantes, auquel on peut répondre dans un ordre quelconque.
- Les question Bonus sont a priori plus difficiles ou du moins assez longues; le nombre de points attribué à ces question étant relativement faible, il vaut mieux éviter de perdre du temps dessus à moins d'avoir fini le reste du sujet.
- Commencer par créer un dossier
TPsolo2votreLogin
dans lequel vous effectuerez tout le TP. - Pour chaque question, nommer le fichier concerné avec le nom de la question et l'extension adaptée:
Question1.xq
,Question2.xsl
. - À l'issue du TP, supprimer les fichiers générés (par exemple la sortie HTML de l'application d'une feuille XSLT sur un document XML) ainsi que les fichiers fournis dans l'énoncé.
Surtout faites bien attention de ne pas supprimer un fichier que vous avez écrit! (Bien les nommer permet d'éviter cela facilement...) - Faire une archive (
.tar.gz
) à votre nom à partir du dossier contenant vos réponses et la soumettre via Eprel. En cas d'oubli de votre identifiant EPREL, voici la liste (mot de passe par défaut: date de naissancejjmmaaa
). - Les seuls documents autorisés sont les notes de cours et vos productions de TD/TP. Il est également autorisé d'utiliser le site W3Schools ou la norme SVG comme aide mémoire.
- Le non respect de ces consignes pourra entraîner le retrait de points.
- Il ne faut pas copier-coller le XML affiché par le navigateur mais toujours l'enregistrer. Utiliser
wget
est aussi possible.
Rappels des commandes de compilation
Validité vis-à-vis d'une DTD
xmllint --dtdvalid <doctype>.dtd <arbre>.xml
XSLT
xsltproc -o <page>.html <transformation>.xsl <arbre>.xml
XQuery
saxon-xquery -o <fichierProduit>.xml <requeteXQuery>.xq
Création d'une archive .tar.gz
tar -cvzf <archive>.tar.gz <dossier>/
Énoncé
Nous allons aujourd'hui travailler sur un document XML CroixRouge.xml
qui contient la liste des bureaux et centres ("structures") de la Croix Rouge Française. Ce document obéit à cette DTD.
- On souhaiterait mettre de l'ordre dans cette liste en rangeant les structures selon leur activité (le contenu de
Activite_Structure
) . Le résultat de la requête devra se conformer à la DTD fournie. On fournit également le résultat obtenu. On remarque:- Que chaque activité n'apparaît plus qu'une seule fois, avec potentiellement plusieurs
structure
s. - Les structures sont ensuites groupées par département; on peut s'aider pour cela du code postal (
CP_Structure
)... - L'adresse postale a été obtenue à partir des différents morceaux d'adresse (
Adresse_Structure
,Adresse_Cplt_Structure
,LieuDit_Structure
,CP_Structure,Ville_Structure
). On peut utiliserstring-join((str1,...strn),' ')
pour s'affranchir des problèmes d'espaces. - Le code de la structure, le n°SIRET et le code postal sont devenus des attributs.
- Le reste des informations (et en particulier les "actions") est à récupérer tel quel.
- L'ordre des attributs n'ayant pas d'importance, il est choisi arbitrairement par le compilateur XQuery et peut varier entre le résultat attendu et le XML que vous obtiendrez.
- Que chaque activité n'apparaît plus qu'une seule fois, avec potentiellement plusieurs
- On souhaite à présent formater ces informations sur une page HTML, à l'aide d'une feuille XSLT. La transformation s'appliquera sur le fichier
CroixRougeRange.xml
fourni. On fournit également une feuille XSLT qui contient déjà quelques templates utiles. Le résultat que l'on shouhaite obtenir est ici. On remarque:- Que sous le titre il y a un petit paragraphe introductif contenant quelques statistiques.
Le texte à trou est déjà présent dans une template qu'il convient de compléter afin de calculer:
- le nombre total de structures;
- le nombre des activités;
- le nombre de structures dont l'un des groupe d'actions est 'Urgence et Secourisme';
- le nombre de structures dont l'un des groupe d'actions est 'Actions Sociales';
- le nombre de structures dont l'un des groupe d'actions est 'Urgence et Secourisme' et un autre est 'Actions Sociales';
- le nombre de structures de type 'UNITE LOCALE' ou 'IMPLANTATION LOCALE' dans le 77;
- le nombre de structures dont l'activité est 'Service de soins infirmiers à domicile' dans le 77.
- Que chaque activité est dans un
div
de classeactivite
. - Le nom de l'activité est dans un
h1
. - Bonus: on peut également remarquer que chaque activité dispose également d'un identifiant basé sur son
titre
. Il ne faut ici pas simplement récupérer les valeurs mais également retirer les caractères spéciaux (accents, cédilles, apostrophes, espaces...) qui seraient ennuyeux si on voulait par exemple se servir de cet identifiant pour faire du CSS. - Au sein de chaque activité, chaque structure est elle aussi dans un
div
, de classestructure
. Le nom (Libelle_Structure
) est dans un titre de niveau 2. - Pour chaque structure vient sous le titre le type de cette structure, puis les services proposés (titre en
h3
) sous la forme d'une liste à plusieurs niveaux: les services sont en effet rangés dans diversGroupe_Actions
. - Ensuite vient les informations de contact sous la forme d'une liste de description. Remarquons que le site web est également un lien.
- On remarque que toutes les structures ne proposent pas de services, et que dans ce cas le titre même "Services proposés" n'apparaît pas; il en est de même pour le site web.
- Enfin, on va ajouter avec du SVG un logo devant le nom de chaque structure.
- Cette croix est constituée de deux rectangles (rouges).
- En bas à droite est le numéro du département dans lequel se trouve la structure.
- Bonus: on va animer cette croix pour donner l'illusion d'une rotation autour de la branche verticale. Pour cela, il suffit d'agir sur la branche horizontale de la croix qui se rétrécit puis s'agrandit.
- NB: Pour ne pas donner accès aux sources, ce logo n'est pas dans le résultat attendu; on peut cependant le voir ci dessous:
- Que sous le titre il y a un petit paragraphe introductif contenant quelques statistiques.
Le texte à trou est déjà présent dans une template qu'il convient de compléter afin de calculer: