Vous êtes sur la page 1sur 9

Résumé : DTD

• Bases
• Eléments
• Attributs
• Entités
• notaions

Bases
Qu'est-ce que la DTD ?
La définition de type de document donne la grammaire de l'application XML. Elle décrit :
• les éléments types, i.e. elle donne les noms de tous les éléments et leur modèle de contenu ;
• les attributs pour chaque élément (nom, type et valeur par défaut) ;
• les entités binaires ou textuelles pouvant être incluses dans un document (les caractères non
ASCII par exemple);
• les notations qui servent à identifier les types spécifiques de données externes binaires.
Rappelons qu'il n'est pas nécessaire de créer une DTD pour afficher un document XML.

Quelle différence entre une DTD interne et externe ?


Un document peut avoir une DTD externe ou une DTD interne ou encore une DTD interne et une
DTD externe. Pour un document la DTD totale est la réunion du sous-ensemble externe et du sous-
ensemble interne.
Le sous ensemble externe contient les déclarations générales (utiles à un ensemble de documents) :
• la majorité des déclarations d'éléments ;
• et de la liste des attributs ;
• les déclarations d'entités dont chaque document peut avoir besoin.
Une DTD externe s'applique à plusieurs documents, quand on modifie un élément la modification
s'applique à tous les documents (pour une DTD interne il faudrait faire la modification dans toutes
les DTD internes).
Le sous-ensemble interne contient les déclarations spécifiques au document :
• les déclarations des entités spécifiques graphiques ;
• les déclarations d'attributs et entités supplémentaires servant uniquement au document le
définissant.
Le sous-ensemble interne n'aura aucun effet sur les autres documents faisant référence au sous-
ensemble externe de la DTD. Le sous-ensemble interne a priorité sur le sous-ensemble externe ce
qui permet de modifier localement un document.

Emplacement des déclarations


La déclaration de type de document s'effectue dans le prologue avec la déclaration DOCTYPE qui
permet de donner un sous-ensemble interne et externe.
<!DOCTYPE racine SYSTEM|PUBLIC "url" [ sous_ensemble_interne ] >

DTD interne
Le sous-ensemble interne de la DTD est placé dans le DOCTYPE après la déclaration XML.
L'attribut standalone prendra dans la déclaration XML la valeur "yes" s'il n'y a pas à
rechercher de DTD externe, "no" sinon. <?xml version="1.0" standalone="yes"?>

<!DOCTYPE racine [ <!-- sous-ensemble de DTD interne --> ]>


<racine> ... </racine>

DTD externe
Le sous-ensemble externe est placé dans un fichier séparé. L'appel à ce fichier qui doit avoir le
même nom que la racine du document (élément qui englobe tous les autres) est effectué dans le
DOCTYPE après la déclaration XML. L'attribut standalone prendra dans la déclaration XML la
valeur "no". <!DOCTYPE racine (SYSTEM "url") | (PUBLIC
"identifiant_public" "url"?)>

PUBLIC
PUBLIC est utilisé lorsque la DTD est une norme ou qu'elle est enregistrée sous forme de norme
ISO par l'auteur.
identifiant_public contient les caractéristiques :
type_enregistrement // proprietaire // DTD description // langue

avec :
• type_enregistrement : un signe + si c'est selon la norme ISO 9070, un signe - sinon ;
• proprietaire : nom du propriétaire (entreprise ou personne) ;
• DTD description : une description textuelle pour laquelle les espaces sont autorisés ;
• langue : un code de langue ISO 639.
L'adresse du fichier décrivant la DTD n'est pas obligatoire, le processeur XML peut utiliser les
informations de l'identifiant public pour essayer de générer une adresse. Il faut noter cependant qu'il
n'est pas toujours possible de trouver l'adresse à partir de l'identifiant, il est donc conseillé de faire
suivre l'identifiant par l'adresse du fichier.
Voici la déclaration de type de document pour un document html qui utilise la DTD XHTML1.0 :
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

SYSTEM
SYSTEM est utilisé pour donner l'adresse du fichier qui contient la DTD dans le cas où la DTD n'est
pas publique. <!DOCTYPE racine SYSTEM
"http://www.serveur.fr/racine.dtd">

Déclaration d'éléments
Rappelons qu'un élément permet de structurer le document (par exemple livre est un élément d'un
document bibliothèque, en HTML p, h1, form... sont des éléments).
La déclaration d'éléments est de la forme :
<!ELEMENT nom_element modele_de_contenu>

Élément vide
Un élément vide ne contient aucun texte, aucun autre élément, comme les éléments IMG, HR, BR
de HTML. <!ELEMENT nom_element EMPTY>

