Copyright © 2023 Yves MARCOUX; dernière modification de cette page: 2023-02-03.
Yves MARCOUX – EBSI – Université de Montréal
Préalables :
N.B. : Les exercices marqués d’un obèle † sont facultatifs (ils dépassent les objectifs du cours).
<!DOCTYPE fiche [ <!ELEMENT fiche EMPTY> <!ATTLIST fiche secrète (vrai | faux) #REQUIRED> ]> <fiche secrète="Faux" />
Non; les valeurs d’un attribut de type énuméré sont sensibles à la casse (majuscules vs minuscules).
<!DOCTYPE fiche [ <!ELEMENT fiche EMPTY> <!ATTLIST fiche secrète (vrai | faux) #REQUIRED> ]> <fiche secrète=" vrai " />
Oui; comme pour les attributs de type NMTOKEN, on peut mettre des espaces au début et/ou à la fin de la valeur d’attribut pour les attributs de type énuméré.
<!DOCTYPE fiche [ <!ELEMENT fiche (#PCDATA)> <!ATTLIST fiche secrète (vrai | faux) #REQUIRED> ]> <fiche secrète=" vrai " />
Oui; un contenu vide est toujours conforme au modèle de contenu #PCDATA.
<!DOCTYPE fiche [ <!ELEMENT fiche (#PCDATA)> <!ATTLIST fiche secrète (vrai | faux) #REQUIRED> ]> <fiche>Ma fiche</fiche>
Non; l’attribut « secrète » est #REQUIRED et doit donc être spécifié pour tout élément « fiche ».
<!DOCTYPE fiche [ <!ELEMENT fiche (#PCDATA)> <!ATTLIST fiche secrète (vrai | faux) #REQUIRED> ]> <fiche secrète="faux">Ceci est une fiche en bonne & due forme.</fiche>
Non. Ce document n’est pas bien formé, puisqu’il comporte une
esperluette « à l’air libre », qui devrait plutôt être représentée par
&. Il ne peut donc pas être valide.
<!DOCTYPE fiche [ <!ELEMENT fiche (titre, note+)> <!ELEMENT titre (#PCDATA)> <!ATTLIST fiche secrète (vrai | faux) #IMPLIED> <!ELEMENT note (#PCDATA | date)*> <!ATTLIST date calendrier (julien | grégorien) #IMPLIED> <!ATTLIST date forme-iso NMTOKEN #REQUIRED> <!ELEMENT date (#PCDATA)> ]> <fiche> <titre>La conquête du Sahara</titre> <note>L'histoire se passe en <date forme-iso='1877 / 1878'>1877 ou 1878</date>.</note> </fiche>
Non. Ni l’espace ni la barre oblique ne sont acceptées à l’intérieur d’une valeur d’attribut de type NMTOKEN.
<!DOCTYPE fiche [
<!ELEMENT fiche (titre, note+)>
<!ELEMENT titre (#PCDATA)>
<!ATTLIST fiche secrète (vrai | faux) #IMPLIED>
<!ELEMENT note (#PCDATA | date)*>
<!ATTLIST date calendrier (julien | grégorien) #IMPLIED>
<!ATTLIST date forme-iso NMTOKEN #REQUIRED>
<!ELEMENT date (#PCDATA)>
]>
<fiche>
<titre>La conquête du Sahara</titre>
<note>L'histoire se passe en <date forme-iso='
1877 '>1877</date>.</note>
</fiche>
Oui. Des espaces et/ou sauts de ligne sont permis au début et/ou à la fin d’une valeur d’attribut de type NMTOKEN.
<!DOCTYPE fiche [ <!ELEMENT fiche (titre, note+)> <!ELEMENT titre (#PCDATA)> <!ATTLIST fiche secrète (vrai | faux) #IMPLIED> <!ELEMENT note (#PCDATA | date)*> <!ATTLIST date calendrier (julien | grégorien) #IMPLIED> <!ATTLIST date forme-iso NMTOKEN #REQUIRED> <!ELEMENT date (#PCDATA)> ]> <fiche> <titre>La conquête du Sahara après <date forme-iso='1877'>1877</date></titre> <note>Un épisode important de l'histoire africaine.</note> </fiche>
Non; l’élément « date » n’est pas permis dans le « titre ».
<!DOCTYPE fiche [ <!ELEMENT fiche (titre, note+)> <!ELEMENT titre (#PCDATA)> <!ATTLIST fiche secrète (vrai | faux) #IMPLIED> <!ELEMENT note (#PCDATA | date)*> <!ATTLIST date calendrier (julien | grégorien) #IMPLIED> <!ATTLIST date forme-iso NMTOKEN #REQUIRED> <!ELEMENT date (#PCDATA)> ]> <fiche> <titre>La conquête du Sahara</titre> <note><date calendrier="julien">1877</date> fut une année importante dans l'histoire africaine.</note> </fiche>
Non; l’élément « date » ne peut pas être utilisé sans l’attribut « forme-iso ».
<!DOCTYPE fiche [ <!ELEMENT fiche (titre, note+)> <!ELEMENT titre (#PCDATA)> <!ATTLIST fiche secrète (vrai | faux) #IMPLIED> <!ELEMENT note (#PCDATA | date)*> <!ATTLIST date calendrier (julien | grégorien) #IMPLIED> <!ATTLIST date forme-iso NMTOKEN #REQUIRED> <!ELEMENT date (#PCDATA)> ]> <fiche> <titre>La conquête du Sahara</titre> </fiche>
Non; une « fiche » doit obligatoirement comporter au moins une « note » après le « titre ».
<!DOCTYPE fiche [ <!ELEMENT fiche (titre, note+)> <!ELEMENT titre (#PCDATA)> <!ATTLIST fiche secrète (vrai | faux) #IMPLIED> <!ELEMENT note (#PCDATA | date)*> <!ATTLIST date calendrier (julien | grégorien) #IMPLIED> <!ATTLIST date forme-iso NMTOKEN #REQUIRED> <!ELEMENT date (#PCDATA)> ]> <fiche secrète="vrai"> <titre>La conquête du Sahara</titre> <note>L'histoire débute en <date forme-iso="1877"></date>.</note> </fiche>
Oui. Encore une fois, un contenu vide (ici, celui de l’élément « date ») est toujours conforme au modèle de contenu #PCDATA.
Pour cette section, prenez pour acquis que tous les éléments mentionnés
(a, b, etc.) sont déclarés EMPTY, par exemple :
<!ELEMENT a EMPTY>
Décrivez en mots les contenus acceptés par :
(a|b)*
Toutes les suites (même la suite vide) d’éléments
<a/> et <b/>, entremêlés dans
n’importe quel ordre.
(b|a)+
Toutes les suites non vides (c’est-à-dire de longueur au moins
1) d’éléments <a/> et <b/>,
entremêlés dans n’importe quel ordre.
(b,a)+
Toutes les suites d’éléments constituées du patron
<b/><a/> répété un nombre quelconque de fois, mais au
moins une fois : <b/><a/>,
<b/><a/><b/><a/>,
<b/><a/><b/><a/><b/><a/>, …
(nom | (prénom, nomFamille))
Un élément nom tout seul, ou encore une suite de deux éléments :
un élément prénom suivi d’un élément nomFamille.
Rédigez un modèle de contenu qui accepte :
Un sous-élément <a/> et un sous-élément
<b/>, dans n’importe quel ordre; autrement dit, soit
<a/><b/>, soit <b/><a/>.
((a, b) | (b, a))
Les mêmes contenus que ceux acceptés par (a?, b?),
sauf le contenu vide.
((a, b?) | b) ou encore (a | b | (a,b)) (ces deux
modèles de contenu sont équivalents).
Cet exercice est similaire à un de ceux faits en classe.
Entre deux et quatre répétitions (occurrences) de
l’élément remarque.
(remarque, remarque, remarque?, remarque?)
Cet exercice est similaire à un de ceux faits en classe.
Le contenu d’un livre, dont la structure consiste en une suite de
chapitres (chap) et de bibliographies (bibl)
entremêlés, répondant à tous les critères
suivants :
((chap, bibl?)+, bibl)
((chap+, bibl)+, bibl?)
Ces deux modèles de contenu sont équivalents.
† Un nombre pair (au moins 2) d’éléments
<a/>, <b/> ou <c/>,
entremêlés dans n’importe quel ordre.
((a|b|c), (a|b|c))+
† Un nombre impair d’éléments
<a/>, <b/> ou
<c/>.
((a|b|c), ((a|b|c), (a|b|c))*)
† N’importe quelle suite d’éléments
<a/>, <b/> ou <c/>,
entremêlés dans n’importe quel ordre, mais commençant
par <a/><b/><c/>.
(a, b, c, (a|b|c)*)
† N’importe quelle suite d’éléments
<a/>, <b/> ou <c/>,
entremêlés dans n’importe quel ordre, mais se
terminant par <c/><b/><a/>.
((a|b|c)*, c, b, a)
† Une des deux suites d’éléments
<c/><h/><a/><t/> ou
<c/><h/><i/><e/><n/>.
((c,h,a,t) | (c,h,i,e,n))
(c, h, ((a, t) | (i, e, n)))
Pour cette section, vous pouvez supposer que les éléments a,
b et c sont déclarés EMPTY :
<!ELEMENT a EMPTY> <!ELEMENT b EMPTY> <!ELEMENT c EMPTY>
Pour vérifier avec oXygen si un des modèles de contenu proposés accepte ou non un certain contenu, copiez d’abord ceci dans un document vide dans oXygen :
<!DOCTYPE doc [(modèle-de-contenu-proposé
<!ELEMENT a EMPTY>
<!ELEMENT b EMPTY>
<!ELEMENT c EMPTY>
<!ELEMENT doc)>contenu-à-tester
]>
<doc></doc>
puis remplacez (modèle-de-contenu-proposé) par le modèle de
contenu et contenu-à-tester par le contenu à vérifier.
Puis faites valider (icône
).
Par exemple, le fait que :
<!DOCTYPE doc [ <!ELEMENT a EMPTY> <!ELEMENT b EMPTY> <!ELEMENT doc (a | b?)> ]> <doc></doc>
soit rapporté comme document valide signifie que le modèle de contenu
(a | b?) accepte un contenu vide, et le fait que :
<!DOCTYPE doc [ <!ELEMENT a EMPTY> <!ELEMENT b EMPTY> <!ELEMENT doc (a | b?)> ]> <doc><a/><b/></doc>
soit rapporté comme invalide signifie qu’il n’accepte pas le
contenu <a/><b/>.
Pour chaque paire de modèles de contenu, dites quelle relation existe entre les deux : l’un d’eux est-il plus permissif ou restrictif que l’autre, sont-ils équivalents, incomparables, disjoints? Justifiez vos réponses.
((a, b) | c) |
versus |
(c | (a, b)) |
-
Réponse
Équivalents
La seule différence est que les deux |
|
(a, b)? |
versus |
(a, b?) |
-
Réponse
Incomparables
|
|
(a, b)? |
versus |
(a, b?)? |
-
Réponse
(a, b)? est plus restrictif que (a, b?)?
Tout ce qui est accepté à gauche
( |
|
| † |
(a, b?)? |
versus |
(a?, b?) |
-
Réponse
(a, b?)? est plus restrictif que (a?, b?)
Tout ce qui est accepté à gauche (un contenu vide,
|
((a | b), (b | a)*) |
versus |
(a | b)+ |
-
Réponse
Équivalents
|
|
| † |
(a? | b?) |
versus |
(a?, b?) |
-
Réponse
(a? | b?) est plus restrictif que (a?, b?)
Tout ce qui est accepté à gauche (un contenu vide,
|
((a|b), b) |
versus |
((a,b) | (b,b)) |
-
Réponse
Équivalents
Les deux modèles acceptent exactement les deux
mêmes |
|
(b | (a, b?)) |
versus |
(a?, b?) |
-
Réponse
(b | (a, b?)) est plus restrictif que (a?,
b?)
Les deux acceptent les mêmes contenus, sauf pour ce qui est
du |
|
(b | (a, b?)) |
versus |
(a | b | (a,b)) |
-
Réponse
Équivalents. Les deux acceptent les trois contenus
<a/>, <b/> et
<a/><b/>. |
|
| † |
((a, b?) | (b, a?)) |
versus |
(a | b | (a,b) | (b,a)) |
-
Réponse
Équivalents. Les deux acceptent les quatre contenus
<a/>, <b/>, <b/><a/>
et <a/><b/>. |
(#PCDATA | a | c)* |
versus | (a | c)* |
-
Réponse
(#PCDATA | a | c)* est plus permissif que (a |
c)*
La différence est que |
|
| † |
(a*)+ |
versus |
(a+)* |
-
Réponse
Équivalents
Les deux modèles acceptent exactement les
mêmes contenus, |
| † |
(a*,b)+ |
versus |
(a|b)* |
-
Réponse
(a*,b)+ est plus restrictif que (a|b)*
Les deux modèles acceptent des suites de |
| † |
((a, b?) | (b, a?)) |
versus |
(b | (a, b?)) |
-
Réponse
((a, b?) | (b, a?)) est plus permissif que (b | (a,
b?))
Les deux modèles acceptent exactement les mêmes contenus,
sauf pour ce |
† Que pouvez-vous dire à propos des modèles de contenu suivants :
(a|b)?(a|b?)(a?|b)(a?|b?)<a/> et
<b/>.† Situez les uns par rapport aux autres les modèles de contenu suivants :
(a?, b?)(a? | b?)(b | (a, b))(b | (a, b?))((b, a?) | (a, b?))((b, a?) | (a, b?))?