TD 7: Schematron
Rappels / Outils
- Chapitre de cours: Schematron
- Valider un XML avec un schéma: xmllint --noout --schema votre_schema.xsd fichier.xml
- Les TDs sur les schémas (TD 3, 4, 5) peuvent être utiles pour la question 2.2.
- Valider un XML avec un schematron: voir Exo 1.
Exercice 1
On considère le modèle incomplet de schematron ci-dessous (télécharger: 1.sch):
<?xml version="1.0" encoding="utf-8"?>
<sch:schema queryBinding="xslt" schemaVersion="ISO19757-3"
xmlns:sch="http://purl.oclc.org/dsdl/schematron">
<sch:pattern>
<sch:rule context="time">
<sch:let name="hour" value="number(substring(.,1,2))"/>
<sch:let name="min" value="number(substring(.,4,2))"/>
<sch:let name="sec" value="number(substring(.,7,2))"/>
<!-- Test si l'heure est de la forme HH:MM:SS -->
<sch:assert test="string-length(.) = 8 and substring(.,3,1) = ':' and
substring(.,6,1) = ':'">
...
</sch:assert>
<sch:assert test="$hour >= 0 and $hour <= 23">
...
</sch:assert>
<sch:assert test="$min >= 0 and $min <= 59">
...
</sch:assert>
<sch:assert test="$sec >= 0 and $sec <= 59">
...
</sch:assert>
</sch:rule>
</sch:pattern>
<sch:pattern>
<sch:rule context="film">
<sch:report test="count(spectateurs/nom) > 3">
...
</sch:report>
<sch:report test="string-length(titre) > 42 and count(titre) < 2">
...
</sch:report>
</sch:rule>
</sch:pattern>
</sch:schema>
- Complétez ce schematron dans un fichier 1.1.sch en écrivant les messages d’erreur (à la place des "...")
De plus, faites en sorte que vos messages d'erreur incluent la valeur fautive,
avec <sch:value-of select="."/> et des variantes
RENDU: 1.1.sch
- Écrivez un document 1.2.xml le plus complet possible validé par le schematron.
Vérifiez en faisant:
rm 1.tar.gz; wget --no-cache http://fabien.viger.free.fr/xml/td7/1.tar.gz && tar xf 1.tar.gz
# Vous pouvez ajouter --html en premier argument ci-dessous pour un rapport en HTML.
./apply_schematron.sh 1.1.sch 1.2.xml
RENDU: 1.2.xml
- Pour chacun des 6 messages d'erreur, dans l'ordre, donnez un document XML qui affiche uniquement
ce message d'erreur lors de la validation par le schematron.
Vérifiez bien chacun de vos fichiers à l'aide de la commande ./apply_schematron.sh.
RENDUS:
1.3.1.xml,
1.3.2.xml,
1.3.3.xml,
1.3.4.xml,
1.3.5.xml,
1.3.6.xml
Exercice 2
Jean-Christophe organise régulièrement des soirées jeu chez lui. Il a invité
des gens qu’il ne connait pas. Chaque invité remplit une petite fiche demandant
ses nom, prenom, pseudo, age, sexe
et date_de_naissance (au format AAAA-MM-JJ).
Pendant une soirée, tout le monde jouera au même jeu, mais il pourra y avoir plusieurs tables de jeu.
Jean-Christophe s'occupe de la répartition des gens par tables.
Jean-Christophe écrit toutes ces informations dans un fichier XML, qui devra vérifier les contraintes suivantes:
- On veut connaître au moins l’identité d’une personne ou son pseudo
- Jean-Christophe ne tient pas à savoir le nom d’une personne qui lui cache son prénom.
- On veut connaître le sexe et l'âge d'une personne.
- Chaque table contient au plus cinq personnes.
- Chaque personne doit avoir au moins dix ans au jour du jeu, mais ne doit pas dépasser dix
fois l’âge spécifié sur la boîte du jeu utilisé ce soir-là.
- Chaque table doit être mixte.
Exemple de fichier XML valide
Exemple de fichier XML invalide
Autre exemple de fichier XML invalide
- Quelles contraintes pouvez-vous traduire avec un schéma? Pour lesquelles aurez-vous besoin d’utiliser schematron?
RENDU: 2.1.txt avec une toute petite explication (citer au moins une contrainte pour chaque cas)
- Écrivez un schema 2.2.xsd le plus complet possible et Vérifiez-le:
rm 2.tar.gz; wget --no-cache http://fabien.viger.free.fr/xml/td7/2.tar.gz && tar xf 2.tar.gz
./2.test_xsd.sh
RENDU: 2.2.xsd
- Écrivez un schematron 2.3.sch qui valide toutes les contraintes restantes (pas besoin de revérifier ce que le schema vérifie déjà), sauf celles sur la mixité des tables et sur la date_de_naissance.
Vérifiez-le:
./2.test_schematron.sh
RENDU: 2.3.sch
- Copiez votre schematron dans 2.4.sch et ajoutez-y la validation de la mixité des tables. Vérifiez avec:
./2.test_schematron.sh --medium
RENDU: 2.4.sch
- Copiez votre schematron dans 2.5.sch et ajoutez-y la validation de date_de_naissance: si elle est donnée, alors elle doit être cohérente avec age (selon la date annoncée dans <jeu>).
Vérifiez avec:
./2.test_schematron.sh --hard
RENDU: 2.5.sch