IV. Les DTD

 

         Le principal attrait de XML est de pouvoir structurer vos documents. Pour l'instant la structure est définie à priori, si vous décidez d'inclure un élément dans votre document rien n'oblige que cet élément, structure et/ou contenu, n'ait une utilisation particulière définie par une règle. Dans ce contexte, l'échange de vos documents avec un tiers peut devenir difficile si ce dernier n'utilise pas l'élément de la même façon.

 

IV.1 Principe d'une DTD

 

         Líutilisation de XML permet de structurer vos documents et ceci au moyen notamment des DTD (Document Type Definition).

 

a. Pourquoi faire ?

 

Une DTD va permettre de rigidifier la structure de votre document, rendre sa composition plus stricte ce qui permet alors des échanges et des créations de documents plus aisés.

La DTD est alors une sorte de grammaire de votre document XML. Le document, ou tous les documents qui s'y réfèrent doivent en tenir compte et la suivre sous peine de ne pas être validé par votre programme validateur.

C'est sur ce point que se fait la distinction entre un document ´ valide ª (qui possède et respecte une DTD) et le simple document ´ bien formé ª.

 

b. Types de DTD

 

Une DTD peut être interne ou externe.

 

ÿ    Si votre DTD est interne cela signifie que les éléments de la DTD sont directement dans le document XML que vous créez. Ces définitions doivent se situer à l'intérieur du bloc DOCTYPE.

 

ÿ    Si votre DTD est externe cela signifie que les définitions se situent dans un fichier autre que votre document XML. Ce fichier est indiqué dans le document XML (voir ci-dessous).

 

Attention

 

Les fichiers qui contiennent les DTD externes doivent posséder l'extension dtd.

 

Vous pouvez posséder les deux formes de DTD en même temps. Vous pouvez aussi définir plusieurs DTD externes dans un même document XML.

 

Une alternative à la DTD est le XML Schema.

 

IV.2 Le document XML

 

Si vous utilisez une DTD, la déclaration de votre document doit l'indiquer.

 

a. Standalone

 

Vous devez notamment modifier la valeur associée à standalone. Celle-ci doit posséder la valeur no.

 

<?xml version="1.0" standalone='no'?>

 

b. La définition du type de document

 

Vous devez aussi indiquer dans la déclaration quel type de DTD vous utilisez et où elle se situe.

Cette information doit être indiquée dans la partie type du document (DOCTYPE).

 

ÿ    DTD interne

 

<!DOCTYPE racine [

Déclaration des élements de la DTD interne

]>

 

ÿ    DTD externe

 

<!DOCTYPE racine SYSTEM "<chemin d'acces><fichier.dtd>">

 

ÿ    DTD interne et externe

 

<!DOCTYPE racine SYSTEM "<chemin d'acces><fichier.dtd>"

[

Déclaration des élements de la DTD interne

]>

 

Pour plus de détails voir le chapitre ´ Les bases d'un document XML ª.

 

 

IV.3 Structure de la DTD

 

Comme tous les éléments en XML, la DTD et les éléments qui la constituent, doivent suivre des règles précises de construction.

Avant de se lancer dans la DTD il faut déjà avoir une idée précise de ce que vous allez mettre dans votre document XML. Un certain nombre de questions doivent être posées :

Quels sont les élements et les balises associées qui sont utilisés ?

Quelles sont les relations entre ces éléments ?

...

 

a. Définition des éléments

 

Attention

 

Tous les éléments utilisés dans votre document XML doivent être déclarés dans votre DTD.

 

 

Syntaxe

 

La définition des éléments commence par le mot clé ELEMENT suivi du nom de l'élément puis du ou des contenus de cet élément.

La règle syntaxique est la suivante

 

[45]   déclŠlément  ::=  '<!ELEMENT' S Nom S specContenu  S? '>'

 

Si vous déclarez plusieurs fois le même élément, seule la première définition est prise en compte.

Vous pouvez insérer des espaces, des passages à la ligne dans la ligne qui définit un élément cela ne pose pas de problème.

 

Attention

 

Comme pour les balises dans votre document XML, la casse est très importante dans la déclaration des éléments.

 

Partie contenu

 

Le contenu peut être du texte ou un élément.

La syntaxe est la suivante

 

[46]   specContenu  ::=  'EMPTY' | 'ANY' | Mixte  | sousŠléments

[47]   sousŠléments  ::=  (choix  | séq) ('?' | '*' | '+')?

