DTD
Sylvain Salvatiemail : [email protected]
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><section>...</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></date> <date><annee>...</annee><mois>...</mois></date>
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> <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"