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.
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).
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.
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 ª.
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
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.
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.
<!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.
<!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.
<!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.
<!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.
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.
<!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 Ö).
<!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 > Ö |