TP noté n°2

XML — Licence Pro BDISE — 10 février 2015 — Durée: 2h

Préambule

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 Ministres.xml qui contient la liste des ministres depuis la Libération. Ce document obéit à cette DTD

  1. On remarque tout d'abord que ce fichier est un peu désordonné. En effet, les mêmes personnes apparaissent plusieurs fois, et dans un ordre arbitraire. On souhaiterait mettre de l'ordre dans tout ça à l'aide d'une requête Xquery. Le résultat de la requête devra se conformer à la DTD fournie. On fournit également le résultat obtenu. On remarque:
    • Que chaque personne (ministre) n'apparaît plus qu'une seule fois, avec potentiellement plusieurs mandats.
    • Les personnes sont classées par ordre alphabétiques et leurs mandats sont classés par ordre chronologique (il est suffisant de se baser sur la date de debut du poste, qui est au format iso donc très pratique).
    • Dans chaque mandat il y a la fonction dont le contenut provient du poste, puis les informations concernant le gouvernement, le president et le regime qui sont à récupérer telles quelles.
  2. On souhaite à présent formater ces informations sur une page HTML, à l'aide d'une feuille XSLT. La transformation s'appliquera sur le fichier MinistresRanges.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 chaque personne est dans un div de classe ministre.
    • Le nom du ministre est dans un h2.
    • Chaque mandat dispose d'un div (de classe mandat) et la fonction est placée dans un titre de niveau 3 (h3).
    • Pour chaque mandat viennent ensuite quelques informations formatées correctement: date du début et de fin, gouvernement, et président.
    • Bonus: on peut également remarquer que chaque mandat dispose également d'une classe correspondant au président et une autre correspondant au régime. 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 ces classes pour faire du CSS.
    • On peut remarquer qu'à la toute fin du document produit se trouvent quelques statistiques. Construire les templates permettant de les calculer.
      • On précise que les Premiers ministres sont parfois désignés comme "Président du ..." (que ce soit conseil, conseil, des ministres, gouvernement, ou autre).
      • On appréciera bien la différence entre les deux dernières statistiques.
      • Bonus On arrondira la moyenne du nombre de mandats dix-millième; notez qu'il existe une fonction d'arrondi, mais qu'elle donne un entier...
    • Enfin, on va s'occuper de la représentation graphique de la "carrière" des ministres, en utilisant du SVG. Le concept est le suivant: puisque les mandats s'étalent de 1944 à 2014, il y a 852 mois représentés chacun par une "unité" (ici le navigateur verra cette unité comme un pixel). Chaque mandat sera donc un rectangle de hauteur fixe mais de largeur et de position dépendant des dates (en mois) du début et de la fin du mandat (une template faisant la conversion existe déjà). Soyons un peu plus précis (on peut regarder le code généré pour se faire une idée):
      • On commence par créer le canevas SVG que l'on prend un peu plus grand que là où seront les mandats (862 de large), et on choisit 70 de haut (ceci est assez arbitraire, mais cela donne un bon résultat).
      • On ajoute un title à l'image, par exemple en reprenant le nom du minstre concerné.
      • On crée ensuite un groupe (g) légèrement décalé du coin pour que ce soit joli et sans qu'on doive se poser la question des coordonées par raport au canevas complet.
      • On crée ensuite un rectangle pour chaque mandat; bien que ce soit un rectangle, il est plus aisé vu les coordonées dont nous disposons de tracer un chemin qui aura une forme rectangulaire (une hauteur de 30 semble bien). On pourra commencer par tous les remplir de rouge.
      • On va maintenant s'arranger pour que chaque mandat soit d'une couleur différente de son voisin. Pour cela, on définit dans l'entête différentes "couleurs" mandat0, mandat1, etc qui sont des dégradés à une seule couleur (on aurait pu faire effectivement un dégrdé mais vu la taille à l'écran ce n'est pas très lisible). Il faut maintenant faire en sorte que chaque mandat appelle une couleur différente. Par exemple, le n-ième mandat peut être rempli de la couleur n mod 7 puisqu'on dispose de 7 couleurs de 0 à 6.
      • On définit maintenant la "légende" dans un groupe tout au début de la page, et on la réutilise pour chaque "carrière". On peut soit le faire à la main (copier-coller depuis le le html généré) ou (Bonus) créer une template qui prend en paramètre une année et retourne l'élément text correspondant (le y est constant, seul le x est à calculer, mais il est à utiliser également dans la définition de la rotation).

Corrigé

  1. Question1.xq
  2. Question2.xsl