• Aucun résultat trouvé

Déclaration d'attribut

Pour qu'un document soit valide, tout attribut présent dans la balise ouvrante d'un élément doit être déclaré. La déclaration d'attribut prend la forme générale suivante où attribut est le nom de l'attribut et element le nom de l'élément auquel il appartient. Cette déclaration comprend également le type type et la valeur par défaut default de l'attribut. Le nom de l'attribut doit être un nom XML [Section 2.2.3].

<!ATTLIST element attribut type default>

Il est possible de déclarer simultanément plusieurs attributs pour un même élément. Cette déclaration prend alors la forme suivante où l'indentation est bien sûr facultative.

<!ATTLIST element attribut1 type1 default1 attribut2 type2 default2 ...

attributN typeN defaultN>

Les différents types possibles pour un attribut ainsi que les valeurs par défaut autorisées sont détaillés dans les sections suivantes.

DTD

3.7.1. Types des attributs

Le type d'un attribut détermine quelles sont ses valeurs possibles. Les DTD proposent uniquement un choix fini de types pour les attributs. Le type doit en effet être pris dans la liste suivante. Les types les plus utilisés sont CDATA, ID et IDREF.

CDATA

Ce type est le plus général. Il n'impose aucune contrainte à la valeur de l'attribut. Celle-ci peut être une chaîne quelconque de caractères.

(value-1 | value-2 | ... | value-N)

La valeur de l'attribut doit être un des jetons [Section 2.2.3] value-1, value-2, … value-N. Comme ces valeurs sont des jetons, celles-ci ne sont pas délimitées par des apostrophes ''' ou des guillemets '"'.

NMTOKEN

La valeur de l'attribut est un jeton [Section 2.2.3].

NMTOKENS

La valeur de l'attribut est une liste de jetons séparés par des espaces.

ID

La valeur de l'attribut est un nom XML [Section 2.2.3]. Un élément peut avoir un seul attribut de ce type.

IDREF

La valeur de l'attribut est une référence à un élément identifié par la valeur de son attribut de type ID.

IDREFS

La valeur de l'attribut est une liste de références séparées par des espaces.

NOTATION

La valeur de l'attribut est une notation ENTITY

La valeur de l'attribut une entité externe non XML ENTITIES

La valeur de l'attribut une liste d'entités externes non XML

Le type le plus général est CDATA puisque toutes les valeurs correctes d'un point de vue syntaxique sont permises.

Cet type est très souvent utilisé car il est approprié dès qu'il n'y a aucune contrainte sur la valeur de l'attribut.

Les types NMTOKEN et NMTOKENS imposent respectivement que la valeur de l'attribut soit un jeton [Section 2.2.3]

ou une suite de jetons séparés par des espaces. Il est aussi possible d'imposer que la valeur de l'attribut soit dans une liste fixe de jetons. Il est impossible, avec une DTD, de restreindre les valeurs d'un attribut à une liste fixe de valeurs qui ne sont pas des jetons.

L'utilisation des trois types NOTATION, ENTITY et ENTITIES est réservée à l'usage des entités externes non XML et elle n'est pas détaillée dans cet ouvrage. L'utilisation des trois types ID, IDREF et IDREFS est développée à la section suivante.

3.7.2. Attributs de type ID , IDREF et IDREFS

Il est fréquent qu'il existe des liens entre les données d'un document XML. Il peut s'agir, par exemple, de références à d'autres parties du document. Les attributs de types ID, IDREF et IDREFS s'utilisent conjointement pour matérialiser ces liens au sein d'un document. Un attribut de type ID permet d'identifier de façon unique un élément du document. Les éléments ainsi identifiés peuvent alors être référencés par d'autres éléments grâce aux attributs de types IDREF et IDREFS. Ces attributs créent ainsi des liens entre des éléments ayant les attributs de types IDREF ou IDREFS et des éléments ayant les attributs de type ID. Ce mécanisme permet uniquement de créer des liens

DTD

entre des éléments d'un même document. La norme XLink généralise ce mécanisme. Elle permet de créer des liens entre deux, voire même plus de fragments de documents XML provenant éventuellement de documents différents.

La valeur d'un attribut de type ID doit être un nom XML [Section 2.2.3]. La valeur de cet attribut doit être unique dans tout le document. Ceci signifie qu'un autre attribut de type ID d'un autre élément ne peut pas avoir la même valeur pour que le document soit valide. Un élément ne peut avoir qu'un seul attribut de type ID.

