TD 7: Schematron

Rappels / Outils


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 &gt;= 0 and $hour &lt;= 23">
        ...
      </sch:assert>
      <sch:assert test="$min &gt;= 0 and $min &lt;= 59">
        ...
      </sch:assert>
      <sch:assert test="$sec &gt;= 0 and $sec &lt;= 59">
        ...
      </sch:assert>
    </sch:rule>
  </sch:pattern>

  <sch:pattern>
    <sch:rule context="film">
      <sch:report test="count(spectateurs/nom) &gt; 3">
        ...
      </sch:report>
      <sch:report test="string-length(titre) &gt; 42 and count(titre) &lt; 2">
        ...
      </sch:report>
    </sch:rule>
  </sch:pattern>

</sch:schema>
  1. 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

  2. É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

  3. 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:

Exemple de fichier XML valide
Exemple de fichier XML invalide
Autre exemple de fichier XML invalide
  1. 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)

  2. É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

  3. É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

  4. 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

  5. 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