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

Le Moyen-Âge du développement de site Web a fait croire à nombre de pionniers que le HTML pouvait s'écrire de manière assez libre, le navigateur se chargeant de rattraper les bêtises et s'efforçant d'afficher la page quand même.
C'est évidemment totalement faux, cette croyance n'étant due qu'à l'incapacité des concepteurs de navigateurs de gérer correctement et complètement les spécifications des langages Web. Une erreur menant à l'autre, le développeur doit maintenant se battre pour faire fonctionner un site dans les principaux navigateurs (ou les plus populaires), tandis ces mêmes navigateurs se voient obligé d'offrir deux supports pour la lecture de code HTML : le mode Strict, pour les sites respectueux des spécifications (repérables par l'usage de la balise DOCTYPE en tête de document), et un mode "Quirks" (pour Mozilla), prenant en charge du mieux possible ce que le créateur du site (ou son éditeur WYSIWYG) veut bien lui donner à traiter.

En clair
Une DTD (Déclaration de Type de Document) définit la structure d'un document, les éléments et attributs qui y sont autorisés, et le type de contenu ou d'attribut permis. Elle fait la différence entre un document bien formé et un document valide : le premier répond aux exigences de la spécification, tandis que le second se conforme strictement aux règles établies par la DTD à laquelle il fait référence.

L'intérêt
Comprendre les arcanes d'une DTD n'est pas une tâche des plus simples, mais comme souvent quand on se donne le peine d'apprendre quelque chose, les bénéfices tirés peuvent en être substantiels.
Savoir lire une DTD est quasiment requis pour toute personne devant produire du code (XML, (X)HTML...) valide, simplement parce que la DTD est en fait une référence beaucoup plus rapide à parcourir que les longues spécifications publiées par le W3C, et leurs flopées de MUST, SHOULD, MAY et autres. Une DTD donne clairement ce que le navigateur est en droit d'attendre. En espérant qu'à terme tous les navigateurs se conforment aux spécifications, savoir aujourd'hui lire une DTD permet de prendre de l'avance, d'être "forward compatible".
Savoir écrire une DTD peut se révéler nécessaire dès que vous commencer à travailler avec des documents de types XML, notamment si vous créez vos propres fichiers. Avoir une DTD vous permet de formaliser le squelette de votre fichier, et de rendre l'adoption de votre format beaucoup plus facile pour les autres développeurs. Toute spécification de document de type XML qui se veut être sérieux se doit d'être accompagné d'une DTD complète...
Accessoirement, avoir une DTD à sa disposition permet, grâce à certains logiciels comme XML Spy, de vérifier qu'un document XML est bien conforme à la manière dont ont l'a défini...

Aperçu d'une DTD
Nous allons apprendre à lire grâce à la DTD de la spécification HTML 4.01, spécification qu'a priori tous nos lecteurs connaissent, donc plus simple à aborder...

En la parcourant, on note une profusion de balises <!ENTITY > et <!ELEMENT >, les secondes étant parfois accompagnées de <!ATTLIST >. Ce sont là les trois composants de base d'une DTD. Les quelques autres briques de base sont #PCDATA et #CDATA.
Ces deux derniers sont utilisés pour définir le type du contenu de l'élément. Les éléments avec un contenu de type #PCDATA (pour "parsed character data") verront ce contenu interprété par le navigateur, tandis qu'avec #CDATA, le contenu sera pris tel quel. Cela signifie que dans le premier cas, les possibles balises seront traitées comme telles, tandis que dans le second, elle seront prises comme une simple chaîne de caractères...

<!ENTITY % xxx "yyy | zzz" >
Cette balise permet de déclarer une entité nommée "xxx". Une entité est une sorte de "macro" ou un raccourci, qui permet de déclarer plusieurs paramètres utilisables en appelant simplement l'entité plus après dans le document. On trouve dans la DTD de nombreuses variantes de ceci :

<!ENTITY % formctrl "INPUT | SELECT | TEXTAREA | LABEL | BUTTON">

Puis, un élément y faisant référence :

<!ELEMENT BUTTON - - (%flow;)* -(A|%formctrl;|FORM|FIELDSET) >

Ce qui sera compris comme :

<!ELEMENT BUTTON - - (%flow;)* -(A|INPUT | SELECT | TEXTAREA | LABEL | BUTTON|FORM|FIELDSET) >

Page 1 | 2

 
[ Xavier BorderieJDNet
 
Accueil | Haut de page