TP 5, 21/10/2009

Par Benoît Valiron <benoit.valiron [at] monoidal.net> et Jean Baptiste FADDOUL <jean-baptiste.faddoul [at] xrce.xerox.com>

  1. Reprenez les exercices du TD5 (plus les deux exercices non fait, les 4 et 5). Validez tout les xml selon leurs schémas Relax-NG, en suivant les instructions ici.

    On donne ici les corrections des exercices 4 et 5 du TD, pour information.

    Un schéma de validation Relax NG au format compact pour l'exercice 4 est le suivant :

    start = element bio {
      element nom { text },
      para
    }
    
    para = (
       element i { para } |
       element b { para } |
       text
    )*

    Je vous laisse le soin de faire la traduction automatique vers le Relax-NG compact.

    Une DTD pour ce format serait comme suit :

    <!ELEMENT bio (#PCDATA | nom | b | i)*>
    <!ELEMENT b (#PCDATA | b | i)*>
    <!ELEMENT i (#PCDATA | b | i)*>
    

    Le problème que l'on rencontre est que l'on ne peut pas imposer en DTD d'avoir d'abord un élément, puis du texte. Soit il n'y a que des éléments, auquel cas on peut imposer un ordre, soit il y a un contenu mixte, auquel cas on ne peut rien dire de spécial.

    Pour l'exercice 5, on aurait le format suivant :

    element météo {
       element relevé {
          attribute date { text } &
          element ville { text } &
          element tempMax { attribute unit { text }? , text } &
          element tempMin { attribute unit { text }? , text }
       }*
    }
    

    Le problème pour un fichier de validation DTD est que l'on ne peut pas dire "tous ces éléments seulement une fois, mais dans n'importe quel ordre". On peut ceci dit écrire

    <!ELEMENT météo (relevé)*>
    <!ELEMENT relevé (ville|tempMax|tempMin)*>
    <!ATTLIST relevé date CDATA #REQUIRED>
    <!ELEMENT ville (#PCDATA)>
    <!ELEMENT tempMax (#PCDATA)>
    <!ELEMENT tempMin (#PCDATA)>
    <!ATTLIST tempMax unit CDATA #IMPLIED>
    <!ATTLIST tempMin unit CDATA #IMPLIED>
    

    Ce fichier est correct, mais peu précis : on peut avoir plusieurs instances de chaque élément...

  2. Dans les exercices qui contiennent une feuille de validation DTD, valider les xml selon leurs DTDs, soit par le .jar, soit par le site du w3schools (comme d'hab, ça n'est officiellement supporté que si vous êtes sous Internet Explorer).

  3. Une fois que vous avez tout validé, vous pouvez tester l'extraction des schémas et la traduction entre les schémas:

    1. Reprenez les fichiers .xml des exercices du TD5: Utilisez trang pour faire l'extraction des schémas Relax-NG à partir des documents xml, en suivant les instructions ici. Comparez les schéma Relax-NG générés automatiquement avec les schémas que vous avez écrit.

      Vous noterez que vous n'obtenez pas la même chose : deux balises define et ref sont utilisées. Vérifiez que les fichiers en format XML rng obtenus sont tout de même valides.

      Les deux balises define et ref vont être détaillées dans le cours de demain ; elles sont néanmoins assez simple à comprendre : elles permettent de définir des morceaux de schéma et leur réutilisation.

    2. Après, traduisez les schémas Relax-NG générés automatiquement en schémas DTD.

      Pour certains exercices, le traducteur n'y arrive pas : pouvez-vous comprendre ce qui ne va pas ? Modifiez les schémas pour que cela marche (par exemple en changeant le nom d'une balise, ou en modifiant les interleave par des group).

    3. Reprenez les schémas Relax-NG écrits à la main, faites la traduction de Relax-NG vers DTD. Obtenez-vous la même chose ?

      Toujours avec les schémas Relax-NG écrit à la main, traduisez du format compact au format XML, et vis-versa.

    4. Reprenez les schémas DTD écrits à la main, faites la traduction de DTD vers Relax-NG .

      De nouveau, vous devez retrouver des balises define et ref.