Une balise est un identifiant entouré par les caractères inférieur < et supérieur >. Par exemple <MaBalise>.
La structure Dtd peut être soit :
La grammaire Dtd est un flux au format texte Ascii balisé utilisant aussi une structure bien définie.
Ainsi, la Dtd est un flux Sgml particulier.
Voici les conventions lexicales :
<-- et -->. Par exemple :
<-- Ceci est un commentaire.
Ceci est un second commentaire. -->
'Ceci est ma chaîne.'
Ceci est ma seconde chaîne."
JJ-MON-AAAA HH:MM:SS. Par exemple :
30-JAN-2008 21:42:30"
123456
-123456
MonIdentifiant
mon-identidiant
123.456
-1.23456E3
Voici les concepts sémantiques :
Une définition d'entité est utilsable dans la Dtd si son nom est précédé du caractère pourcent % .
Enfin, une entité permet d'utiliser les caractères réservés au Sgml avec une syntaxe spéciale :
| Caractère réservé. | Syntaxe. |
< | < |
> | > |
& | & |
" | " |
' | ' |
| Caractère donné par son code hexadécimal. | &#CodeHexadecimal; |
Exemple : <MonElement> < > & " ' ) </MonElement>
Il est possible de définir ses propres entités qui tiennent alors lieu de paramètres. Par exemple :
<!ENTITY MonEntite SYSTEM MaValeur">
<!MaBalise>Ceci est mon entité &MonEntite;</MaBalise>
La zone de texte peut être soit :
#PCDATA.
<![RCDATA[ et ]]>.
#RCDATA.
<![CDATA[ et ]]>.
#CDATA.
Les balises d'ouverture et de fermeture sont signalées par deux caractères soit soustraction - quand l'une ou l'autre est obligatoire ou soit O quand l'une ou l'autre est facultative.
Un élément peut :
<MonElement2/>.
<!ELEMENT MonElement1 - - EMPTY>.
<MonElement1>Ceci est mon contenu</MonElement1>.
#CDATA, #PCDATA et #RCDATA présentés dans la section précédente.
ANY pour signifier n'importe quel contenu - rien, texte ou balises.
(A) pour isoler une sous-expression régulière - La balise A dans l'exemple.
A , B pour reconnaître en séquence deux sous-expressions régulières - Les balises A et B dans l'exemple.
A | B pour reconnaître une de deux sous-expressions régulières - Les balises A et B dans l'exemple.
A? pour reconnaître zéro ou une occurrence d'une sous-expression régulière - La balise A dans l'exempleans l'exemple.
A pour reconnaître exactement une occurrence d'une sous-expression régulière - La balise A dans l'exemple.
A* pour reconnaître zéro, une ou plusieurs occurences d'une sous-expression régulière - La balise A dans l'exemple.
A+ pour reconnaître une ou plusieurs occurences d'une sous-expression régulière - La balise A dans l'exemple.
<!ELEMENT MonElement1 - - #PCDATA>.
La syntaxe d'un attribut dans le flux Sgml est une affectation d'une valeur entre caractères guillemet " ou apostrophe ' au nom de l'attribut :
<MonElement MonAttributA=..." MonAttributB=..." MonAttributC=...">...</MonElement>
Un attribut possède un type :
| Type. | Syntaxe. |
| Enuméré. | ( Valeur1 , ... , ValeurN ) |
| Valeur libre. | CDATA |
| Identifiant unique. | ID |
| Identifiant d'un attribut d'un autre élement. | IDREF |
| Liste d'identifiants des attributs d'autres élements. | IDREFS |
| Identificateur - Un nom. | NMTOKEN |
| Liste d'identificateur. | NMTOKENS |
| Nombre entier. | NUMBER |
| Nom d'une entité Sgml. | ENTITY |
| Liste de noms d'entités Sgml. | ENTITIES |
| Notation Sgml. | NOTATION |
Un attribut possède une valeur :
| Valeur. | Syntaxe. |
| Valeur par défaut. | Valeur |
| Dernière valeur utilisée. | #CURRENT |
| Valeur obligatoire. | #REQUIRED |
| Valeur facultative. | #IMPLIED |
| Valeur imposée. | #FIXED Valeur |
La syntaxe pour sa déclaration dans la Dtd est : <!ATTLIST MonElement MonAttribut Type ValeurParDefaut >.
Par exemple :
<!ATTLIST MonAttributA CDATA Ma valeur">
<!ATTLIST MonAttributB ID #REQUIRED>
<!ATTLIST MonAttributC NOTATION (ImageGif|ImagePng) #REQUIRED >
NDATA.
Par exemple :
<!NOTATION ImageGif SYSTEM file://programs/gif.exe">
! DOCTYPE sert à inclure ou référencer un Dtd dans un flux Sgml.
<!DOCTYPE ListeEmployes SYSTEM ${UPS_HOME}/upsedi/resources/${UPS_LANGUAGE}/mon-dtd.dtd">
? NomDeLaBalise sert à inclure une directive à destination de l'application utilisant le flux Sgml. Elle est transmise par le décodeur Sgml.<? UpsMxr:DefinitionsProgramme
Source Composant Exemple d'emploi d'Up ! Mixer et Up ! Sgml" Version 4.0.0;
ImporterModule
/************/
UpsQry(<UpsQry.upi>, ImporterDefinitions);
UpsOra(<UpsOra.upi>, ImporterDefinitions);
?>
<![ INCLUDE [ et ]]> sert à inclure les définitions de la Dtd.<![ IGNORE [ et ]]> sert à ignorer les définitions de la Dtd.Seules ces deux versions utilisent une grammaire au format Document Type Definition (DTD).
Voici les restrictions à apporter au standard Smgl pour être compatible avec le standard Xml 1.0 ou 1.1 :
<?xml version=1.1" encoding=UTF-8" standalone=no" ?>
xml ou XML sont réservés.xml:space=default, les séparateurs sont gérés comme en Sgml i.e. ignorés.xml:space=preserve, les séparateurs sont préservés i.e. transmis à l'application.xml:lang=fr".
LexemeDtd :
...
| <! ELEMENT NomDeLElement ExpressionContenuElement >
...
Et la syntaxe de Xml est :
LexemeXml :
...
| < NomDeLaBalise ListeDeProprietesSgmlOption >
ListeDeLexemesSgmlOption
< / NomDeLaBalise>
| < / NomDeLaBalise ListeDeProprietesSgmlOption >
...
CURRENT, NUMBER et RCDATA ne sont pas supportées.<-- Commentaire --><![ IGNORE [ ContenuLibre ]]><![ INCLUDE [ ListeDeLexemesDtdOption ]]><! ATTLIST NomDeLElement ListeDAttributs ><! ELEMENT ListeDElements OptionBalise OptionBalise ExpressionContenuElement ><! ENTITY PrefixeEntiteOption NomDeLEntite ValeurEntite ><! NOTATION NomDeLaNotation SuiteNotation >%PUBLIC Description URISYSTEM URI SuiteValeurEntiteNDATA NomDeLaNotation( ListeDElements2 ), NomDeLElement-OANY#CDATAEMPTY#PCDATA#RCDATA( ExpressionContenuElement ) NbOccurrencesOption, ExpressionContenuElement| ExpressionContenuElement- ExpressionContenuElement+ ExpressionContenuElement?+*, AttributAttribut :
CDATAIDIDREFENTITYENTITIESNUMBERNOTATION ( ListeDeValeursAttribut )NMTOKENNMTOKENS)| ValeurAttribut& NomDeLEntite ;#CURRENT#IMPLIED#FIXED ValeurAttribut#REQUIREDPUBLIC Description URISYSTEM URI SuiteValeurEntite<! DOCTYPE NomBaliseRacine DtdExterne DtdInterne >PUBLIC Description URISYSTEM URI[ ListeDeLexemesDtdOption ]<![ CDATA [ ContenuLibreSansCrochetsFermants ]]><![ IGNORE [ ContenuLibreSansCrochetsFermants ]]><![ INCLUDE [ ContenuSgmlOption ]]><![ PCDATA [ ContenuSgmlOption ]]><![ RCDATA [ ContenuLibreSansCrochetsFermants ]]><-- CommentaireSansSoustrations -->Balise :
< NomBalise ListeDAttributsOption SuiteBalise: NomBaliseAttribut :
= ValeurAttribut: NomAttribut' ContenuEntreApostrophes '" ContenuEntreGuillemets "''Entite :
& amp ;& apos ;& gt ;& lt ;& quot ;& # CodeUnicode ;""/>> ContenuSgml < / NomBalise >
<!ELEMENT ListeEmployes - - Employe*>
<!ELEMENT Employe - - (Nom,Numero,Salaire,DateDEmbauche)>
<!ATTLIST Employe Numero - - CDATA #REQUIRED>
<!ELEMENT Nom - - #PCDATA>
<!ELEMENT Salaire - - #PCDATA>
<!ELEMENT DateDEmbauche - - #PCDATA>
<!DOCTYPE ListeEmployes SYSTEM "file://${UPS_HOME}/upsedi/resources/${UPS_LANGUAGE}/employe-sgml.dtd">
<ListeEmployes>
<Employe Numero=7724>
<Nom>Mister Scott</Nom>
<Salaire>1000.0</Salaire>
<DateDEmbauche>28-DEC-2005 10:50:00</DateDEmbauche>
</Employe>
<Employe Numero=7832>
<Nom>Mister Allen</Nom>
<Salaire>1200.0</Salaire>
<DateDEmbauche>26-JAN-2002 11:09:10</DateDEmbauche>
</Employe>
<Employe Numero=7948>
<Nom>Lady Smith</Nom>
<Salaire>1400.0</Salaire>
<DateDEmbauche>10-JAN-2004 15:22:20</DateDEmbauche>
</Employe>
<Employe Numero=7954>
<Nom>Miss King</Nom>
<Salaire>2000.0</Salaire>
<DateDEmbauche>01-AVR-2003 08:12:20</DateDEmbauche>
</Employe>
</ListeEmployes>
<!DOCTYPE ListeEmployes
[
<!ELEMENT Employe - - (Nom,Numero,Salaire,DateDEmbauche)>
<!ATTLIST Employe Numero CDATA #REQUIRED>
<!ELEMENT Nom - - #PCDATA>
<!ELEMENT Salaire - - #PCDATA>
<!ELEMENT DateDEmbauche - - #PCDATA>
]>
<ListeEmployes>
<Employe Numero=7724>
<Nom>Mister Scott</Nom>
<Salaire>1000.0</Salaire>
<DateDEmbauche>28-DEC-2005 10:50:00</DateDEmbauche>
</Employe>
<Employe Numero=7832>
<Nom>Mister Allen</Nom>
<Salaire>1200.0</Salaire>
<DateDEmbauche>26-JAN-2002 11:09:10</DateDEmbauche>
</Employe>
<Employe Numero=7948>
<Nom>Lady Smith</Nom>
<Salaire>1400.0</Salaire>
<DateDEmbauche>10-JAN-2004 15:22:20</DateDEmbauche>
</Employe>
<Employe Numero=7954>
<Nom>Miss King</Nom>
<Salaire>2000.0</Salaire>
<DateDEmbauche>01-AVR-2003 08:12:20</DateDEmbauche>
</Employe>
</ListeEmployes>
<?xml version="1.1" encoding="UTF-8" standalone="no" ?>
<!ELEMENT ListeEmployes Employe*>
<!ELEMENT Employe (Nom,Numero,Salaire,DateDEmbauche)>
<!ATTLIST Employe Numero CDATA #REQUIRED>
<!ELEMENT Nom #PCDATA>
<!ELEMENT Salaire #PCDATA>
<!ELEMENT DateDEmbauche #PCDATA>
<?xml version="1.1" encoding="UTF-8" standalone="no" ?>
<!DOCTYPE ListeEmployes SYSTEM "file://${UPS_HOME}/upsedi/resources/${UPS_LANGUAGE}/employe-xml.dtd">
<ListeEmployes>
<Employe Numero=7724>
<Nom>Mister Scott</Nom>
<Salaire>1000.0</Salaire>
<DateDEmbauche>28-DEC-2005 10:50:00</DateDEmbauche>
</Employe>
<Employe Numero=7832>
<Nom>Mister Allen</Nom>
<Salaire>1200.0</Salaire>
<DateDEmbauche>26-JAN-2002 11:09:10</DateDEmbauche>
</Employe>
<Employe Numero=7948>
<Nom>Lady Smith</Nom>
<Salaire>1400.0</Salaire>
<DateDEmbauche>10-JAN-2004 15:22:20</DateDEmbauche>
</Employe>
<Employe Numero=7954>
<Nom>Miss King</Nom>
<Salaire>2000.0</Salaire>
<DateDEmbauche>01-AVR-2003 08:12:20</DateDEmbauche>
</Employe>
</ListeEmployes>
<?xml version="1.1" encoding="UTF-8" standalone="no" ?>
<!DOCTYPE ListeEmployes
[
<!ELEMENT Employe (Nom,Numero,Salaire,DateDEmbauche)>
<!ATTLIST Employe Numero CDATA #REQUIRED>
<!ELEMENT Nom #PCDATA>
<!ELEMENT Salaire #PCDATA>
<!ELEMENT DateDEmbauche #PCDATA>
]>
<ListeEmployes>
<Employe Numero=7724>
<Nom>Mister Scott</Nom>
<Salaire>1000.0</Salaire>
<DateDEmbauche>28-DEC-2005 10:50:00</DateDEmbauche>
</Employe>
<Employe Numero=7832>
<Nom>Mister Allen</Nom>
<Salaire>1200.0</Salaire>
<DateDEmbauche>26-JAN-2002 11:09:10</DateDEmbauche>
</Employe>
<Employe Numero=7948>
<Nom>Lady Smith</Nom>
<Salaire>1400.0</Salaire>
<DateDEmbauche>10-JAN-2004 15:22:20</DateDEmbauche>
</Employe>
<Employe Numero=7954>
<Nom>Miss King</Nom>
<Salaire>2000.0</Salaire>
<DateDEmbauche>01-AVR-2003 08:12:20</DateDEmbauche>
</Employe>
</ListeEmployes>