Séances 4 et 5 : Introduction à XML, XSLT et XPath

publicité
TP Compilation / XML
Séances 4 et 5 : Introduction à XML, XSLT et XPath
(Miage L3 – Mars/Avril 2006)
Le but de ce TD est de vous initier à l'écriture de documents XML (eXtensible Markup Language) bien formés et valides, et à
l'écriture de feuilles de style XSLT (eXtensible Stylesheet Language Transformation) utiles pour indiquer comment présenter
les informations contenues dans les documents XML.
Les trois étapes de ce TD sont :
1. l'installation de Xalan qui est un processeur XSLT qui transforme les documents XML en texte brut, HTML ou autres
formats XML ;
2. la définition de la structure de données de notre application et la création d'un document XML conforme à cette
structure et à la syntaxe XML ;
3. l'écriture de feuilles de style XSLT pour produire des pages HTML.
Si vous utilisez Emacs ou XEmacs, pensez à utiliser le mode sgml (M-x sgml-mode) lors de l'écriture des fichiers XML
pour vous faciliter l'insertion d'éléments.
Les recommandations de XML, XSLT et XPath se trouvent sur le site du W3C à :
Pour avoir des exemples, vous pouvez aussi consulter :
http://www.w3c.org,
http://www.zvon.org.
Installation et Configuration
1. Pour pouvoir utiliser java, javac, etc ; vérifiez (echo $PATH) que votre variable d'environnement PATH contient
le chemin vers le compilateur java
/usr/local/java/jdk1.5.0_02/bin
(j2sdk1.4.2_01est donné ici à titre d’exemple et peut être différent sur votre système)
Sinon :

si vous utilisez un shell de la famille bash, lancez la commande :
PATH=$PATH:/usr/local/java/ jdk1.5.0_02/bin
(attention pas de blanc ni avant, ni après le signe ‘=’)

ou si vous utilisez un shell de la famille csh :
setenv PATH $PATH:/usr/local/java/ jdk1.5.0_02/bin
2. Vérifiez que vous avez accès aux répertoires qui contiennent l’outil Xalan:
/usr/share/java et /usr/share/xalan-j2
sinon dans votre répertoire ~/compil/td4, ~récupérez la version 2.7.0 de l'outil Xalan pour Java d'Apache puis
installez-la.
wget http://apache.crihan.fr/dist/xml/xalan-j/binaries/xalan-j_2_7_0-bin.tar.gz
tar xzvf xalan-j_2_7_0-bin.tar.gz

Ajoutez ensuite les classes de Xalan et de Xerces (parseur XML) à votre CLASSPATH pour que l'interpréteur de
byte-codes sache où elles se trouvent.
Jean-Pierre Lips
Mars-Avril 2006
En fonction de ce qui a été fait au paragraphe précédent, si vous avez accès à la version locale sur /usr/local/ entrez la
commande suivante :

si vous utilisez un shell de la famille bash :

CLASSPATH=$CLASSPATH\
:/usr/share/java/xml-commons-apis.jar\
:/usr/share/xalan-j2/xalan-j2-samples.jar\
:/usr/share/java/xalan-j2.jar\
:/usr/lshare/java/xerces-j2.jar
ou si vous utilisez un shell de la famille csh :
setenv CLASSPATH $CLASSPATH\
:/usr/share/java/xml-commons-apis.jar\
:/usr/share/xalan-j2/xalan-j2-samples.jar\
:/usr/share/java/xalan-j2.jar\
:/usr/lshare/java/xerces-j2.jar
Sinon :
si vous utilisez un shell de la famille bash :
CLASSPATH=$CLASSPATH\
:/u/iupl3/login/compil/td4/xalan-j_2_7_0/bin/xml-apis.jar\
:/u/iupl3/login/compil/td4/xalan-j_2_7_0/bin/xalansamples.jar\
:/u/iupl3/login/compil/td4/xalan-j_2_7_0/bin/xalan.jar\
:/u/iupl3/login/compil/td4/xalan-j_2_7_0/bin/xercesImpl.jar

ou si vous utilisez un shell de la famille csh :
setenv CLASSPATH $CLASSPATH\
:/u/iupl3/login/compil/td4/xalan-j_2_7_0/bin/xml-apis.jar\
:/u/iupl3/login/compil/td4/xalan-j_2_7_0/bin/xalansamples.jar\
:/u/iupl3/login/compil/td4/xalan-j_2_7_0/bin/xalan.jar\
:/u/iupl3/login/compil/td4/xalan-j_2_7_0/bin/xercesImpl.jar
(Note : le ‘\’en fin de ligne après jar signifie que la ligne continue
sans blanc sur la ligne suivante : les répertoire sont concaténés sans
blanc ni avant, ni après le caractère de concaténation ‘:’)
Écriture de documents XML bien formés et valides
L'application utilisée pour ce TD est un agenda. Il faut, tout d'abord, réfléchir aux différentes données contenues dans un
agenda pour pouvoir définir la structure des données. Avec cette définition, la conformité (validité) des données pourra être
vérifiée avant qu'elles ne soient traitées par l'application.
Le langage XML qui est adapté pour les échanges de données entre applications sera utilisé pour encoder les données de
l'agenda. Pour décrire la structure des documents XML (données) de l'agenda et permettre leur vérification, vous écrirez une
DTD (Document Type Definition). Une DTD peut être vue comme une définition d'arbre de syntaxe abstraite. Elle indique les
différents éléments possibles, leur ordre, leur fréquence, etc. Elle définit la grammaire de votre langage métier.
Vous pouvez trouver une vue synthétique de la syntaxe XML (donc DTD) à :
http://www.mulberrytech.com/quickref/XMLquickref.pdf.
1. Définissez la structure de données du carnet d'adresses de votre agenda en utilisant le format DTD vu en cours. Pour
chaque personne du carnet, il faudra au minimum :
Jean-Pierre Lips
Mars-Avril 2006
1.
2.
3.
4.
l'identifier de manière unique,
son nom et son prénom,
son ou ses numéros de téléphone,
son ou ses emails.
Envisagez différentes possibilités de DTDs, en vous demandant pour chacun des cas, quel est l'avantage d'une solution
par rapport à une autre.
2. Écrivez un document XML conforme aux règles de syntaxe de XML (document bien formé) et à la structure de
données de votre carnet d'adresses (document valide).
3. Testez que votre DTD est correctement écrite et que votre document est bien formé et valide.
Utilisez : java Validate fichier.xml
ou la page Web : http://www.stg.brown.edu/service/xmlvalid/
Pour cette dernière, il faut mettre la DTD dans votre répertoire Web (~/www) et son URL dans le DOCTYPE du
prologue du document à tester.
<!DOCTYPE nomElementRacine SYSTEM 'http://clio.unice.fr/ ~ login/fichier.dtd'>
4. Enrichissez votre agenda de tâches : rendez-vous, cours, etc. Ces tâches auront pour informations minimales :

