TUTORIELS 
Lire et écrire une DTD

Page 1 | 2

La maîtrise des standards du Web passe par une bonne connaissance des Définitions de Types de Document. Les clefs pour s'y retrouver.
 (19 décembre 2003)
 

Forums
* Discutez en sur les forums
<!ELEMENT % xxx (yyy)>
Cette balise permet de déclarer un élément nommé "xxx", dont le contenu sera de type "yyy".
Notre exemple ci-dessus sera à interprété de la manière suivante : "l'élément bouton ne peut pas se trouver à l'intérieur des éléments A, INPUT, SELECT...".
Le tiret placé devant la parenthèse permet d'interdire la présence dans ces éléments. S'il y avait eu à la place un +, la présence aurait été autorisée (au moins une fois), tandis que s'il n'y avait rien eu, la pré
sence aurait été obligatoire au plus une fois).
Il existe une dizaine d'autres "règles" applicables ici : * pour "zéro, un ou plus", ? pour "zéro ou une fois"...

%flow est elle-même une entité, qui contient encore d'autres entités... Il faut donc avoir les idées claires pour dénouer certains "fils" de la DTD...

Les deux tirets entre BUTTON et (%flow;) indiquent que l'élément doit obligatoirement avoir une balise d'ouverture ET une balise de fermeture. S'il y avait à la place un tiret et un O (" - O "), la balise de fermeture pouvait être oubliée, et s'il y avait eu deux O à la place des deux tirets (" O O "), les deux balises pouvaient être omises. Par exemple:

<!ELEMENT BODY O O (%block;|SCRIPT)+ +(INS|DEL) >

Il peut ne pas y avoir de BODY.

<!ATTLIST aaa bbb ccc ddd >
On définit ici les attributs possibles dans les balises. Un attribut se trouve au coeur de la balise : <a href="#">.

aaa : le nom auquel s'applique la règle que l'on déclare ici. Exemple : A.

bbb : le nom de l'attribut déclaré ici (il peut y en avoir plusieurs à la fois, notamment en faisant appel aux entités). Exemple: HREF.

ccc : le type de l'attribut, ou une liste explicite des types possibles. Exemple : (top|middle|bottom|baseline).

ddd : #IMPLIED si l'attribut a une valeur implicite (ou par défaut), #REQUIRED s'il est requis, ou #FIXED quand il doit avoir une valeur donnée.

Ecrire une DTD
Maintenant que nous connaissons les grandes lignes du fonctionnement d'une DTD, nous pouvons prendre directement un fichier XML (par exemple), et construire sa DTD.

<?xml version="1.0"?>
  <!DOCTYPE mmedia SYSTEM "http://www.site.com/mmedia.dtd">
  <media>
    <cd>
      <artiste>Graham Coxon</artiste>
      <titre>The Kiss Of Morning</titre>
      <pistes nbr="13">
        <piste num="01">Bitter Tears</piste>
        <piste num="02">Escape Song</piste>
     [etc...]
      </pistes>
    </cd>
  </media>

Une DTD valide ce fichier XML pourrait être de la forme :

<!ELEMENT media ( cd*, mp3*, k7*, dat*, md* ) >
<!ELEMENT cd ( artiste, titre, pistes ) >
<!ELEMENT k7 ( artiste, titre, pistes ) >
<!ELEMENT mp3 ( artiste, titre, pistes ) >
<!ELEMENT dat ( artiste, titre, pistes ) >
<!ELEMENT md ( artiste, titre, pistes ) >
<!ELEMENT artiste ( #PCDATA ) >
<!ELEMENT titre ( #PCDATA ) >
<!ELEMENT pistes ( piste+ ) >
<!ATTLIST pistes nbr #CDATA >
<!ELEMENT piste ( #PCDATA ) >
<!ATTLIST piste num #CDATA >

C'est suffisamment complet pour le moment, nous verrons dans de prochains articles comment nous pouvons préciser le champ des possibles de notre fichier XML...

Page 1 | 2

 
[ Xavier BorderieJDNet
 
Accueil | Haut de page