Par exemple, dans la DTD de XHTML 1.0 l'élément img est déclaré : <!ELEMENT img EMPTY>

Élément non vide


Un élément non vide est formé d'une balise ouvrante, d'un contenu et d'une balise fermante. Pour
décrire ce contenu dans la DTD on utilise un modèle de contenu dans la déclaration d'éléments.

Données
Si l'élément contient uniquement des données (autrement dit, s'il n'y a aucun autre élément inclus
dans cet élément) on utilise le type #PCDATA qui signifie Parsed Character DATA i.e. données
caractères analysées : <!ELEMENT nom_element (#PCDATA)>

Par exemple, dans la DTD de XHTML 1.0 l'élément title qui permet de donner le titre de la fenêtre
est déclaré : <!ELEMENT title (#PCDATA)>

Conteneur d'éléments
Si l'élément contient uniquement d'autres éléments, le modèle de contenu définit les éléments
pouvant être inclus dans un élément donné et spécifie également les éléments devant apparaître
obligatoirement, leur ordre et leur fréquence.
Les parenthèses dans la déclaration d'élément introduisent les éléments enfants de l'élément défini.
L'ordre dans lequel les éléments sont précisés est l'ordre dans lequel ils doivent apparaître dans
l'élément en cours de définition. Par exemple, dans la DTD de XHTML 1.0 l'élément racine html
qui contient les éléments head et body est déclaré <!ELEMENT html (head, body)>.

Les indicateurs d'occurrences sont les suivants :


• ? = 0 ou 1 fois
• * = 0 ou n fois
• + = au moins une fois
Par exemple, dans la DTD de XHTML 1.0 l'élément ul est déclaré : <!ELEMENT ul li+>

Pour indiquer des choix, il est possible d'utiliser le |. Dans la DTD XHTML1.0 l'élément dl est
déclaré : <!ELEMENT dl (dt|dd)+>

Contenu mixte
Si l'élément a un contenu mixte (données + éléments) il est possible d'utiliser PCDATA et les
éléments imbriqués. Par exemple, dans la DTD de XHTML 1.0 l'élément object est déclaré : <!
ELEMENT object (#PCDATA | param | %block; | form | %inline; |
%misc;)*>

Élément libre
Élément qui peut contenir tout élément déclaré dans la DTD et du texte. <!ELEMENT
nom_element ANY>

Exemple
Voici la DTD qui peut être utilisée pour le document bibliothèque. <!ELEMENT bibliotheque
(livre+)> <!ELEMENT livre (titre, auteur, ref)> <!ELEMENT titre
(#PCDATA)> <!ELEMENT auteur (nom, prenom)> <!ELEMENT nom
(#PCDATA)> <!ELEMENT prenom (#PCDATA)> <!ELEMENT ref (#PCDATA)>

DTD interne
Avec une DTD interne le document XML serait le suivant : <?xml version="1.0"?> <!
DOCTYPE bibliotheque [ <!ELEMENT bibliotheque (livre+)> <!ELEMENT
livre (titre, auteur, ref)> <!ELEMENT titre (#PCDATA)> <!ELEMENT
auteur (nom, prenom)> <!ELEMENT nom (#PCDATA)> <!ELEMENT prenom
(#PCDATA)> <!ELEMENT ref (#PCDATA)> ]> <bibliotheque> ...
</bibliotheque>

DTD externe
Avec la même DTD mais externe on aurait alors dans le fichier externe biblio.dtd : <!ELEMENT
bibliotheque (livre+)> <!ELEMENT livre (titre, auteur, ref)> <!
ELEMENT titre (#PCDATA)> <!ELEMENT auteur (nom, prenom)> <!ELEMENT
nom (#PCDATA)> <!ELEMENT prenom (#PCDATA)> <!ELEMENT ref
(#PCDATA)>
et dans le document XML : <?xml version="1.0"?> <!DOCTYPE bibliotheque
SYSTEM "biblio.dtd"> <bibliotheque> ... </bibliotheque>

Déclaration d'attribut
Le rôle de la déclaration d'attributs est de donner pour un élément cible :
• les noms d'attributs permis ;
• le type de chaque attribut ;
• la valeur par défaut de l'attribut.
<!ATTLIST element_cible nom_attribut type_attribut
valeur_par_défaut>

Valeur par défaut


La valeur par défaut est la valeur prise par l'attribut si aucune valeur n'est précisée dans l'élément.
Cette valeur doit être du même type que celui donné à l'attribut. S'il n'y a pas matière à définir une
valeur par défaut on peut remplacer par un mot-clé :
• #REQUIRED = obligatoire, i.e. la valeur d'attribut doit être spécifiée lorsque l'élément est
utilisé dans le document (par exemple en HTML il est obligatoire de donner l'attribut src
avec l'élément img).
• #IMPLIED = facultatif, i.e. la valeur d'attribut peut rester non spécifiée
• #FIXED 'val' = fixée à 'val' i.e. la valeur de l'attribut est fixe et ne peut pas être modifiée par
l'utilisateur
Par exemple, dans la DTD XHML1.0 on a pour l'élément pre l'attribut xml:space qui est fixé à
preserve pour signifier que les espaces blancs à l'intérieur de pre sont significatifs et ne doivent
pas être modifiés par le processeur XML : <!ATTLIST pre %attrs; xml:space
(preserve) #FIXED 'preserve' >

Dans cette même DTD, l'attribut method de l'élément form qui ne peut prendre comme valeur
que get ou post prend par défaut la valeur get, d'autre part, le type mime d'encodage prend par
défaut la valeur application/x-www-form-urlencoded : <!ATTLIST form
%attrs; action %URI; #REQUIRED method (get|post) "get" enctype
%ContentType; "application/x-www-form-urlencoded" onsubmit
%Script; #IMPLIED onreset %Script; #IMPLIED accept %ContentTypes;
#IMPLIED accept-charset %Charsets; #IMPLIED >

Types de données
chaînes de caractères CDATA
<!ATTLIST element_cible nom_attribut CDATA valeur_par_défaut>
Pour XHTML1.0 les attributs http-equiv, name, content, scheme de l'élément meta
sont des chaînes de caractères : <!ATTLIST meta %i18n; http-equiv CDATA
#IMPLIED name CDATA #IMPLIED content CDATA #REQUIRED scheme CDATA
#IMPLIED >

Énumérations
<!ATTLIST element_cible nom_attribut (val1 | val2 | ... | valN)
"valdefaut">

L'attribut prend une valeur dans la liste des valeurs possibles définies dans la déclaration d'attribut
(chaque valeur doit être un atome nominal ou NMTOKEN valide).
<!ATTLIST livre type (policier | fiction | aventure) "policier">

Identificateurs
<!ATTLIST element_cible nom_attribut ID> <!ATTLIST element_cible
nom_attribut IDREF> <!ATTLIST element_cible nom_attribut IDREFS>

Un attribut de type ID représente un identificateur unique d'élément, i.e. un attribut dont la valeur
distingue l'élément de tous les autres dans le document XML courant (ex. l'attribut id en HTML).
Notons que cet attribut prend généralement le nom id.
Les types IDREF et IDREFS sont des références/liste de références séparées par des espaces, à un
identifiant unique précédemment déclaré (par exemple, l'attribut header de l'élément td en
XHML est de type IDREFS pour indiquer à quelles cellules de l'en-tête du tableau se rapporte la
cellule courante).

Entités
Les types ENTITY et ENTITIES représentent un nom / une liste de noms d'entités séparées par des
blancs, non-XML précédemment déclarées dans la DTD.
C'est utilisé par exemple pour établir un lien avec une image : <!ATTLIST image source
ENTITY #REQUIRED> <!ENTITY vacances SYSTEM "plage.gif NDATA
GIF89a">

qui sera utilisé dans le document XML : <image source="vacances"/>

Tokens
Les types NMTOKEN/NMTOKENS représentent des noms XML/listes de noms XML séparés par
des espaces. Ces noms peuvent être composés de lettres, chiffres, soulignés, points, deux-points et
tirets (par exemple l'attribut name de l'élément map est de type NMTOKEN en XHTML1.0).

Notations
NOTATION signifie que l'attribut attend une notation qui apparaît dans la DTD dans une
déclaration NOTATION
Si une liste de valeurs est préfixée par le mot NOTATION les notations listées comme des valeurs
possibles doivent toutes avoir déjà été déclarées :
<!ATTLIST image type NOTATION(GIF | JPEG | PNG) "GIF">

Déclaration d'entités
Chaque entité XML est définie dans une DTD. Les entités spécifiques au document sont présentes
dans sa DTD interne (images, autres documents non XML, caractères spécifiques). Une entité est
un alias associant un nom à un groupe de données. Ces données peuvent prendre un ou plusieurs
formats.

Entités paramètres
<!ENTITY % nom "chaîne_de_remplacement">

Ces entités apparaîssent uniquement dans les DTD. Ce sont des raccourcis vers des parties de
déclarations de la DTD.
Par exemple dans la DTD de XHML1.0 on a la déclaration d'entité :
<!ENTITY % Shape "(rect|circle|poly|default)">

qui est ensuite utilisée dans la déclaration d'attributs pour l'élément area :
<!ATTLIST area %attrs; shape %Shape; "rect" coords %Coords;
#IMPLIED href %URI; #IMPLIED nohref (nohref) #IMPLIED alt %Text;
#REQUIRED tabindex %Number; #IMPLIED accesskey %Character;
#IMPLIED onfocus %Script; #IMPLIED onblur %Script; #IMPLIED >

Entités caractères
<!ENTITY nom "&#code;">

Ces entités associent un alias à un caractère non disponible sur le clavier, dans le document l'appel
s'effectue avec &nom;. Rappelons que les caractères réservées &, <, >, ", ', sont déjà définis et n'ont
pas à être redéfinis par des entités dans la DTD
La DTD XHTML1.0 définit le caractère mathématique "il existe" et le caractère de l'alphabet grec
"delta" : <!ENTITY exist "&#8707;"> <!-- there exists, U+2203 ISOtech
--> <!ENTITY delta "&#948;"> <!-- greek small letter delta, U+03B4
ISOgrk3 -->

Entités générales
<!ENTITY nom "texte">

Transforme l'alias (nom) en une phrase incluse dans la déclaration de l'entité. C'est l'équivalent
d'une macro.
Par exemple <!ENTITY wysiwyg "What You See Is What You Get">

permet d'utiliser dans le document XML : les éditeurs de type &wysiwyg;

ce qui deviendra dans un navigateur : les éditeurs de type What You See Is What
You Get.

Entités externes
Les entités externes représentent des données contenues dans des fichiers séparés par rapport au
document XML.

Analysées
<!ENTITY nom SYSTEM "URI">

Les fichiers contenant des données textuelles sont analysés. Par exemple un livre peut être constitué
des documents toc.xml, chapters/c1.xml, chapters/c2.xml et index.xml : <!doctype book
SYSTEM "book.dtd" [ <!entity toc SYSTEM "toc.xml"> <!entity chap1
SYSTEM "chapters/c1.xml"> <!entity chap2 SYSTEM "chapters/c2.xml">
<!entity index SYSTEM "index.xml"> ]> <book> <head>&toc;</head>
<body> &chap1; &chap2; &index; </body> </book>

Non analysées
<!ENTITY nom SYSTEM "URI" NDATA type_notation>

Les entités externes non analysées permettent de déclarer un contenu non XML dans le document
XML (fichiers binaires images, sons...). Le mot clé NDATA (Notation DATA) précise le type
d'entité non analysée que le processeur XML doit traiter.
Par exemple, la déclaration d'entité ci-dessous attribue un alias (vacances) à une entité
(images/plage.gif) de type GIF89a sauvegardée sur le disque (SYSTEM) : <!ENTITY vacances
SYSTEM "images/plage.gif" NDATA GIF89a>

Les fichiers binaires (images, sons...) doivent être identifiés par une notation qui a été déclarée dans
la DTD. Par exemple, la notation GIF89a utilisée dans l'exemple précédent est déclarée dans la
DTD :
<!NOTATION GIF89a PUBLIC "-//Compuserve//NOTATION Graphics
Interchange Format 89a//EN">
Les entités binaires ne peuvent être appelées que dans la valeur d'un attribut, lui-même déclaré
comme étant du type ENTITY ou ENTITIES dans la DTD. La DTD comportera donc : <!
NOTATION GIF89a PUBLIC "-//Compuserve//NOTATION Graphics
Interchange Format 89a//EN"> <!ATTLIST image source ENTITY
#REQUIRED> <!ENTITY vacances SYSTEM "images/plage.gif" NDATA
GIF89a>

ce qui permettra dans le document XML d'appeler l'image : <image source="vacances">


<image source="vacances">
Déclaration de notations
<!NOTATION nom_notation SYSTEM "">

Les notations permettent d'identifier par un nom le format des entités non-analysées par le parseur
XML. Elles permettent de définir le format des données et les applications qui permettent de les
traiter.
Si le système prend en charge le format, il est possible d'écrire (si l'extension est associée à une
application) :
<!NOTATION GIF SYSTEM "GIF"> <!NOTATION GIF89a PUBLIC
"-//Compuserve//NOTATION Graphics Interchange Format 89a//EN">
Il est recommandé (pour faciliter la maintenance) de regrouper toutes les notations dans un fichier
unique qui est ensuite appelé dans la DTD :
<!ENTITY %mesentites SYSTEM "entites.ent">

Vous aimerez peut-être aussi