Tutoriel DTD

Miloslav Nic

Traducteur

Eric Le Carre

Les définitions de types de documents (DTD) sont décrites dans la norme XML 1.0. Ce tutoriel présente les caractéristiques de base des DTD à l'aide de nombreux exemples.
Version HTML/ZIP ♪

- Titre : Tutoriel DTD

- Auteur : Miloslav Nic

- Traducteur : Eric Le Carre

- Parution : 28 décembre 2012

- Licence : Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2012 Miloslav Nic. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- I. Exemple 1

- II. 2. Exemple 2

- III. 3. Exemple 3

- IV. 4. Exemple 4

- V. 5. Exemple 5

- VI. 6. Exemple 6

- VII. 7. Exemple 7

- VIII. 8. Exemple 8

- IX. 9. Exemple 9

- X. 10. Exemple 10

- XI. 11. Exemple 11

- XII. 12. Exemple 12

- XIII. 13. Exemple 13

- XIV. 14. Exemple 14

- XV. 15. Exemple 15

I - Exemple 1

Un document XML est valide s'il est associé à une définition de type de document et s'il respecte les contraintes qui y sont définies. La définition de type de document doit apparaître avant le premier élément du document. Le nom qui suit le mot DOCTYPE dans la définition de type de document doit correspondre au nom de l'élément racine.

