DTD Sylvain Salvati email : salvati@loria.fr
Qu'est-ce qu'une DTD? Une DTD (Document Type Definition) permet de définir une structure type de document XML. Il s'agit d'une grammaire qui décrit la façon de construire les documents XML qu'elle valide.
Pourquoi utiliser une DTD? Les documents valides présentent un double intérêt : Cela permet de n'avoir pas à réinventer des structures complexes disponibles et déjà largement utilisées : une DTD est réutilisable Un document validé possède des propriétés intéressantes : Il est bien formé Il respecte la structure définie par la DTD Toutes les références des entité peuvent être résolues.
Pourquoi utiliser une DTD? Notamment, on peut construire une application qui sache traiter tous les documents valides contre une certaine DTD, et tester si un document est valide avant de le lui faire traiter. C'est le cas des documents HTML qui sont valides contre une DTD qui définit les balises et qui ne sont largement utilisés pour afficher des documents dans les navigateurs.
DTD et styles Les feuilles de style sont construites à partir de la structure du document, donc pour les documents valides à partir de la DTD. Ainsi, une feuille de style prévue pour une structure de document particulière (une DTD particulière) peut être utilisée pour tous les documents ayant cette structure (tous les documents validés par cette DTD). Dans le cas où le document est seulement bien formé, il faut faire une feuille de style seulement pour lui : il faut autant de feuille de style que de documents bien formés
Contenu d'une DTD Une DTD peut contenir : Des déclarations d'entités générales Des déclarations d'entités paramètres Des déclarations d'éléments Des déclarations de listes d'attributs Des commentaires
Les entités générales Il existe deux types d'entité ; les entités internes et les entités externes. Les entités internes permettent de définir des abréviations : <!ENTITY nom-entité ''valeur de remplacement''> On utilise un entité de la façon suivante : &nom-entité;
Entités générales <!ENTITY cp ''�A9; Editions Acte Sud ''> &cp; sera représenté à l'écran par : © Editions Acte Sud On peut utiliser des entités internes pour définir d'autres entités internes.
Les entités générales Elles permettent aussi de faire référence à des fichiers qui se trouve à une certaine URL : <!ENTITY nom-entité SYSTEM ''URL''> <!ENTITY chapitre-1 SYSTEM ''./chap1.xml''> Cette référence permet à chaque fois que l'on tape &chapitre-1; dans le document XML d'y insérer le contenu du fichier chap1.xml.
Les entités générales On peut utiliser des entités générales aussi directement dans un document XML de la façon suivante : <!DOCTYPE racine SYSTEM "dtd.dtd" [<!ENTITY nom "valeur">]>
Les entités paramètres Elles foncionnent comme les entités générales, mais ne sont utilisables que dans la DTD où elles sont déclarées. <!ENTITY % nom-entité "valeur"> Pour les utiliser, il faut écrire :%nom-entité;
Les éléments Les déclarations d'élément permettent de définir les balises ainsi que la façon dont elles doivent s'organiser dans l'arbre XML. Elle est de la forme suivante : <!ELEMENT nom modèle> Le nom correspond au nom de la balise. Le modèle décrit le contenu que doit avoir la balise ainsi définie.
Modèle d'un élément Le modèle de contenu peut autoriser la dréation d'éléments qui contiendront : Un ou des éléments fils spécifiés; Des données représentées par un flot de caractèes; Un mélange de données et d'éléments fils spécifiés; Un mélange arbitraire de donnée et d'éléments;
Modèle d'un élément. Un modèle peut-être une séquence de fils ordonnés : (fils_1, fils_2, ..., fils_n) Ainsi : <!ELEMENT chapitre (titre, intro, section)> spécifie que toute balise chapitre devra être employée comme il suit : <chapitre><titre>...</titre><intro>...</intro><se ction>...</section></chapitre>
Modèle d'un élément Il peut aussi s'agir d'une séquence non ordonnée : (fils_1 | fils_2 | ... | fils_n) Ainsi <!ELEMENT date (annee | mois)> spécifie que toute balise date doit être utiliser de l'un des deux façons suivantes : <date><mois>...</mois><annee>...</annee></d ate> <date><annee>...</annee><mois>...</mois></d ate>
Modèle d'un élément On peut utiliser des quantificateur pour autoriser des répétitions : P? signifie que l'on peut utiliser l'élément P zéro ou une fois. P* signifie que l'on peut utiliser l'élément P zéro, une ou plusieurs fois. P+ signifie que l'on peut utiliser l'élément P une ou plusieurs fois. Ainsi <!ELEMENT chapitre (titre, intro, section+)> signifie qu'un chapitre peut contenir une ou plusieurs sections.
Modèle d'un élément On peut imbriquer les déclarations : <!ELEMENT chapitre (titre, intro, (titre-section, devel)+)> signifie que la balise chapitre doit être utiliser comme suit : <chapitre> <titre>...</titre><intro>...</intro> <titre-section>...</titre- section><devel>...</devel> ... </chapitre>
Modèle d'un élément Pour spécifier qu'un élément doit contenir un flot de caractère, il suffit d'écrire : <!ELEMENT nom (#PCDATA)> On peut incorporer cette déclaration dans un modèle plus élaboré : <!ELEMENT p (#PCDATA, titre, corps)>
Modèle d'un élément Pour spécifier qu'un élément doit obligatoirement être vide, il suffit d'écrire : <!ELEMENT nom EMPTY> Pour spécifier qu'un élément peut contenir n'importe quel type d'arbre, il suffit d'écrire : <!ELEMENT nom ANY>
Listes d'attributs Pour chaque élément on peut spécifier une liste d'attributs bien précise. Celle-ci a la forme suivante : <!ATTLIST nom-élément nom-attribut_1 type-attribut_1 valeur-par- défaut_1 ... nom-attribut_n type-attribut_n valeur-par- défaut_n >
Les types des attributs CDATA signife que la valeur de l'attribut sera une chaîne de caractère ID la valeur de l'attribut doit être unique pour cette instance de l'élément. IDREF référence à l'élément avec un attribut ID ayant même valeur que IDREF IDREFS Liste de plusieurs IDREF séparés par des espaces. NMTOKEN ou NMTOKENS permettra à l'attribut de prendre comme valeur le nom d'un token, ou de plusieurs, c'est-à-dire un ou des noms.
Les types des attributs NMTOKEN jeton de nom (i.e. chaîne de texte conforme aux règles de nom de XML) NMTOKENS liste de NMTOKEN séparés par des espaces ENTITY nom d'une entité prédéfinie ENTITIES listes d'entités prédéfinies séparées par des espaces
Les types des attributs Le type d'un attribut peut aussi être une liste de valeurs, si tel est le cas, on ne peut donner pour valeur à l'attribut que l'un des éléments de cette liste. Une telle liste s'écrit comme il suit : (valeur_1 | valeur_2 | ... | valeur_n)
Les valeurs par défaut #REQUIRED signifie que l'attribut doit obligatoirement être déclaré #IMPLIED signifie que l'attribut est facultatif et n'a pas de valeur par défaut particulière #FIXED "val" l'attribut est facultatif, mais si il est présent il ne peut prendre que "val" pour valeur. "val" l'attribut est facultatif, et si il n'est pas présent on considère que sa valeur est "val"