la date, l'heure, la durée ;

la priorité : grande, moyenne ou faible ;

le lieu ou la salle selon le type de la tâche ;

la personne avec qui on a rendez-vous ou le prof ;

une description ou une matière.
Ajoutez des tâches à votre fichier XML en respectant le format indiqué dans la DTD. Vérifiez que le tout est bien
formé et valide.
5. Pour que nous ayons tous la même structure de données, écrivez la DTD à utiliser en fonction du fichier XML
agenda.xml et de la feuille de style xml2html-agenda.xsl donnés.
wget http://deptinfo.unice.fr/~lips/Miage_L3/Compil_XML/TDs/TD4_5/Fournitures/agenda.xml
wget http://deptinfo.unice.fr/~lips/Miage_L3/Compil_XML/TDs/TD4_5/Fournitures/xml2html-agenda.xsl
Testez-la avec le document agenda.xml fourni auquel vous aurez ajouté l'association avec cette DTD.
Cette structure de données n'est pas très ''propre'' pour l'élément event. Changez légèrement la définition de cet
élément pour éliminer ce problème. Pensez aussi à changer le document XML avant de tester.
Écriture de feuilles de style XSLT
Cette partie de TD s'intéresse à la manipulation des données du fichier agenda.xml pour produire d'autres formats
d'affichages (ici HTML) que le XML qui est très verbeux et peu lisible. Pour définir ces règles de formatage des éléments,
nous utiliserons le langage XSLT.
Une vue synthétique de la syntaxe XSLT peut être obtenue à :
http://www.mulberrytech.com/quickref/XSLT_1quickref-v2.pdf
et des exemples à :
http://www.zvon.org/xxl/XSLTreference/Output/index.html.
Afin de réduire la description des exercices et pour éviter tout problème de mauvaise interprétation des énoncés, vous pouvez
consulter les fichiers HTML des résultats attendus dans le répertoire :
http://deptinfo.unice.fr/~lips/Miage_L3/Compil_XML/TDs/TD4_5/Fournitures/Exemples/
Jean-Pierre Lips
Mars-Avril 2006
Tout d'abord, modifiez la feuille de style xml2html-agenda.xsl en fonction des modifications effectuées dans la DTD
puis testez-la :
java org.apache.xalan.xslt.Process -in agenda.xml
-xsl xml2html-agenda.xsl
-out file.html
Les actions conditionnelles
Vous pouvez constater que la sortie produite en standard par la feuille de style xml2html-agenda.xsl n'affiche pas
correctement la durée. Dans le cas où l'on a un pluriel, il manque le "s" à heure.
Ajoutez cette fonctionnalité afin d'obtenir le résultat suivant : if.html
La deuxième étape consiste à afficher un rendez-vous ou un cours d'une couleur différente suivant sa priorité (rouge pour
"high", orange pour "medium", vert pour "low").
Le résultat est visible dans le fichier : choose.html
La sélection et le tri
Jusqu'à présent, l'ensemble des informations concernant les rendez-vous et les cours sont mélangées. Nous souhaitons
maintenant avoir deux tableaux, l'un avec les cours, l'autre avec les rendez-vous. Dans la foulée, nous supprimons le tableau
avec les contacts.
Vous pouvez voir le résultat dans le fichier separe.html
Nous souhaitons maintenant que les événements et les cours soient triés suivant leur date et heure : les cours par ordre
chronologique décroissant, les événements par ordre chronologique croissant.
Vous pouvez voir le résultat dans le fichier tri1.html
Nous voulons maintenant trier les cours sur leur nom (de manière croissante) puis sur l'ordre chronologique inverse. Voir le
fichier résultat tri2.html
Numérotation automatique
Ajoutez la numérotation de chacun des cours et des événements comme présenté dans l'exemple number.html : un numéro
devant chacun des cours, une lettre devant chacun des rendez-vous.
Modification des données
Vous avez la possibilité de travailler non seulement sur la structuration des informations mais aussi sur les informations ellesmêmes. Afin d'illustrer ce point, affichez l'heure sans les secondes (substring.html).
Calcul du volume horaire
Calculez le volume horaire pour chacun des enseignements de cours et construisez un tableau avec ces résultats comme vous le
montre l'exemple foreach.html
Pour les plus rapides
Regroupez les cours par journée afin de produire un "emploi du temps".
Jean-Pierre Lips
Mars-Avril 2006
Téléchargement