<!ELEMENT tutorial (#PCDATA)>

Un document ne peut comporter qu'un seul élément racine tutorial qui peut contenir du texte

Valide

<tutorial>Ceci est un document XML</tutorial>

Document valide comportant du texte

Valide

<tutorial/>

Ce document est également valide

Non valide

<text>Ceci est un document XML</text>

L'élément racine n'est pas conforme à la DTD spécifiée

II - 2. Exemple 2

Un type d'élément a un contenu d'élément lorsque les éléments de ce type ne doivent comporter que des éléments fils (aucune donnée caractère), éventuellement séparés par des espaces.

<!ELEMENT XXX (AAA , BBB)>
<!ELEMENT AAA (#PCDATA)>
<!ELEMENT BBB (#PCDATA)>

L'élément racine XXX doit précisément comporter un élément AAA, suivi d'un élément BBB. Les éléments AAA et BBB peuvent contenir du texte, mais aucun autre élément.

Valide

<XXX>
<AAA>Début</AAA>
<BBB>Fin</BBB>
</XXX>

Document valide contenant du texte

Valide

<XXX> <AAA/> <BBB/> </XXX>

Ce document est également valide

Non valide

<XXX> <AAA/> ___ </XXX>

L'élément BBB est absent

Non valide

<XXX> <BBB/> <AAA/> </XXX>

L'élément BBB doit suivre l'élément AAA

Non valide

<XXX> <AAA/> <BBB/> <BBB/>  </XXX>

L'élément racine XXX ne peut contenir qu'un élément BBB

Non valide

<XXX> Eléments : <AAA/> <BBB/>   </XXX>

L'élément racine XXX ne doit contenir aucun texte

III - 3. Exemple 3

Dans une DTD, si un nom d'élément est suivi d'un astérisque [*], cet élément peut figurer zéro, une ou plusieurs fois.

<!ELEMENT XXX (AAA* , BBB)>
<!ELEMENT AAA (#PCDATA)>
<!ELEMENT BBB (#PCDATA)>

L'élément racine XXX peut contenir zéro, un ou plusieurs éléments AAA, suivis précisément d'un élément BBB. L'élément BBB doit toujours être présent

Valide

<XXX> <AAA/> <BBB/> </XXX>

Document valide

Valide

<XXX> <BBB/> </XXX>

Autre document valide. L'élément AAA n'est pas obligatoire

Valide

<XXX> <AAA/> <AAA/> <AAA/> <AAA/> <AAA/> <AAA/> <AAA/> <BBB/> </XXX>

Plusieurs éléments AAA peuvent figurer dans le document

Non valide

<XXX> ___ </XXX>

L'élément BBB est absent

Non valide

<XXX> <BBB/> <AAA/> </XXX>

L'élément BBB doit suivre l'élément AAA

Non valide

<XXX> <AAA/> <AAA/> <AAA/> <AAA/> <BBB/> <AAA/> <AAA/> </XXX>

L'élément AAA ne doit pas suivre l'élément BBB

IV - 4. Exemple 4

Dans une DTD, si un nom d'élément est suivi du signe plus [+], cet élément peut figurer une ou plusieurs fois.

<!ELEMENT XXX (AAA+ , BBB)>
<!ELEMENT AAA (#PCDATA)>
<!ELEMENT BBB (#PCDATA)>

L'élément racine XXX doit contenir un ou plusieurs éléments AAA, suivis précisément d'un élément BBB. L'élément BBB doit toujours être présent

Valide

<XXX> <AAA/> <BBB/> </XXX>

Document valide

Valide

<XXX> <AAA/> <AAA/> <AAA/> <AAA/> <AAA/> <AAA/> <AAA/> <BBB/> </XXX>

Plusieurs éléments AAA peuvent figurer dans le document

Non valide

<XXX> ___ ___ </XXX>

Les éléments AAA et BBB sont absents

Non valide

<XXX> ___<BBB/> </XXX>

Au moins un élément AAA doit être présent

Non valide

<XXX> <BBB/> <AAA/> </XXX>

L'élément BBB doit suivre l'élément AAA

Non valide

<XXX> <AAA/> <AAA/> <AAA/> <AAA/> <BBB/> <AAA/> <AAA/> </XXX>

L'élément AAA ne doit pas suivre l'élément BBB

V - 5. Exemple 5

Dans une DTD, si un nom d'élément est suivi d'un point d'interrogation [?], cet élément peut figurer zéro ou une fois.

<!ELEMENT XXX (AAA? , BBB)>
<!ELEMENT AAA (#PCDATA)>
<!ELEMENT BBB (#PCDATA)>

L'élément racine XXX peut contenir un élément AAA, suivi précisément d'un élément BBB. L'élément BBB doit toujours être présent.

Valide

<XXX> <AAA/> <BBB/> </XXX>

Document valide

Valide

<XXX>  <BBB/> </XXX>

L'élément AAA n'est pas obligatoire

Non valide

<XXX> ___ </XXX>

L'élément BBB est absent

Non valide

<XXX> <AAA/> <AAA/> <AAA/> <AAA/> <AAA/> <AAA/> <AAA/> <BBB/> </XXX>

Un élément AAA au maximum peut figurer dans le document

Non valide

<XXX> <BBB/> <AAA/> </XXX>

L'élément BBB doit suivre l'élément AAA

VI - 6. Exemple 6

Cet exemple utilise une combinaison de [ + * ?]

<!ELEMENT XXX (AAA? , BBB+)>
<!ELEMENT AAA (CCC? , DDD*)>
<!ELEMENT BBB (CCC , DDD)>
<!ELEMENT CCC (#PCDATA)>
<!ELEMENT DDD (#PCDATA)>

L'élément racine XXX peut contenir un élément AAA, suivi d'un ou de plusieurs éléments BBB. L'élément AAA peut contenir un élément CCC et plusieurs éléments DDD. L'élément BBB doit précisément contenir un élément CCC et un élément DDD

Valide

<XXX>
<AAA>
<CCC/><DDD/>
</AAA>
<BBB>
<CCC/><DDD/>
</BBB>
</XXX>

Document valide

Valide

<XXX>
<AAA/>
<BBB>
<CCC/><DDD/>
</BBB>
</XXX>

Les éléments fils de l'élément AAA ne sont pas obligatoires

Valide

<XXX>
<BBB>
<CCC/><DDD/>
</BBB>
</XXX>

L'élément AAA peut être omis

Non valide

<XXX>
<AAA/>
<BBB/>
</XXX>

L'élément BBB doit contenir les éléments CCC et DDD

Non valide

<XXX>
<AAA>
<CCC/><CCC/>
<DDD/><DDD/>
</AAA>
<BBB>
<CCC/><DDD/>
</BBB>
</XXX>

L'élément AAA peut contenir un élément CCC au maximum

VII - 7. Exemple 7

Le caractère [ | ] vous permet de sélectionner un élément parmi plusieurs éléments.

<!ELEMENT XXX (AAA , BBB)>
<!ELEMENT AAA (CCC , DDD)>
<!ELEMENT BBB (CCC | DDD)>
<!ELEMENT CCC (#PCDATA)>
<!ELEMENT DDD (#PCDATA)>

L'élément racine XXX doit contenir un élément AAA, suivi d'un élément BBB. L'élément AAA doit contenir un élément CCC, suivi d'un élément DDD. L'élément BBB doit contenir soit un élément CCC, soit un élément DDD

Valide

<XXX>
<AAA>
<CCC/> <DDD/>
</AAA>
<BBB>
<CCC/>
</BBB>
</XXX>

Document valide

Valide

<XXX>
<AAA>
<CCC/> <DDD/>
</AAA>
<BBB>
<DDD/>
</BBB>
</XXX>

Autre document valide

Non valide

<XXX>
<AAA>
<CCC/> <DDD/>
</AAA>
<BBB>
<CCC/> <DDD/>
</BBB>
</XXX>

L'élément BBB peut contenir soit un élément CCC, soit un élément DDD, mais pas les deux à la fois

Non valide

<XXX>
<AAA>
<CCC/> <DDD/>
</AAA>
<BBB>
<DDD/>  <CCC/>
</BBB>
</XXX>

L'élément BBB peut contenir soit un élément CCC, soit un élément DDD, mais pas les deux à la fois

VIII - 8. Exemple 8

Du texte peut être inséré avec les éléments.

<!ELEMENT XXX (AAA+ , BBB+)>
<!ELEMENT AAA (BBB | CCC )>
<!ELEMENT BBB (#PCDATA | CCC )*>
<!ELEMENT CCC (#PCDATA)>

L'élément AAA peut contenir soit un élément BBB, soit un élément CCC. En revanche, l'élément BBB peut contenir n'importe quelle combinaison de texte et d'éléments CCC.

Valide

<XXX>
<AAA>
<CCC>Précisément un élément.</CCC>
</AAA>
<AAA>
<BBB>
<CCC/>
<CCC/>
<CCC/>
</BBB>
</AAA>
<BBB/>
<BBB>
Voici <CCC/> une combinaison <CCC/> d'<CCC>éléments CCC </CCC> et de texte <CCC/>.
</BBB>
<BBB>
Uniquement du texte.
</BBB>
</XXX>

Document valide exploitant plusieurs possibilités

Non valide

<XXX>
<AAA>
Elément : <CCC/>
</AAA>
<BBB>
Elément : <CCC/>
</BBB>
</XXX>

L'élément AAA ne peut pas contenir de texte

IX - 9. Exemple 9

Les attributs servent à associer des paires Nom-valeur aux éléments. Les spécifications d'attributs ne peuvent figurer que dans les balises de début et les balises d'éléments vides. La déclaration commence par ATTLIST, suit après le nom de l'élément auquel les attributs sont rattachés et, enfin, la définition des attributs individuels.

<!ELEMENT attributes (#PCDATA)>
<!ATTLIST attributes
aaa CDATA #REQUIRED
bbb CDATA #IMPLIED>

Un attribut de type CDATA peut contenir n'importe quel caractère, s'il respecte les contraintes de forme. L'attribut obligatoire doit toujours être présent, tandis que l'attribut implicite est facultatif.

Valide

<attributes aaa="#d1" bbb="*~*">
Texte
</attributes>

L'attribut de type CDATA peut contenir n'importe quel caractère respectant les contraintes de forme

Valide

<attributes bbb="$25" aaa="13%">
Texte
</attributes>

L'ordre des attributs n'a pas d'importance

Valide

<attributes aaa="#d1" />

L'attribut bbb peut être omis, car il est implicite

Non valide

<attributes ___ bbb="X24"/>

L'attribut aaa étant obligatoire, il doit donc être toujours présent

X - 10. Exemple 10

Un attribut de type CDATA peut contenir n'importe quel caractère, s'il respecte les contraintes de forme. Les attributs de type NMTOKEN ne peuvent contenir que des lettres, des chiffres, un point [ . ] , un tiret [ - ], un trait de soulignement [ _ ] et un deux-points [ : ]. Les attributs de type NMTOKENS peuvent contenir les mêmes caractères que les attributs de type NMTOKEN, plus des espaces blancs. Par espace blanc, on entend un ou plusieurs espaces, retours chariot, sauts de ligne ou tabulations.

<!ELEMENT attributes (#PCDATA)>
<!ATTLIST attributes
aaa CDATA #IMPLIED
bbb NMTOKEN #REQUIRED
ccc NMTOKENS #REQUIRED>

Les attributs bbb et ccc doivent toujours être présents, tandis que l'attribut aaa est facultatif

Valide

<attributes aaa="#d1" bbb="a1:12" ccc=" 3.4 div    -4"/>

Tous les attributs obligatoires sont présents et le type de leur valeur est correct

Valide

<attributes bbb="a1:12"
ccc="3.4
div
-4"/>

Tous les attributs obligatoires sont présents et le type de leur valeur est correct

Non valide

<attributes aaa="#d1" bbb="#d1" ccc="#d1"/>

Le caractère # est interdit dans les attributs de type NMTOKEN et NMTOKENS

Non valide

<attributes bbb="A B C" ccc="A        B       C"/>

L'espace est interdit dans les attributs de type NMTOKEN

XI - 11. Exemple 11

La valeur d'un attribut de type ID ne peut être constituée que de caractères autorisés pour le type NMTOKEN et doit commencer par une lettre. Un type d'élément ne peut pas avoir plusieurs attributs de type ID. La valeur d'un attribut de type ID doit être unique par rapport à l'ensemble des valeurs de tous les attributs de type ID.

<!ELEMENT XXX (AAA+ , BBB+ , CCC+)>
<!ELEMENT AAA (#PCDATA)>
<!ELEMENT BBB (#PCDATA)>
<!ELEMENT CCC (#PCDATA)>
<!ATTLIST AAA
id ID #REQUIRED>
<!ATTLIST BBB
code ID #IMPLIED
list NMTOKEN #IMPLIED>
<!ATTLIST CCC
X ID #REQUIRED
Y NMTOKEN #IMPLIED>

Les attributs id, code et X identifient de manière unique leur élément

Valide

<XXX>
<AAA id="a1"/>
<AAA id="a2"/>
<AAA id="a3"/>
<BBB code="QWQ-123-14-6" list="14:5"/>
<CCC X="zero" Y="16" />
</XXX>

Toutes les valeurs ID sont uniques

Valide

<XXX>
<AAA id="L12"/>
<BBB code="QW" list="L12"/>
<CCC X="x-0" Y="QW" />
<CCC X="x-1" Y="QW" />
</XXX>

Les attributs list et Y sont de type NMTOKEN, et pas de type ID. Ils peuvent donc avoir la même valeur que les attributs ID ou la même valeur dans plusieurs éléments

Non valide

<XXX>
<AAA id="L12"/>
<BBB code="#QW" list="L12"/>
<CCC X="12" Y="QW" />
</XXX>

L'attribut ID ne doit pas commencer par un nombre ou contenir un caractère interdit pour le type NMTOKEN

Non valide

<XXX>
<AAA id="L12"/>
<BBB code="QW" list="L12"/>
<CCC X="ZA" Y="QW" />
<CCC X="ZA" Y="QW" />
</XXX>

L'attribut ID doit comporter une valeur unique

Non valide

<XXX>
<AAA id="L12"/>
<BBB code="QW" list="L12"/>
<CCC X="L12" Y="QW" />
</XXX>

L'attribut ID doit comporter une valeur unique. Les attributs id et X sont tous les deux de type ID

XII - 12. Exemple 12

La valeur de l'attribut IDREF doit correspondre à celle de l'un des attributs ID présents dans le document. La valeur de l'attribut IDREFS peut contenir plusieurs références à des éléments comportant un attribut ID en les séparant par des espaces blancs.

<!ELEMENT XXX (AAA+ , BBB+, CCC+, DDD+)>
<!ELEMENT AAA (#PCDATA)>
<!ELEMENT BBB (#PCDATA)>
<!ELEMENT CCC (#PCDATA)>
<!ELEMENT DDD (#PCDATA)>
<!ATTLIST AAA
mark ID #REQUIRED>
<!ATTLIST BBB
id ID #REQUIRED>
<!ATTLIST CCC
ref IDREF #REQUIRED>
<!ATTLIST DDD
ref IDREFS #REQUIRED>

Les attributs id et mark identifient de manière unique leur élément. Les attributs ref font référence à ces éléments

Valide

<XXX>
<AAA mark="a1"/>
<AAA mark="a2"/>
<AAA mark="a3"/>
<BBB id="b001" />
<CCC ref="a3" />
<DDD ref="a1 b001 a2" />
</XXX>

Toutes les valeurs des attributs ID sont uniques et tous les attributs IDREF et IDREFS pointent vers des éléments comportant des attributs ID appropriés

Non valide

<XXX>
<AAA mark="a1"/>
<AAA mark="a2"/>
<BBB id="b01" />
<CCC ref="a3" />
<DDD ref="a1 b001 a2" />
</XXX>

Il n'y a aucun attribut ID ayant a3 ou b001 comme valeur

Non valide

<XXX>
<AAA mark="a1"/>
<AAA mark="a2"/>
<AAA mark="a3"/>
<BBB id="b001" />
<CCC ref="a1 b001 a2" />
<DDD ref="a1 b001 a2" />
</XXX>

L'attribut ref de l'élément CCC est de type IDREF. Il ne peut contenir qu'une seule référence

XIII - 13. Exemple 13

Les valeurs d'attributs autorisées peuvent être définies dans la DTD.

<!ELEMENT XXX (AAA+, BBB+)>
<!ELEMENT AAA (#PCDATA)>
<!ELEMENT BBB (#PCDATA)>
<!ATTLIST AAA
vrai ( oui | non ) #REQUIRED>
<!ATTLIST BBB
mois (1|2|3|4|5|6|7|8|9|10|11|12) #IMPLIED>

Cette DTD définit précisément les valeurs autorisées

Valide

<XXX>
<AAA vrai="oui"/>
<AAA vrai="non"/>
<AAA vrai="oui"/>
<BBB mois="8" />
<BBB mois="2" />
<BBB mois="12" />
</XXX>

Toutes les valeurs sont définies dans la DTD

Non valide

<XXX>
<AAA vrai="oui"/>
<AAA vrai="non"/>
<AAA vrai="peut-être"/>
<BBB mois="8" />
<BBB mois="2" />
<BBB mois="16" />
</XXX>

L'attribut vrai ne peut pas avoir « peut-être » comme valeur, et l'attribut mois ne peut pas avoir « 16 » comme valeur

XIV - 14. Exemple 14

Si un attribut est implicite, une valeur par défaut peut être fournie au cas où l'attribut n'est pas utilisé.

<!ELEMENT XXX (AAA+, BBB+)>
<!ELEMENT AAA (#PCDATA)>
<!ELEMENT BBB (#PCDATA)>
<!ATTLIST AAA
vrai ( oui | non ) "oui">
<!ATTLIST BBB
mois NMTOKEN "1">

Les deux attributs sont implicites. Leur valeur par défaut est définie

Valide

<XXX>
<AAA vrai="oui"/>
<AAA vrai="non"/>
<AAA/>
<BBB mois="8" />
<BBB mois="2" />
<BBB/>
</XXX>

Les différentes valeurs de l'attribut vrai sont oui, non et oui. Les différentes valeurs de l'attribut mois sont 8, 2 et 1

XV - 15. Exemple 15

Un élément peut être défini comme EMPTY. Dans ce cas, il ne peut contenir que des attributs, mais pas de texte.

<!ELEMENT XXX (AAA+)>
<!ELEMENT AAA EMPTY>
<!ATTLIST AAA
vrai ( oui | non ) "oui">

Les éléments AAA ne peuvent contenir que des attributs, mais pas de texte

Valide

<XXX>
<AAA vrai="oui"/>
<AAA vrai="non"></AAA>
</XXX>

Ces deux formes sont autorisées. Dans le second cas, la balise de fin doit immédiatement suivre la balise de début

Non valide

<XXX>
<AAA vrai="oui"/>
<AAA vrai="non"></AAA>
<AAA>           </AAA>
<AAA>Salut !</AAA>
</XXX>

L'élément AAA ne doit pas contenir de texte, et la balise de début doit être immédiatement fermée