• Aucun résultat trouvé

Déclaration d'élément

Les déclarations d'éléments constituent le cœur des DTD car elles définissent la structure des documents valides.

Elles spécifient quels doivent être les enfants de chaque élément et l'ordre de ces enfants.

La déclaration d'un élément est nécessaire pour qu'il puisse apparaître dans un document. Cette déclaration précise le nom et le type de l'élément. Le nom de l'élément doit être un nom XML [Section 2.2.3] et le type détermine les contenus valides de l'élément. On distingue les contenus purs uniquement constitués d'autres éléments, les contenus textuels uniquement constitués de texte et les contenus mixtes qui mélangent éléments et texte.

De manière générale, la déclaration d'un élément prend la forme suivante où element et type sont respectivement le nom et le type de l'élément. Le type de l'élément détermine quels sont ses contenus autorisés.

<!ELEMENT element type>

3.6.1. Contenu pur d'éléments

Le contenu d'un élément est pur lorsqu'il ne contient aucun texte et qu'il est uniquement constitué d'éléments qui sont ses enfants. Ces enfants peuvent, à leur tour, avoir des contenus textuels, purs ou mixtes. Un élément de contenu pur peut donc indirectement contenir du texte si celui-ci fait partie du contenu d'un de ses descendants.

La déclaration d'un élément de contenu pur détermine quels peuvent être ses enfants et dans quel ordre ils doivent apparaître. Cette description est indépendante du contenu de ces enfants. Elle dépend uniquement des noms des enfants. Le contenu de chaque enfant est décrit par sa propre déclaration. Une déclaration d'élément prend la forme suivante.

<!ELEMENT element regexp>

Le nom de l'élément est donné par l'identifiant element. L'expression rationnelle regexp décrit les suites autorisées d'enfants dans le contenu de l'élément. Cette expression rationnelle est construite à partir des noms d'éléments en utilisant les opérateurs ',', '|', '?', '*' et '+' ainsi que les parenthèses '(' et ')' pour former des groupes. Les opérateurs ',' et '|' sont binaires alors que les opérateurs '?', '*' et '+' sont unaires et postfixés. Ils se placent juste après leur opérande, c'est-à-dire derrière le groupe auquel ils s'appliquent.

Le nom d'un élément signifie que cet élément doit apparaître dans le contenu. Les opérateurs principaux sont les deux opérateurs ',' et '|' qui expriment la mise en séquence et le choix. Un contenu est valide pour une expression de la forme block-1, block-2 s'il est formé d'un contenu valide pour block-1 suivi d'un contenu valide pour block-2. Un contenu est valide pour une expression de la forme block-1 | block-2 s'il est formé d'un contenu valide pour block-1 ou d'un contenu valide pour block-2. Les trois opérateurs '?', '*' et '+' permettent d'exprimer des répétitions. Un contenu est valide pour une expression de la forme block?

s'il est vide ou formé d'un contenu valide pour block. Un contenu est valide pour une expression de la forme block* (respectivement block+) s'il est formé d'une suite éventuellement vide (respectivement suite non vide) de contenus valides pour block. La signification des cinq opérateurs est récapitulée par la table suivante.

Opérateur Signification

, Mise en séquence

DTD

Opérateur Signification

| Choix

? 0 ou 1 occurrence

* Répétition d'un nombre quelconque d'occurrences + Répétition d'un nombre non nul d'occurrences

Tableau 3.2. Opérateurs des DTD

Ces définitions sont illustrées par les exemples suivants.

<!ELEMENT elem (elem1, elem2, elem3)>

L'élément elem doit contenir un élément elem1, un élément elem2 puis un élément elem3 dans cet ordre.

<!ELEMENT elem (elem1 | elem2 | elem3)>

L'élément elem doit contenir un seul des éléments elem1, elem2 ou elem3.

<!ELEMENT elem (elem1, elem2?, elem3)>

L'élément elem doit contenir un élément elem1, un ou zéro élément elem2 puis un élément elem3 dans cet ordre.

<!ELEMENT elem (elem1, elem2*, elem3)>

L'élément elem doit contenir un élément elem1, une suite éventuellement vide d'éléments elem2 et un élément elem3 dans cet ordre.

<!ELEMENT elem (elem1, (elem2 | elem4), elem3)>

L'élément elem doit contenir un élément elem1, un élément elem2 ou un élément elem4 puis un élément elem3 dans cet ordre.

<!ELEMENT elem (elem1, elem2, elem3)*>

L'élément elem doit contenir une suite d'éléments elem1, elem2, elem3, elem1, elem2, … jusqu'à un élément elem3.

<!ELEMENT elem (elem1 | elem2 | elem3)*>

L'élément elem doit contenir une suite quelconque d'éléments elem1, elem2 ou elem3.

<!ELEMENT elem (elem1 | elem2 | elem3)+>

L'élément elem doit contenir une suite non vide d'éléments elem1, elem2 ou elem3.

3.6.1.1. Caractères d'espacement

La prise en compte des caractères d'espacement [Section 2.2.2] lors de validation d'un élément de contenu pur dépend du caractère interne ou externe de la DTD et de la valeur de l'attribut standalone de l'entête [Section 2.6.1]. Bien que le contenu d'un élément soit pur, il est, néanmoins, possible d'insérer des caractères d'espacement entre ses enfants. La validation ignore ces caractères lorsque la DTD est interne ou lorsque la valeur de l'attribut standalone est no. Ce traitement particulier rend possible l'indentation du document. Si la DTD est externe et que la valeur de l'attribut standalone est yes, la validation devient stricte et elle n'autorise aucun caractère d'espacement dans un contenu pur.