Les attributs id de type ID sont utilisés par la fonction XPath id().

La valeur d'un attribut de type IDREF doit être un nom XML. Ce nom doit, en outre, être la valeur d'un attribut de type ID d'un (autre) élément pour que le document soit valide. La valeur d'un attribut de type IDREFS doit être une suite de noms séparés par des espaces. Chacun de ces noms doit, en outre, être la valeur d'un attribut de type ID d'un élément pour que le document soit valide.

Le document suivant illustre l'utilisation des attributs de type ID, IDREF et IDREFS qui est faite par DocBook pour les références internes. Son contenu est scindé en sections délimitées par les éléments section. Chacun de ces éléments a un attribut id de type ID. Le contenu des éléments section est constitué de texte et d'éléments ref et refs ayant respectivement un attribut idref de type IDREF et un attribut idrefs de type IDREFS.

Ces éléments permettent, dans le contenu d'une section, de référencer une (par ref) ou plusieurs (par refs) autres sections. Il faut remarquer que les éléments ref et refs n'ont jamais de contenu. Ils sont déclarés vides en utilisant le mot clé EMPTY. Il appartient à l'application qui génère le document final d'ajouter du contenu qui peut être par exemple le numéro ou le titre de la section référencée.

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

<!DOCTYPE book [

<!ELEMENT book (section)*>

<!ELEMENT section (#PCDATA | ref | refs)*>

<!ATTLIST section id ID #IMPLIED>

<!ELEMENT ref EMPTY>

<!ATTLIST ref idref IDREF #REQUIRED>

<!ELEMENT refs EMPTY>

<!ATTLIST refs idrefs IDREFS #REQUIRED>

]>

<book>

<section id="sec0">Une référence <ref idref="sec1"/></section>

<section id="sec1">Des références <refs idrefs="sec0 sec2"/></section>

<section id="sec2">Section sans référence</section>

<section id="sec3">Une auto-référence <refs idrefs="sec3"/></section>

</book>

Les attributs de type ID et IDREF permettent également de structurer un document. Si l'adresse et d'autres informations sont ajoutées à l'éditeur dans le document bibliography.xml, celles-ci sont recopiées dans chaque livre publié par l'éditeur. Cette duplication de l'information est bien sûr très mauvaise. Une meilleure approche consiste à scinder la bibliographie en deux parties. Une première partie contient les livres et une seconde partie les éditeurs avec les informations associées. Ensuite, chaque livre se contente d'avoir une référence sur son éditeur. Un attribut id de type ID est ajouté à chaque élément publisher de la seconde partie. Chaque élément publisher contenu dans un élément book est remplacé par un élément published ayant un attribut by de type IDREF.

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

<bibliography>

<books>

<book key="Michard01" lang="fr">

<title>XML langage et appplications</title>

<author>Alain Michard</author>

<year>2001</year>

<isbn>2-212-09206-7</isbn>

<url>http://www.editions-eyrolles/livres/michard/</url>

<published by="id2680397"/>

DTD

</book>

<book key="Marchal00" lang="en">

<title>XML by Example</title>

<author>Benoît Marchal</author>

<year>2000</year>

<isbn>0-7897-2242-9</isbn>

<published by="id2680427"/>

</book>

...

</books>

<publishers>

<publisher id="id2680397">

<name>Eyrolles</name>

<address>Paris</address>

</publisher>

<publisher id="id2680427">

<name>Macmillan Computer Publishing</name>

<address>New York</address>

</publisher>

...

</publishers>

</bibliography>

Beaucoup d'applications ne prennent pas en compte la DTD pour traiter un document. Il leur est alors impossible de savoir quels attributs sont de type ID, IDREF ou IDREFS. Elles utilisent souvent la convention qu'un attribut de nom id est implicitement de type ID. Une meilleure solution consiste à utiliser l'attribut xml:id [Section 2.7.4.4]

qui est toujours de type ID (de type xml:ID [Section 5.5.1.4] en fait).

3.7.3. Valeur par défaut

Chaque déclaration d'attribut précise une valeur par défaut pour celui-ci. Cette valeur par défaut peut prendre une des quatre formes suivantes.

"value" ou 'value'

La valeur value est une chaîne quelconque de caractères délimitée par des apostrophes ''' ou des guillemets '"'. Si l'attribut est absent pour un élément du document, sa valeur est implicitement la chaîne value. Cette valeur doit, bien sûr, être du type donné à l'attribut.

#IMPLIED

L'attribut est optionnel et il n'a pas de valeur par défaut. Si l'attribut est absent, il n'a pas de valeur.

#REQUIRED

L'attribut est obligatoire et il n'a pas de valeur par défaut.

#FIXED "value" ou #FIXED 'value'

La valeur value est une chaîne quelconque de caractères délimitée par des apostrophes ''' ou des guillemets '"'. La valeur de l'attribut est fixée à la valeur value donnée. Si l'attribut est absent, sa valeur est implicitement value. Si l'attribut est présent, sa valeur doit être value pour que le document soit valide.

Cette valeur doit, bien sûr, être du type donné à l'attribut.

Beaucoup d'applications ne prennent pas en compte la DTD pour traiter un document XML. Ce comportement pose problème avec les valeurs par défaut et les valeurs fixes (utilisation de #FIXED) des attributs. Si l'attribut est absent pour un élément du document, l'application va considérer que l'attribut n'a pas de valeur bien que la DTD déclare une valeur par défaut. L'utilisation des valeurs par défaut est donc à éviter pour une portabilité maximale.

3.7.4. Exemples

Voici quelques exemples de déclarations d'attributs avec, pour chacune d'entre elles, des valeurs valides et non valides pour l'attribut.

DTD

<!ATTLIST tag meta CDATA "default">

La valeur de l'attribut meta peut être une chaîne quelconque et sa valeur par défaut est la chaîne default Les exemples illustrent l'utilisation des entités prédéfinies [Section 3.5.1.2] pour inclure des caractères spéciaux dans les valeurs d'attribut.

Attribut dans le document Valeur

<tag meta="Hello World!"> Hello World!

<tag> Valeur par défaut default

<tag meta=""> Chaîne vide

<tag meta="=='&quot;=="> =='"==

<tag meta='==&apos;"=='> =='"==

<tag meta="==&lt;&amp;&gt;=="> ==<&>==

<tag meta="==&#60;&#38;&#62=="> ==<&>==

<!ATTLIST book lang (fr | en) "fr">

La valeur de l'attribut lang peut être soit le jeton fr soit le jeton en et sa valeur par défaut est le jeton fr.

Attribut dans le document Valeur

<book> Valeur par défaut fr

<book lang="fr"> Valeur par défaut fr

<book lang="en"> Jeton en

<book lang="de"> non valide car la valeur de n'est pas énumérée

<!ATTLIST book name NMTOKEN #IMPLIED>

L'attribut name est optionnel et sa valeur doit être un jeton. Il n'a pas de valeur par défaut.

Attribut dans le document Valeur

<book> Pas de valeur

<book name="en"> Jeton en

<book name="-id234"/> Jeton -id234

<book name="Hello World!"> non valide car Hello World! n'est pas un jeton

<!ATTLIST entry id ID #REQUIRED>

L'attribut id est obligatoire et sa valeur doit être un nom unique. Il n'a pas de valeur par défaut.

Attribut dans le document Valeur

<entry> non valide attribut absent

<entry id="id-234"> Nom id-234

<entry id="Hello World!"> non valide car Hello World! n'est pas un nom

<!ATTLIST xref ref IDREF #REQUIRED>

L'attribut ref est obligatoire et sa valeur doit être un nom XML. Pour que le document soit valide, ce nom doit être la valeur d'un attribut de type ID d'un (autre) élément. Cet attribut n'a pas de valeur par défaut.

Attribut dans le document Valeur

<xref ref="id-234"/> id-234

<xref ref="-id234"/> non valide car -id234 n'est pas nom.

<!ATTLIST xrefs refs IDREFS #REQUIRED>

L'attribut refs est obligatoire et sa valeur doit être une suite de noms XML séparés par des espaces. Pour que le document soit valide, chacun des noms de la liste doit être la valeur d'un attribut de type ID d'un (autre) élément. Il n'a pas de valeur par défaut.

DTD

Attribut dans le document Valeur

<xrefs refs="id-234"/> Nom id-234

<xrefs refs="id-234 id-437"/> Noms id-234 et id-437

<!ATTLIST rule style CDATA #FIXED "free">

La valeur de l'attribut style de l'élément rule est fixée à la valeur free.

Attribut dans le document Valeur

<rule> Valeur fixée free

<rule style="free"> Valeur fixée free

<rule style="libre"> non valide car valeur différente