[48]   pc  ::=  (Nom  | choix  | séq) ('?' | '*' | '+')?

[49]   choix  ::=  '(' S? pc  ( S? '|' S? pc  )+ S? ')'

[50]   séq  ::=  '(' S? pc  ( S? ',' S? pc  )* S? ')'

[51]   Mixte  ::=  '(' S? '#PCDATA' (S? '|' S? Nom)* S? ')*'  | '(' S?

 '#PCDATA' S? ')'

 

Il y a 5 grands types de contenus comme le montre la règle 46 et la règle 51.

 

Mot clé

Signification

EMPTY

Les éléments dont le contenu est ´ vide ª ne possède pas de données entre le début et la fin de la balise décrivant l'élément.

Exemple

<!ELEMENT image EMPTY>

ANY

Une DTD est normalement faite pour donner une structure forte à votre document XML. Si vous ne savez pas exactement comment doit être utilisé un élément (pendant la phase de prototypage par exemple où rien n'est encore fixe), vous pouvez lui affecter le contenu ANY ce qui vous permet alors d'y inclure n'importe quoi (texte, rien, autres éléments ...).

Exemple

<!ELEMENT fourre-tout ANY>

Mixte

Un élément dont le contenu est mixte peut contenir des données textuelles et/ou d'autres éléments dont il est la racine. Les mots clés associés sont alors pour les données textuelles #PCDATA et pour les sous éléments leurs noms.

PCDATA signifie Parsed Character DATA. Les données Textuelles sont donc analysables par le parseur.

Exemple

<!ELEMENT arbre (#PCDATA | branches)>

SousŠléments

L'élément dont le contenu possède un ou plusieurs autres éléments est considéré comme leur père. Un élément caractéristique est la racine de votre document qui doit posséder dans sa définition tous les éléments utilisés dans votre document XML de premier niveau cíest à dire qui sont directement raccrochés (fils direct) à cette racine. Ces éléments peuvent être des feuilles comme des éléments contenant à nouveau díautres éléments.

Exemple

<!ELEMENT vehicule (terrestre , aerien)>

Líélément vehicule possède deux fils directs que sont terrestre et aerien.

PCDATA

Un élément peut contenir uniquement du texte. Le mot clé associé est alors pour les données textuelles #PCDATA. Cela a été vu dans la partie Mixte.

PCDATA signifie Parsed Character DATA. Les données Textuelles sont donc analysables par le parseur.

Exemple

<!ELEMENT nom_arbre (#PCDATA)>

 

 

b. Signification des caractères spéciaux dans la définition des éléments

 

En utilisant les types de contenus ci-dessus vous pouvez définir ce qui compose un élément mais rien n'indique le nombre d'occurrence de chaque contenu, la possibilité d'en avoir un ou non, l'ordre, la répétition de ce contenu ...

Pour réaliser cela il existe des caractères spéciaux à ajouter à ces contenus pour définir l'occurrence de ces derniers. Ces caractères peuvent être combinés.

On retrouve ces caractères dans les règles 47 et 50.

 

Caractères

Signification

Après les noms des éléments

?

L'élément ou le groupe d'éléments est optionnel dans la construction de l'élément que l'on définit.

Exemple

<!ELEMENT train (wagon?)>

Le train peut posséder 0 ou 1 wagon

+

L'élément ou le groupe d'éléments peut se répéter de une à x fois dans la construction de líélément que líon définit. Il doit y avoir au moins une occurrence de líélément ou du groupe dans cette construction.

Exemple

<!ELEMENT train (wagon+)>

Le train peut posséder de 1 à x wagons

*

Líélément peut être présent de multiples fois ou ne pas être présent dans la construction de líélément que líon définit.

Exemple

<!ELEMENT classes (premiere* | seconde*)+>

Líélément classes contient au moins un des éléments premiere ou seconde. Ces éléments peuvent être présent de 0 à x fois en sachant quíil faut au moins un des deux éléments présents.

Entre les noms des éléments

,

Décrit la succession des éléments qui constituent líélément que líon définit. Ces éléments doivent être présents dans le même ordre que celui de la définition.

Exemple

<!ELEMENT seconde (fumeur, non_fumeur)>

La description de líélément seconde doit contenir un élément fumeur suivit díun élément non_fumeur.

|

Ce signe (pipe) équivaut à un OU logique.

Exemple

<!ELEMENT tgv (un_etage | deux_etages)>

Líélément tgv contient soit un élément un_etage soit un élément deux_etages.

( )

Les parenthèses  permettent de combiner les éléments qui constituent la définition de líélément principal.

Exemple

Voir exemples ci-dessus

Autres ´ caractères ª spéciaux

#PCDATA

Ce terme signifie Parsed Character DATA. Un élément définit avec ce terme doit contenir du texte. Les éléments feuilles sont définis avec ce terme.

Exemple

< !ELEMENT individu (#PCDATA)>

Líélément individu contient du texte.

 

Remarque

 

Les caractères indiqués dans le tableau peuvent être combinés afin díobtenir une grammaire plus précise.

< !ELEMENT seconde (fumeur?,non_fumeur)>

Dans cet exemple, líélément seconde est constitué díun élément fumeur optionnel suivi díun élément obligatoire non_fumeur.

 

< !ELEMENT individu (#PCDATA|(prenon,nom))>

Líélément individu peut contenir soit du texte soit un élément prenom suivi díun élément nom.

 

c. Les attributs

 

Les attributs sont des informations ajoutées aux éléments. Un élément peut posséder de 0 à n attributs. Une définition est nécessaire dont la forme est la suivante :

 

[52]   DéclListeAtt  ::=  '<!ATTLIST' S Nom DéfAtt* S? '>'

[53]   DéfAtt  ::=  S  Nom  S TypeAtt  S DéclValImpl

[54]   TypeAtt  ::=  TypeChaîne  | TypeAtomique  | TypeŠnuméré

[55]   TypeChaîne  ::=  'CDATA'

[56]   TypeAtomique  ::=  'ID' | 'IDREF'  | 'IDREFS' | 'ENTITY |

'ENTITIES' | 'NMTOKEN' | 'NMTOKENS'

 

Le mot clé ATTLIST est donc suivi du nom de líélément puis díune ou plusieurs lignes décrivant le nom, le type et/ou le contenu du ou des attributs.

Les types díattributs sont les suivants :

 

Type

Signification

CDATA

A l'élément est associé un attribut comportant des données de type texte (chaîne de caractères). Ce type permet de ranger un peu níimporte quoi dans líattribut.

Exemple

<!ATTLIST TRAIN TGV CDATA "Train a Grande Vitesse">

ID

Ce type díattribut permet pour un élément de même nom de lui associer un identifiant (étiquette) unique. Ces identifiants peuvent ensuite permettre de réaliser des références croisées en utilisant líattribut IDREF. Líidentifiant peut être de contenu quelconque mais il est préférable díéviter les espaces.

Exemple

<!ATTLIST TRAIN TGV CDATA "Train a Grande Vitesse" ident ID #REQUIRED>

IDREF

Cet attribut se combine avec líattribut ID.Il permet de réaliser des liens croisés internes à partir díautres éléments vers l ëélément possédant un attribut ID.

Si aucun attribut ID ne comporte  la valeur associée à líélément, le validateur doit renvoyer une erreur.

Plusieurs éléments contenant líattribut IDREF peuvent pointer vers un même élément.

Exemple

<!ATTLIST wagon idtrain IDREF #REQUIRED>

IDREFS

Comme IDREF, il permet de réaliser un lien vers un identifiant de type ID. Les attributs de type IDREFS associent un ensemble díidentifiant (liste) séparés par un espace.

Exemple

<!ATTLIST gare idtrajets IDREFS #REQUIRED>

Une gare peut être liée à plusieurs trajets de train. Líattribut idtrajets contient alors un ensemble de références (identifiants) correspondant aux trajets passant par cette gare.

ENTITY

Ce type permet díassocier à líattribut díun élément un nom díentité externe.

Exemple

<!ATTLIST TGV photo ENTITY #IMPLIED>

Vous associez à líélément TGV un attribut qui est la photo de ce train. Cette photo est optionnelle (#IMPLIED). Il suffit alors díavoir déclaré une entité externe.

<!ENTITY img_tgv SYSTEM "IMAGES/tgv.gif">

Vous pouvez alors dans votre document xml insérer une ligne comme suit :

<TGV photo="img_tgv">

ENTITIES

Vous pouvez associer plusieurs entités externes séparées par des espaces à un attribut de type ENTITIES.

Par exemple, un élément peut pointer sur plusieurs fichiers externes.

NMTOKEN

Vous pouvez associer à un attribut de type NMTOKEN une valeur chaîne de caractère commençant par une lettre. Il ne doit pas y avoir díespace sinon líinterpréteur XML les supprime. Par contre les caractères de ponctuation sont autorisés.

Exemple

<!ATTLIST gare fichiergare NMTOKEN #REQUIRED>

NMTOKENS

Vous associez à un attribut une liste de chaînes séparées par un espace.

Type énuméré

Ce type permet de proposer un ensemble de valeur que peut prendre líattribut. Il ne peut posséder une valeur non proposée dans la liste díénumération.

Exemple

<!ATTLIST TRAIN etat (parti | arrive | a_quai) "a_quai">

NOTATION

Ce type est particulier. XML ne traite que du texte, mais il faut malgré tout offrir une possibilité díinsérer des données non ASCII cíest à dire binaire comme des images, des programmes Ö Pour cela ce type díattribut est proposé. Il indique le type du document inséré.

Exemple

<!NOTATION GIF SYSTEM "image/gif">

 

 

 

d. La valeur des attributs

 

ÿ    Valeur par défaut

 

Lorsquíun attribut níest pas spécifié dans líutilisation de l ëélément dans le document XML, vous pouvez malgré tout associer une valeur par défaut à cet attribut.

Pour cela il vous suffit lors de la déclaration dans la DTD díindiquer cette valeur entre guillemets. Cela peut être utile lorsquíun attribut prend souvent la même valeur.

 

Exemple

 

<!ATTLIST train ponctualite (en_retard  | a_l_heure) "en_retard">

Líutilisation dans votre document XML de la syntaxe suivante entraîne malgré tout líaffectation díune valeur à líattribut ponctualite même si ce dernier níest pas spécifié.

<train> Ö </train>

 

ÿ    Valeur fixe et non modifiable

 

Dans la définition díun élément au sein díune DTD, il est possible de fixer la valeur díun attribut. Cette valeur ne peut alors plus être modifiée par le rédacteur du document XML définit par cette DTD.

Pour cela il faut utiliser líoption #FIXED.

 

Exemple

 

<!ATTLIST TGV nombre_wagon (10 | 20) #FIXED "10">

Si dans le document XML, líattribut nombre_wagon possède une autre valeur que 10, une erreur est signalée.

 

ÿ    Attribut et valeur optionnels

 

La présence de líattribut au coté de líélément níest pas obligatoire. Ceci a pour effet de ne pas rendre la valeur díun attribut obligatoire dans líutilisation de líélément.

Pour cela il faut utiliser líoption #IMPLIED.

 

Exemple

 

<!ATTLIST TGV constitution (simple | double) #IMPLIED>

Líattribut constitution peut être ou ne pas être présent dans líutilisation qui est faite de líélément TGV dans le document XML.

 

ÿ    Attribut et valeur obligatoires

 

Líattribut doit être présent et il doit posséder une valeur.

Pour cela il faut utiliser líoption #REQUIRED.

 

Exemple

 

<!ATTLIST train nom_conducteur CDATA #REQUIRED>

Dans le document XML crée qui dépend de la DTD contenant cette ligne, líélément train doit obligatoirement posséder un attribut nom_conducteur qui doit lui même obligatoirement posséder une valeur.

Si ces deux obligations ne sont pas respectées, le validateur renvoie une erreur.

 

e. Ajout díimages au travers líutilisation díune DTD

 

Vous pouvez, par le biais du type díattribut NOTATION, insérer dans votre document XML, des images et plus généralement des contenus binaires ceux-ci sont alors définis dans le document XML.

 

Attention

 

Si vous ne transformez pas votre document XML en XHTML par exemple, vos images ne seront pas visibles. En effet, aucun navigateur, pour le moment, ne sait gérer cet affichage en ´ natif ª.

Malgré tout vous pouvez passer par le langage de transformation XSLT ou utiliser des images au format SVG. Ce dernier format est géré par un plugin proposé par Adobe (http://www.adobe.fr).

Les graphiques SVG ne sont rien díautres que des documents XML donc utilisables directement.

 

Avant díinsérer une image, vous devez indiquer quel est son type. Tous les types utilisés doivent être indiqués dans la DTD.

 

 Cette définition síeffectue en deux phases :

 

ÿ    Phase 1

 

Vous devez définir une entité non parsée en indiquant le type NDATA et la valeur associée.

 

Exemples

 

<!ENTITY wagon SYSTEM "IMAGES/wagon.gif" NDATA GIF>

<!ENTITY locomotive SYSTEM "IMAGES/loco.jpeg" NDATA JPEG>

<!ENTITY signal SYSTEM "SON/signal.wav" NDATA audio-wav>

<!ENTITY docpdf SYSTEM "PDF/doc.pdf" NDATA PDF>

 

ÿ    Phase 2

 

Il faut ensuite via le type díattribut NOTATION définir le type NDATA de líentité (GIF, JPEG, audio-wav, PDF Ö).

 

Exemple

 

<!NOTATION JPEG SYSTEM "image/jpeg">

 

ÿ    Exemple complet

 

La définition de la DTD et le document XML qui en découle sont dans deux fichiers différents sncf.dtd et sncf.xml.

 

o     sncf.dtd

 

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

<!ELEMENT SNCF ANY>

<!ELEMENT TGV EMPTY>

<!ATTLIST TGV photo ENTITY #IMPLIED>

<!ENTITY locomotive SYSTEM "IMAGES/loco.jpeg" NDATA JPEG>

<!NOTATION JPEG SYSTEM "image/jpeg">

 

o     sncf.xml

 

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

<!DOCTYPE SNCF PUBLIC "Jacquenod/sncf/DTD" "sncf.dtd">

<SNCF>

<TGV photo="locomotive">

</TGV>

</SNCF>

 

f. Exemples de DTD

 

ÿ    PropertyList

 

Cet exemple permet juste de montrer comment actuellement le XML est utilisé. Cet exemple est tiré de openoffice et de la déclaration des imprimantes proposées.

 

o     PropertyList.dtd

 

<!ENTITY % plistObject "(array | data | date | dict | real | integer | string | true | false )" >

<!ELEMENT plist %plistObject;>

<!ATTLIST plist version CDATA "1.0" >

 

<!-- Collections -->

<!ELEMENT array (%plistObject;)*>

<!ELEMENT dict (key, %plistObject;)*>

<!ELEMENT key (#PCDATA)>

 

<!--- Primitive types -->

<!ELEMENT string (#PCDATA)>

<!ELEMENT data (#PCDATA)> <!-- Contents interpreted as Base-64 encoded -->

<!ELEMENT date (#PCDATA)> <!-- Contents should conform to a subset of ISO 8601 (in particular, YYYY '-' MM '-' DD 'T' HH ':' MM ':' SS 'Z'.  Smaller units may be omitted with a loss of precision) -->

 

<!-- Numerical primitives -->

<!ELEMENT true EMPTY>  <!-- Boolean constant true -->

<!ELEMENT false EMPTY> <!-- Boolean constant false -->

<!ELEMENT real (#PCDATA)> <!-- Contents should represent a floating point number matching ("+" | "-")? d+ ("."d*)? ("E" ("+" | "-") d+)? where d is a digit 0-9.  -->

<!ELEMENT integer (#PCDATA)> <!-- Contents should represent a (possibly signed) integer number in base 10 -->

 

o     NoSerialNumber.xml

 

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE plist SYSTEM "file://localhost/System/Library/DTDs/PropertyList.dtd">

<plist version="0.9">

<dict>

            <key>1208/1</key>

            <string>EPSON Stylus 740, EPSON 900</string>

</dict>

</plist>

 

 

 

ÿ    Xhtml.dtd

 

Il existe de nombreuses DTD. Certaines sont plus parlantes. Par exemple, la DTD qui permet de passer du HTML au XHTML est líune de celle-ci. Ne sont indiquées que certaines parties. Le tout peut être consulté sur le site di W3c à líadresse http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd.

 

<!--

   Extensible HTML version 1.0 Strict DTD

 

   This is the same as HTML 4.0 Strict except for

   changes due to the differences between XML and SGML.

 

   Namespace = http://www.w3.org/1999/xhtml

 

   For further information, see: http://www.w3.org/TR/xhtml1

 

   Copyright (c) 1998-2000 W3C (MIT, INRIA, Keio),

   All Rights Reserved.

 

   This DTD module is identified by the PUBLIC and SYSTEM identifiers:

 

   PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"

   SYSTEM "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"

 

   $Revision: 1.1 $

   $Date: 2001/01/16 02:20:35 $

 

-->

 

Ö

 

<!--=================== Lists ============================================-->

 

<!-- Unordered list -->

 

<!ELEMENT ul (li)+>

<!ATTLIST ul

  %attrs;

  >

 

<!-- Ordered (numbered) list -->

 

<!ELEMENT ol (li)+>

<!ATTLIST ol

  %attrs;

  >

 

<!-- list item -->

 

<!ELEMENT li %Flow;>

<!ATTLIST li

  %attrs;

  >

 

<!-- definition lists - dt for term, dd for its definition -->

 

<!ELEMENT dl (dt|dd)+>

<!ATTLIST dl

  %attrs;

  >

 

<!ELEMENT dt %Inline;>

<!ATTLIST dt

  %attrs;

  >

 

<!ELEMENT dd %Flow;>

<!ATTLIST dd

  %attrs;

  >

Ö

 

<!--=================== Horizontal Rule ==================================-->

 

<!ELEMENT hr EMPTY>

<!ATTLIST hr

  %attrs;

  >

Ö

 

<!--================== The Anchor Element ================================-->

 

<!-- content is %Inline; except that anchors shouldn't be nested -->

 

<!ELEMENT a %a.content;>

<!ATTLIST a

  %attrs;

  charset     %Charset;      #IMPLIED

  type        %ContentType;  #IMPLIED

  name        NMTOKEN        #IMPLIED

  href        %URI;          #IMPLIED

  hreflang    %LanguageCode; #IMPLIED

  rel         %LinkTypes;    #IMPLIED

  rev         %LinkTypes;    #IMPLIED

  accesskey   %Character;    #IMPLIED

  shape       %Shape;        "rect"

  coords      %Coords;       #IMPLIED

  tabindex    %Number;       #IMPLIED

  onfocus     %Script;       #IMPLIED

  onblur      %Script;       #IMPLIED

  >

 

Ö

 

<!--=================== Images ===========================================-->

 

<!--

   To avoid accessibility problems for people who aren't

   able to see the image, you should provide a text

   description using the alt and longdesc attributes.

   In addition, avoid the use of server-side image maps.

   Note that in this DTD there is no name attribute. That

   is only available in the transitional and frameset DTD.

-->

 

<!ELEMENT img EMPTY>

<!ATTLIST img

  %attrs;

  src         %URI;          #REQUIRED

  alt         %Text;         #REQUIRED

  longdesc    %URI;          #IMPLIED

  height      %Length;       #IMPLIED

  width       %Length;       #IMPLIED

  usemap      %URI;          #IMPLIED

  ismap       (ismap)        #IMPLIED

  >

 

Ö

 

<!--================ Forms ===============================================-->

<!ELEMENT form %form.content;>   <!-- forms shouldn't be nested -->

 

<!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

  >

 

<!--

  Each label must not contain more than ONE field

  Label elements shouldn't be nested.

-->

<!ELEMENT label %Inline;>

<!ATTLIST label

  %attrs;

  for         IDREF          #IMPLIED

  accesskey   %Character;    #IMPLIED

  onfocus     %Script;       #IMPLIED

  onblur      %Script;       #IMPLIED

  >

 

<!ENTITY % InputType

  "(text | password | checkbox |

    radio | submit | reset |

    file | hidden | image | button)"

   >

 

<!-- the name attribute is required for all but submit & reset -->

 

<!ELEMENT input EMPTY>     <!-- form control -->

<!ATTLIST input

  %attrs;

  type        %InputType;    "text"

  name        CDATA          #IMPLIED

  value       CDATA          #IMPLIED

  checked     (checked)      #IMPLIED

  disabled    (disabled)     #IMPLIED

  readonly    (readonly)     #IMPLIED

  size        CDATA          #IMPLIED

  maxlength   %Number;       #IMPLIED

  src         %URI;          #IMPLIED

  alt         CDATA          #IMPLIED

  usemap      %URI;          #IMPLIED

  tabindex    %Number;       #IMPLIED

  accesskey   %Character;    #IMPLIED

  onfocus     %Script;       #IMPLIED

  onblur      %Script;       #IMPLIED

  onselect    %Script;       #IMPLIED

  onchange    %Script;       #IMPLIED

  accept      %ContentTypes; #IMPLIED

  >

 

<!ELEMENT select (optgroup|option)+>  <!-- option selector -->

<!ATTLIST select

  %attrs;

  name        CDATA          #IMPLIED

  size        %Number;       #IMPLIED

  multiple    (multiple)     #IMPLIED

  disabled    (disabled)     #IMPLIED

  tabindex    %Number;       #IMPLIED

  onfocus     %Script;       #IMPLIED

  onblur      %Script;       #IMPLIED

  onchange    %Script;       #IMPLIED

  >

Ö