La DTD suivante déclare un élément list de contenu pur. Il contient une suite non vide d'éléments item contenant chacun du texte.

<!-- Fichier "standalone.dtd" -->

<!ELEMENT list (item)+>

<!ELEMENT item (#PCDATA)>

Le document suivant est valide pour la DTD précédente car la valeur de l'attribut standalone de l'entête est no.

Si cette valeur était yes, le document ne serait plus valide car l'élément list contient des caractères d'espacement entre ses enfants item.

DTD

<?xml version="1.0" encoding="iso-8859-1" standalone="no"?>

<!DOCTYPE list SYSTEM "standalone.dtd">

<list>

<item>Item 1</item>

<item>Item 2</item>

</list>

3.6.1.2. Contenu déterministe

Afin de simplifier la validation de documents, les expressions rationnelles qui décrivent les contenus purs des éléments doivent être déterministes. Cette contrainte signifie qu'en cours d'analyse du contenu, le nom d'un élément ne peut apparaître que sur une seule branche de l'expression. Un exemple typique d'expression ne respectant pas cette règle est la suivante.

<!ELEMENT item ((item1, item2) | (item1, item3))>

Lors de l'analyse du contenu de l'élément item, le validateur ne peut pas déterminer en lisant l'élément item1 si celui-ci provient de la première alternative (item1, item2) ou de la seconde alternative (item1, item3).

L'expression précédente peut, cependant, être remplacée par l'expression équivalente suivante qui a l'avantage d'être déterministe.

<!ELEMENT item (item1, (item2 | item3))>

Le non-déterminisme d'une expression peut aussi provenir d'un des deux opérateurs '?' ou '*'. L'expression (item1?, item1) n'est pas déterministe car il n'est pas possible de déterminer immédiatement si un élément item1 correspond à la première ou à la seconde occurrence de item1 dans l'expression. Cette expression est équivalente à l'expression (item1, item1?) qui est déterministe. Il existe toutefois des expressions sans expression déterministe équivalente comme l'expression suivante.

<!ELEMENT item ((item1, item2)*, item1)>

3.6.2. Contenu textuel

La déclaration de la forme suivante indique qu'un élément peut uniquement contenir du texte. Ce texte est formé de caractères, d'entités qui seront remplacées au moment du traitement et de sections littérales [Section 2.7.2].

<!ELEMENT element (#PCDATA)>

Dans l'exemple suivant, l'élément text est de type #PCDATA.

<?xml version="1.0" encoding="iso-8859-1"?>

<!DOCTYPE texts [

<!ELEMENT texts (text)*>

<!ELEMENT text (#PCDATA)>

]>

<texts>

<text>Du texte simple</text>

<text>Une <![CDATA[ Section CDATA avec < et > ]]></text>

<text>Des entités &lt; et &gt;</text>

</texts>

3.6.3. Contenu mixte

La déclaration de la forme suivante indique qu'un élément peut uniquement contenir du texte et les éléments element1, …, elementN. C'est la seule façon d'avoir un contenu mixte avec du texte et des éléments. Il n'y a aucun contrôle sur le nombre d'occurrences de chacun des éléments et sur leur ordre d'apparition dans le contenu de l'élément ainsi déclaré. Dans une telle déclaration, le mot clé #PCDATA doit apparaître en premier avant tous les noms des éléments.

<!ELEMENT element (#PCDATA | element1 | ... | elementN)*>

DTD

Dans l'exemple suivant, l'élément book possède un contenu mixte. Il peut contenir du texte et des éléments em et cite en nombre quelconque et dans n'importe quel ordre.

<?xml version="1.0" encoding="iso-8859-1"?>

<!DOCTYPE book [

<!ELEMENT book (#PCDATA | em | cite)*>

<!ELEMENT em (#PCDATA)>

<!ELEMENT cite (#PCDATA)>

]>

<book>

Du <em>texte</em>, une <cite>citation</cite> et encore du <em>texte</em>.

</book>

3.6.4. Contenu vide

La déclaration suivante indique que le contenu de l'élément element est nécessairement vide. Cet élément peut uniquement avoir des attributs. Les éléments vides sont souvent utilisés pour des liens entre éléments.

<!ELEMENT element EMPTY>

Des exemples d'utilisation d'éléments de contenu vide sont donnés à la section traitant des attributs de type ID, IDREF et IDREFS [Section 3.7.2].

<!ELEMENT ref EMPTY>

<!ATTLIST ref idref IDREF #REQUIRED>

Dans un souci de portabilité, il est conseillé de contracter les balises ouvrante et fermante lorsqu'un élément est déclaré de contenu vide et de le faire uniquement dans ce cas.

3.6.5. Contenu libre

La déclaration suivante n'impose aucune contrainte sur le contenu de l'élément element. En revanche, ce contenu doit, bien entendu, être bien formé et les éléments contenus doivent également être déclarés. Ce type de déclarations permet de déclarer des éléments dans une DTD en cours de mise au point afin de procéder à des essais de validation.

En revanche, ces déclarations sont déconseillées dans une DTD terminée car elles conduisent à des modèles de document trop laxistes.

<!ELEMENT element ANY>