SELFHTML

Éléments et règles d'imbrication

Page d'information: vue d'ensemble

vers le bas Généralités sur les éléments, les types d'élément et les repères
vers le bas Schéma de définition de types d'élément
vers le bas Définir des types d'éléments contenant des caractères
vers le bas Définir des types d'élément avec un contenu d'éléments
vers le bas Définir autant de répétitions que l'on veut pour un type d'élément
vers le bas Définir des types d'éléments en alternative ou facultatifs pour le contenu d'éléments
vers le bas Définir des éléments avec un contenu mixte
vers le bas Définir des éléments au contenu libre
vers le bas Définir des éléments vides sans contenu
vers le bas Récapituler des groupes d'éléments
vers le bas Exemple lié au contexte: un livre

 vers le bas 

Généralités sur les éléments, les types d'élément et les repères

Un élément est ce qui dans un langage de marquage basé sur XML est représenté par une notation comme par exemple <date_naissance>...</date_naissance>. Dans une DTD, vous pouvez définir le type d'élément qui en fait partie, donc par exemple le type d'élément date_naissance. Ce faisant, vous définissez le nom de l'élément et mentionnez quel contenu l'élément peut avoir.

Les éléments peuvent aussi être imbriqués et des règles sont possibles pour fixer à quel endroit et combien de fois un élément peut être placé. Ainsi en HTML par exemple, l'élément <tr>...</tr> ne peut être placé que dans <table>...</table>. Entre <table> et </table> vous ne pouvez en conséquence noter aucun texte mais devez respecter la structure du tableau qui exige des éléments intérieurs tels que <tr>...</tr>. Vous déterminez ces règles en définissant les types d'éléments de votre DTD.

 vers le hautvers le bas 

Schéma de définition de types d'élément

Les types d'éléments sont notés dans une DTD d'après le schéma suivant:

Schéma:

<!ELEMENT Nom(contenu)>

Explication:

La définition d'un élément commence par la parenthèse pointue d'ouverture < suivie immédiatement d'un point d'exclamation !. Derrière en majuscules suit le mot clé ELEMENT. À la suite enfin un nom pour l'élément. Vous pouvez choisir librement le nom. Il doit cependant satisfaire aux Autre page d'information règles pour les noms en XML. Derrière le nom, notez des mentions sur le contenu du type d'élément. Ces mentions peuvent être très compliquées et régir ce qui doit constituer un élément. La définition du type d'élément se termine par une parenthèse pointue de fermeture >. Les différentes parties de la définition du type d'élément sont séparées par un ou plusieurs espaces.

Vous pouvez définir une telle définition de type d'élément à n'importe quel endroit dans la DTD - avant ou après d'autres définitions comme <!ATTLIST...> (Autre page d'information attributs), <!ENTITY...> (Autre page d'information entités) ou bien <!NOTATION...> (Autre page d'information notations).

 vers le hautvers le bas 

XML1.0msie5.0 Définir des types d'éléments contenant des caractères

Contenir des caractères signifie qu'un élément peut contenir le texte que vous désirez dans la quantité que vous désirez mais sans autres éléments. Un contenu en caractères est une chaîne de caractères choisie, d'une longueur choisie donc du texte, des chiffres et des caractères spéciaux.

Exemple de DTD telephone.dtd:

