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-
O
ANY
#CDATA
EMPTY
#PCDATA
#RCDATA
(
ExpressionContenuElement ) NbOccurrencesOption
,
ExpressionContenuElement|
ExpressionContenuElement-
ExpressionContenuElement+
ExpressionContenuElement?
+
*
,
AttributAttribut :
CDATA
ID
IDREF
ENTITY
ENTITIES
NUMBER
NOTATION (
ListeDeValeursAttribut )
NMTOKEN
NMTOKENS
)
|
ValeurAttribut&
NomDeLEntite ;
#CURRENT
#IMPLIED
#FIXED
ValeurAttribut#REQUIRED
PUBLIC
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>