<!ELEMENT telephone (#PCDATA)>

Explication:

Dans l'exemple un type d'élément est défini qui, dans l'application, pourra être noté comme élément <telephone>...</telephone>. Le vers le haut schéma de définition de types d'élément s'applique ici. Le contenu de caractères est indiqué par l'identificateur-clé #PCDATA (abréviation pour parsed character data, en français données en caractères analysées). Le signe dièse est indispensable, PCDATA doit être écrit en majuscules et le tout doit être mis entre parenthèses.

Exemple d'une application valide:

Démonstration - nouvelle fenêtre Exemple d'affichage: aperçu (un navigateur XML affiche par exemple la structure de données)

<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE telephone SYSTEM "telephone.dtd">
<telephone>123456</telephone>

Explication:

Le type d'élément telephone permet des données en caractères, une chaîne de caractères telle que 123456 est donc un contenu correct.

Attention:

L'élément telephone est dans cet exemple simplifié à l'extrême en même temps l'élément document.

#PCDATA signifie certes à peu près "autant de texte que vous voulez", mais il signifie aussi "aucun autre élément intérieur". Une application comme <telephone><gras>123456</gras></telephone> n'est donc pas permise d'après la définition de l'élément telephone. Pour ces cas là, vous devez vers le bas définir des types d'élément avec un contenu d'élément ou bien vers le bas définir des éléments avec un contenu mixte .

Le P dans PCDATA signifie, que le contenu est analysé complètement par l'analyseur syntaxique XML. En pratique, cela signifie dans le contenu d'un élément ainsi défini, s'appliquent les règles pour les Autre page d'information signes, jeux de caractères .

Dans la version 1.0 XML ne fait pas de distinction entre les différents types de données par exemple pour les données numériques ou les données alphanumériques. Le type de données PCDATA correspond au type de données alphanumériques pour les chaînes de caractères (Strings) dans les langages de programmation - il n'y a pas de type de données pour les nombres, le format de date ou autres. Cela est déjà ressenti comme gros inconvénient par les développeurs, et les versions futures de XML proposeront vraisemblablement à côté de PCDATA plusieurs types de données.

 vers le hautvers le bas 

XML1.0msie5.0 Définir des types d'élément avec un contenu d'éléments

À la différence d'un vers le haut type d'élément contenant des caractères un type d'élément avec un contenu d'éléments est un élément qui contient d'autres types d'éléments internes. Il ne peut toutefois pas contenir lui même de données en caractères mais ne comporte que des autres éléments.

Exemple de DTD annuaire.dtd:

<!ELEMENT annuaire (code_etranger, telephone)>
<!ELEMENT code_etranger (#PCDATA)>
<!ELEMENT telephone (#PCDATA)>

Explication:

Dans l'exemple trois types d'éléments sont définis. La première des trois définitions est un type d'élément avec un contenu d'éléments. Cette définition a la même construction que la définition d'un type d'élément contenant des caractères. Le vers le haut schéma de définition de types d'élément s'applique ici. La différence réside en ce que dans les parenthèses dans lesquelles est défini le contenu du type d'élément, sont notés les noms d'autres types d'éléments, séparés par des virgules.

Dans le premier des exemples ci-dessus une suite invariable d'éléments est définie pour le type d'élément annuaire; elle comprend les types d'élément code_etranger et telephone. Le type d'élément annuaire peut donc d'après la définition ci-dessus contenir exactement une fois les éléments code_etranger et telephone, et cela dans cet ordre.

Par la même occasion, l'élément annuaire de l'exemple est l'élément document, donc l'élément situé le plus à l'extérieur des données.

Exemple d'une application valide:

Démonstration - nouvelle fenêtre Exemple d'affichage: aperçu (un navigateur XML affiche par exemple la structure de données)

<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE annuaire SYSTEM "annuaire.dtd">
<annuaire>
  <code_etranger>0049</code_etranger>
  <telephone>974791003</telephone>
</annuaire>

Explication:

Les types d'élément annuaire, code_etranger et telephone sont imbriqués de la façon définie dans la DTD. Les types d'élément code_etranger et telephone ne contiennent rien d'autre que des données en caractères et ont ainsi un contenu correct.

 vers le hautvers le bas 

XML1.0msie5.0 Définir autant de répétitions que l'on veut pour un type d'élément

En l'absence de toute autre mention, un type d'élément ne peut être placé qu'une fois. Afin que l'élément d'un type d'élément puisse être noté plusieurs fois, vous devez l'exprimer dans la DTD.

Exemple de DTD recettes.dtd:

<!ELEMENT recettes (liste_ingredients, suite_instructions)>

<!ELEMENT liste_ingredients (ingredient)+>
<!ELEMENT ingredient (#PCDATA)>

<!ELEMENT suite_instructions (instruction)*>
<!ELEMENT instruction (#PCDATA)>

Explication:

L'exemple montre une DTD simple pour une recette de cuisine. Pour toutes les définitions de l'exemple, le vers le haut schéma de définition de types d'élément s'applique. Dans un premier temps, le type d'élément recettes est défini comme élément document. Ce type d'élément est un vers le haut  type d'élément avec un contenu d'éléments. Son contenu se compose des deux types d'élément liste_ingredients et suite_instructions. Ces deux types d'éléments sont définis. Tous deux comportent eux aussi un contenu d'éléments.

Le type d'élément liste_ingredients peut contenir un ou plusieurs types d'élément ingredient. La raison en est le signe plus + dans la définition derrière la mention du contenu. Par le signe plus, vous mentionnez que le contenu, dans l'exemple le type d'élément ingredient, doit être placé au moins une fois, autrement aussi souvent que souhaité dans liste_ingredients. Pour l'exemple de la recette, une telle construction est judicieuse car une recette doit comporter au moins un ingrédient.

Le type d'élément suite_instructions peut contenir de la même façon un ou plusieurs types d'élément instruction mais peut cependant également rester vide. La raison dans ce cas-ci est l'étoile * dans la définition derrière la mention du contenu. Par l'étoile, vous mentionnez que le contenu, dans l'exemple le type d'élément instruction, peut ne pas être placé, être placé une fois ou aussi souvent que souhaité dans suite_instructions. Pour l'exemple de la recette, cela signifie qu'il peut aussi y avoir des recettes avec ingrédients mais sans instructions.

Exemple d'une application valide:

Démonstration - nouvelle fenêtre Exemple d'affichage: aperçu (un navigateur XML affiche par exemple la structure de données)

<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE recettes SYSTEM "recettes.dtd">
<recettes>
  <liste_ingredients>
     <ingredient>300 g  pommes de terre épluchées</ingredient>
     <ingredient>2  poireaux</ingredient>
     <ingredient>1 oignon</ingredient>
     <ingredient>1 tb beurre</ingredient>
     <ingredient>600 ml eau</ingredient>
  </liste_ingredients>
  <suite_instructions>
     <instruction>couper les pommes de terre en petits dès.</instruction>
     <instruction>laver les poireaux, les couper en fines rondelles.</instruction>
     <instruction>éplucher l'oignon, le couper fin et le faire réduire au beurre.</instruction>
     <instruction>ajouter les pommes de terre, les poireaux et l'eau et cuire 18 à 20 minutes.</instruction>
  </suite_instructions>
</recettes>

Explication:

Les types d'éléments sont imbriqués de la façon définie dans la DTD. Les types d'éléments ingredient et instruction sont placés plusieurs fois dans liste_ingredients ou dans suite_instructions, ce qui est permis d'après la définition. Dans ingredient et dans instruction n'ont été placées en tous cas rien d'autre que des vers le haut contenus en caractères ainsi que ces types d'éléments ont été définis dans la DTD avec l'identificateur-clé #PCDATA.

Attention:

Si l'exemple ne devait contenir aucun élément du type instruction, ce qui d'après la définition serait tout à fait permis grâce à l'étoile, vous devriez malgré tout noter dans l'explication valide:
<suite_instructions></suite_instructions>
La raison en est que, lors de la définition du type d'élément recettes dans l'exemple ci-dessus, on a fixé qu'il devait comporter les deux types d'élément liste_ingredients et suite_instructions, et que ces deux types d'éléments doivent être placés, à savoir exactement une fois.

 vers le hautvers le bas 

XML1.0msie5.0 Définir des types d'éléments en alternative ou facultatifs pour le contenu d'éléments

Quand vous vers le haut définissez des types d'élément avec un contenu d'éléments, il peut arriver que cette suite rigide d'éléments que vous prévoyez pour l'élément, ne soit pas toujours appropriée dans la pratique. Pour une adresse postale par exemple, on pourrait faire la distinction alternativement entre la mention de la rue et du numéro et une mention de boite postale, et la mention du titre d'une personne est un exemple typique de mention facultative, quelque chose donc que l'on désire mentionner pour quelques adresses mais par contre pas pour d'autres.

Exemple de DTD adresses.dtd:

<!ELEMENT adresses (adresse)*>

<!ELEMENT adresse (titre?, nom, (boite_postale | numero_rue), codepostal_ville)>

<!ELEMENT titre (#PCDATA)>
<!ELEMENT nom (#PCDATA)>
<!ELEMENT boite_postale (#PCDATA)>
<!ELEMENT numero_rue (#PCDATA)>
<!ELEMENT codepostal_ville (#PCDATA)>

Explication:

L'exemple montre une DTD simple pour la gestion d'adresses. Pour toutes les définitions de l'exemple, le vers le haut Schéma de définition de types d'élément s'applique. Un type d'élément nommé adresses est défini comme élément document. Celui-ci peut contenir vers le haut autant de répétitions que l'on veut pour le type d'élément adresse. Le type d'élément adresse vers le haut définit un type d'élément avec un contenu d'éléments. Le contenu comprend différents types d'éléments pour les différentes données d'une adresse . Ces types d'élément sont vers le haut définis comme types d'éléments contenant des caractères tout simples.

Le titre est défini dans l'exemple comme étant facultatif. Cela est permis par le point d'interrogation ? placé dans la définition derrière la mention de contenu prés du nom du type d'élément. La simple notation de titre définirait l'utilisation du type d'élément comme étant absolument indispensable, alors que la mention titre? désigne son utilisation comme étant facultative.

Par ailleurs il a été défini dans l'exemple que le choix est possible entre une mention de boite postale ou d'adresse géographique. Pour cela, les types d'éléments au choix sont mis dans de nouvelles parenthèses. Dans ces parenthèses les types d'élément au choix sont notés, séparés par une barre verticale |.

Exemple d'une application valide:

Démonstration - nouvelle fenêtre Exemple d'affichage: aperçu (un navigateur XML affiche par exemple la structure de données)

<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE adresses SYSTEM "adresses.dtd">
<adresses>
<adresse>
  <nom>Société Générale</nom>
  <boite_postale>7001</boite_postale>
  <codepostal_ville>13100 Aix en Provence</codepostal_ville>
</adresse>
<adresse>
  <titre>Monsieur</titre>
  <nom>Luc Minighetti</nom>
  <numero_rue>112 rue de Lyon</numero_rue>
  <codepostal_ville>13000 Marseille</codepostal_ville>
</adresse>
</adresses>

Explication:

Dans l'exemple, deux adresses sont notées. La première adresse est celle d'une banque, pour cette raison, le titre peut être omis pour cette adresse, car il n'est nécessaire que pour des personnes. Étant donné que le type d'élément titre a été défini comme facultatif, l'omission est possible. Dans l'exemple de la banque l'adresse est une boite postale. Étant donné qu'à cet endroit d'après la définition, soit le type d'élément boite_postale soit le type d'élément numero_rue peuvent être placés, l'application est correcte. Pour la deuxième adresse, il s'agit de celle d'une personne. Dans ce cas, le titre est noté et à la place d'une boite postale, une mention de rue et de numéro dans l'élément en alternative numero_rue.

Attention:

Pour les types d'élément au choix, vous pouvez mentionner aussi bien sûr plus de deux types d'éléments.

 vers le hautvers le bas 

XML1.0msie5.0 Définir des éléments avec un contenu mixte

Quand vous désirez définir des applications XML dans lesquelles ne doivent pas être groupés de façon si rigide, mais peuvent être notés dans un ordre relativement libre, - comme par exemple en HTML - alors, vous devez définir des éléments avec un contenu mixte. En HTML <body>...</body> en est un tel élément typique. Dans cet élément, vous pouvez noter la plupart des autres éléments HTML dans un ordre relativement libre et en respectant quelques règles d'imbrication peu nombreuses. Pour les applications qui sont en général moins orientées sur les bases de données pour l'être davantage sur le texte libre, vous avez besoin de ces contenus mixtes.

Exemple de DTD texte.dtd:

<!ELEMENT texte (#PCDATA | menace | rire | question | cynique)*>
<!ELEMENT menace (#PCDATA)>
<!ELEMENT rire (#PCDATA | clignant_oeil)*>
<!ELEMENT question (#PCDATA)>
<!ELEMENT clignant_oeil (#PCDATA)>
<!ELEMENT cynique (#PCDATA)>

Explication:

L'exemple représente une DTD pour du texte dans lequel les émotions sont signalées comme telles. Pour toutes les définitions de l'exemple, le vers le haut schéma de définition de types d'élément s'applique. Une type d'élément nommé texte est défini comme élément document avec contenu mixte. Vous déterminez un contenu mixte en notant pour le contenu de l'élément, donc entre parenthèses, l'identificateur-clé #PCDATA pour des vers le haut contenus de caractères et en plus une série de types d'élément autorisés pour d'autres vers le haut types d'élément avec un contenu d'éléments. Les mentions doivent être séparés par la barre verticale | pour vers le haut des types d'éléments en alternative. Par ailleurs tout le contenu doit recevoir à la fin l'étoile comme dans l'exemple * pour vers le haut autant de répétitions que l'on veut . Ainsi, chacun de ces éléments peut être répété à souhait dans le passage dans lequel il est permis. Un contenu mixte est donc une combinaison de toutes les possibilités de définition traitées jusqu'ici.

Dans l'exemple les autres types d'éléments notés pour texte sont définis de la même façon. À l'exception du type d'élément rire il n'a été permis pour tous les types d'élément rien d'autre que des contenus de caractères (#PCDATA). Le type d'élément rire correspond par contre lui aussi au modèle pour contenu mixte. Outre le contenu de caractères purs un autre type d'élément clignant_oeil est permis dans ce type d'élément .

Exemple d'une application valide:

Démonstration - nouvelle fenêtre Exemple d'affichage: aperçu (un navigateur XML affiche par exemple la structure de données)

<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE text SYSTEM "texte.dtd">
<texte>
Quelquefois la conscience nous dit: <menace>tu dois penser
 davantage aux femmes et aux hommes.</menace>
Alors, bien sûr, on se demande parfois
, <question>pourquoi il y a là tant
matière à reflexion,</question>
mais quelquefois aussi, on obéit et réfléchit.
La femme dit à l'homme: <rire>Oh chéri, <clignant_oeil>tu vaux
ton poids d'or!</clignant_oeil></rire>
Et l'homme répond: <cynique>Oui, parceque je pousse le chariot  et que j'y ai mis une pièce de dix francs!</cynique>
La femme rétorque: <rire>tu as tout compris!</rire>
</texte>

Explication:

L'exemple d'application contient l'élément document <texte>..</text> qui contient un contenu mixte typique. Du texte normal est placé (données en caractères) mais également des autres éléments. L'élément rire est placé deux fois en tout. Cela pourrait tout aussi bien être l'élément menace qui serait utilisé deux ou plusieurs fois dans l'élément texte. Cela est permis en raison de l'utilisation de l'étoile * lors de la définition de tous les types d'élément intérieurs. L'élément clignant_oeil est placé à l'intérieur de rire comme c'est permis par la DTD - à l'extérieur il ne pourrait cependant pas être placé.

 vers le hautvers le bas 

XML1.0msie5.0 Définir des éléments au contenu libre

Les éléments au contenu libre sont une forme plus souple encore des éléments à contenu mixte. Il s'agit ici plus ou moins d'éléments joker ou passe-partout, dont le contenu n'est pas du tout fixé. Tous les autres types d'élément définis dans la DTD peuvent être placés dans un élément au contenu libre.

Exemple de DTD anytext.dtd:

<!ELEMENT anytext ANY>
<!ELEMENT anglais (#PCDATA)>
<!ELEMENT italiano (#PCDATA)>

Explication:

Pour toutes les définitions de l'exemple, le vers le haut schéma de définition de types d'élément s'applique. Par le mot clé ANY (en majuscules) au lieu de la définition concrète du contenu d'un élément, vous mentionnez que cet élément (dans l'exemple l'élément document) peut contenir des vers le haut contenus de caractères et des vers le haut types d'élément avec un contenu d'éléments. Dans l'exemple, deux autres types d'éléments sont définis qui peuvent être eux aussi placés.

Exemple d'une application valide:

Démonstration - nouvelle fenêtre Exemple d'affichage: aperçu (un navigateur XML affiche par exemple la structure de données)

<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE anytext SYSTEM "anytext.dtd">
<anytext>
c'est un peu de  texte qui signifie en anglais:
<anglais>this is some text</anglais> et en italien:
<italiano>ciò è un certo testo</italiano>
</anytext>

Explication:

Dans l'exemple l'élément document <anytext>...</anytext> est défini. Des données en caractères et tous les autres éléments de votre choix pour lesquels un type d'élément existe dans la DTD peuvent y être placés. L'exemple montre un mélange simple.

 vers le hautvers le bas 

XML1.0msie5.0 Définir des éléments vides sans contenu

Les éléments vides sont ceux qui n'ont pas de contenu. En HTML classique par exemple <br> ou bien <img> font partie de ce genre d'éléments. En HTML on les appelle aussi éléments autonomes. Dans la philosophie de XML, à vrai dire, un contenu est prévu pour chaque élément. Quand vous voulez définir des types d'élément qui n'ont pas de contenu, vous devez le mentionner spécialement. Même la notation des éléments dans l'application indique qu'il s'agit d'un cas particulier.

Exemple de DTD lignes_texte.dtd:

<!ELEMENT lignes_texte (#PCDATA | nouvelle_ligne)*>
<!ELEMENT nouvelle_ligne EMPTY>

Explication:

Dans l'exemple, deux types d'élément sont définis: un type d'élément lignes_texte pour l'élément document avec vers le haut un contenu mixte, et un type d'élément nouvelle_ligne qui peut être placé à volonté dans le type d'élément lignes_texte . Pour les deux définitions de l'exemple, le vers le haut Schéma de définition de types d'élément s'applique.

Le type d'élément nouvelle_ligne est ici un type d'élément vide. Cela est signalé par le mot clé EMPTY (en français: vide) à l'endroit où le contenu du type d'élément est défini.

Exemple d'une application valide:

Démonstration - nouvelle fenêtre Exemple d'affichage: aperçu (un navigateur XML affiche par exemple la structure de données)

<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE lignes_texte SYSTEM "lignes_texte.dtd">
<lignes_texte>
Ceci est le texte, mais où commence la  <nouvelle_ligne />
nouvelle ligne?
</lignes_texte>

Explication:

Dans l'exemple l'élément sans contenu est noté conformément aux Autre page d'information règles pour les repères, attributs, affectations de valeur. La transcription de la signification de "nouvelle_ligne" peut naturellement n'être assurée que par un langage de style comme les CSS ou XSL.

 vers le hautvers le bas 

XML1.0msie5.0 Récapituler des groupes d'éléments

Pour la création de DTD plus importantes avec de nombreux types d'éléments, vous remarquerez vite qu'il y a beaucoup de répétitions en particulier pour les contenus de types d'éléments. De nombreux types d'éléments forment souvent d'un point de vue logique un groupe de caractéristiques communes qui peut être placé enfermé comme contenu d'élément de plusieurs autres éléments qui lui sont hiérarchiquement supérieurs. Pour ces cas-là, la syntaxe DTD offre la possibilité de récapituler ces types d'éléments dans de tels groupes logiques. Un groupe logique de types d'élément est désigné comme paramètre entité. La mise en œuvre de paramètres entités augmente la lisibilité dans des DTD complexes ainsi que la convivialité pour les modifications. Cette possibilité est décrite dans la partie sur les Autre page d'information paramètres entités pour DTD plus complexes.

 vers le hautvers le bas 

XML1.0msie5.0 Exemple lié au contexte: un livre

Pour représenter les relations et règles complexes lors de la définition de types d'élément, il est important de se poser les bonnes questions et de se faire un modèle d'éléments prévus.

Beaucoup de structures de données affichent une forte hiérarchie logique. C'est ce que l'exemple d'un livre met bien en lumière. Un livre comprend de façon typique des chapitres, des index, des pages spéciales comme les informations, des titres etc... Chaque chapitre comporte un titre de chapitre et des sections. Chaque section comprend un titre de section et le contenu de la section. Un contenu de section peut contenir des choses comme des paragraphes de texte normaux, des énumérations, des références de graphique etc.... Chaque paragraphe de texte courant, chaque point d'une énumération peut contenir des lignes de texte avec des formatages spéciaux par exemple pour les caractères gras, l'écriture en italique etc.... L'idéal pour de telles structures de données est de penser lors de la création des types d'éléments et de leurs relations du plus général (le livre) au plus particulier ( le terme en caractères gras au milieu d'un paragraphe). XML soutient particulièrement bien ce genre de structures de données fortement hiérarchisées étant donné qu'un document d'après la philosophie de XML peut être représenté sous forme d'une arborescence. La transcription d'une structure d'éléments fortement hiérarchisée dans une DTD XML est donc également relativement simple tout en pouvant bien être retracée.

Exemple de DTD livre.dtd:

<!ENTITY % texte "rehausse | remarque | exigeant | passage_ligne">

<!ELEMENT livre                   (titre,informations,index_contenu,(chapitre)+,index_motscles)>

<!ELEMENT titre                  (titre_principal,soustitre)>
<!ELEMENT titre_principal             (#PCDATA)>
<!ELEMENT soustitre             (#PCDATA)>

<!ELEMENT informations              (cip,copyright,editeur)>
<!ELEMENT cip                    (#PCDATA | %texte;)*>
<!ELEMENT droits_auteur              (#PCDATA | %texte;)*>
<!ELEMENT editeur                 (#PCDATA | %texte;)*>

<!ELEMENT index_contenu     (titre_ic,(mentionchap_ic | mentionsection_ic)*)>
<!ELEMENT titre_ic       (#PCDATA)>
<!ELEMENT mentionchap_ic     (#PCDATA)>
<!ELEMENT mentionsection_ic  (#PCDATA)>

<!ELEMENT chapitre                (titre_chapitre,(section)+)>
<!ELEMENT titre_chapitre       (#PCDATA)>

<!ELEMENT section              (titre_section,(texte_courant | enumeration | graphique)+)>
<!ELEMENT titre_section        (#PCDATA)>

<!ELEMENT texte_courant             (#PCDATA | %texte;)*>
<!ELEMENT enumeration            (point_enumeration)+>
<!ELEMENT point_enumeration      (#PCDATA | %texte;)*>
<!ELEMENT graphique                 (fichier_graphique)>
<!ELEMENT fichier_graphique            (#PCDATA)>

<!ELEMENT index_motscles   (titre_imc,(mention_imc)*)>
<!ELEMENT titre_imc       (#PCDATA)>
<!ELEMENT mention_imc            (#PCDATA)>

<!ELEMENT rehausse          (#PCDATA)>
<!ELEMENT remarque             (#PCDATA)>
<!ELEMENT exigeant            (#PCDATA)>
<!ELEMENT passage_ligne          EMPTY>

Exemple d'une application valide

Démonstration - nouvelle fenêtre Exemple d'affichage: aperçu (un navigateur XML affiche par exemple la structure de données)

<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE livre SYSTEM "livre.dtd">
<?xml:stylesheet type="text/css" href="livre.css" ?>

<livre>

<titre>
<titre_principal>Je suis Valentin</titre_principal>
<soustitre>Comment ma vie est devenue ce qu'elle est</soustitre>
</titre>

<informations>
<cip>Bibliothèque nationale de France -unite_commande-CIP:<passage_ligne />
titre disponible à la  bibliothèque nationale de France</cip>
<droits_auteur>©2000 tous droits réservés chez l'éditeur</droits_auteur>
<editeur>Mon édition, Derrière la rotonde</editeur>
</informations>

<index_contenu>
<titre_ic>index_contenu</titre_ic>

<mentionchap_ic>Mes jeunes années</mentionchap_ic>
<mentionsection_ic>enfance</mentionsection_ic>
<mentionsection_ic>jeunesse</mentionsection_ic>

<mentionchap_ic>Comment je suis devenu un homme</mentionchap_ic>
<mentionsection_ic>Le premier amour</mentionsection_ic>

</index_contenu>

<chapitre>
<titre_chapitre>Mes jeunes années</titre_chapitre>

<section>
<titre_section>Enfance</titre_section>

<texte_courant>
Mon enfance comprend deux sections de m vie:
</texte_courant>

<enumeration>
<point_enumeration>- l'âge du nourrisson</point_enumeration>
<point_enumeration>- l'âge du garçonnet</point_enumeration>
</enumeration>

</section>

<section>
<titre_section>Jeunesse</titre_section>

<texte_courant>Ma jeunesse se résume pour l'essentiel à l'acné juvénile.
</texte_courant>

</section>

</chapitre>

<chapitre>
<titre_chapitre>Comment je suis devenu un homme</titre_chapitre>

<section>
<titre_section>Le premier amour</titre_section>

<texte_courant>Sie <rehausse>surgit</rehausse>, <rehausse>se vécut</rehausse>, et <rehausse>s'en fut</rehausse> à nouveau.
</texte_courant>

<graphique>
<fichier_graphique>premieramour.tif</fichier_graphique>
</graphique>

</section>

</chapitre>

<index_motscles>
<titre_imc>Index des mots clé</titre_imc>

<mention_imc>acné</mention_imc>
<mention_imc>amour</mention_imc>
<mention_imc>enfance</mention_imc>
<mention_imc>jeunesse</mention_imc>
<mention_imc>nourrisson</mention_imc>

</index_motscles>

</livre>

Explication:

L'exemple ne peut bien sûr ne détailler que de façon grossière un livre complet - si vous essayez effectivement de décrire une structure de livre complète avec XML, vous aurez certainement besoin d'encore plus de détails. L'exemple veut simplement montrer de quoi une telle description doit avoir l'air dans son principe.

Dans l'exemple, un Autre page d'information paramètre entité pour DTD plus complexes est défini dans un premier temps. Quatre types d'élément rehausse, remarque, exigeant et passage_ligne y sont récapitulés; ils peuvent être placés dans différents paragraphes de texte.

Le reste de la DTD comporte la définition des types d'éléments désirés. L'ordre n'a à vrai dire pas grande importance, pourtant l'exemple respecte une certaine logique et essaie d'aller du plus général au particulier. L'élément dans lequel tout le livre se trouve est défini avec le nom livre. L'élément est un vers le haut type d'élément avec un contenu d'éléments. Les types d'éléments titre, informations, index_contenu et index_motscles peuvent y être placés une fois exactement, et cela dans l'ordre noté. En fait, le type d'éléments chapitre situé dans la suite indiquée entre index_contenu et index_motscles, doit être placé au moins une fois et peut être placé avec vers le haut autant de répétitions que l'on veut . La structure de base du livre est ainsi fixée.

Les passages titre et informations contiennent comme contenus d'élément, les types d'élément correspondants. Pour les types d'élément subordonnés à informations le paramètre entité défini est d'abord utilisé. Les types d'élément correspondants rehausse, remarque, exigeant et passage_ligne peuvent être placé à volonté dans cip, droits_auteur et editeur. Les autres passages du livre se divisent en différents types d'élément d'après un schéma semblable.

 vers le haut
page suivante Autre page d'information Attributs et affectation de valeurs
page précédente Autre page d'information Règles de traitement pour les DTD
 

© 2001 Stefan Münz / © 2003 Traduction Adresse électronique Serge François, 13405@free.fr
Adresse électronique selfhtml@fr.selfhtml.org