Copyright © 2023 Yves MARCOUX; dernière modification de cette page: 2023-02-06.
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).
Méthode de travail recommandée pour la création de documents :
Plusieurs des exercices consistent à créer un document conforme à certaines déclarations, c’est-à-dire valide selon ces déclarations. Les déclarations sont données dans l’énoncé de l’exercice sous la forme d’une déclaration DOCTYPE qui inclut un sous-ensemble local contenant les déclarations auxquelles votre document doit se conformer, par exemple :
<!DOCTYPE lettre [ <!ELEMENT lettre (p+)> <!ELEMENT p (#PCDATA)> ]>
Vous avez vu cette forme de déclaration DOCTYPE présentée à la section 5 du texte Le langage des DTD.
Il est recommandé de commencer dans oXygen avec un document vide, puis d’y coller la déclaration DOCTYPE complète (incluant le sous-ensemble local avec les déclarations), que vous aurez copiée à partir de l’énoncé de l’exercice dans le présent protocole.
Rédigez ensuite votre élément-document sous la déclaration DOCTYPE, comme dans cet exemple :
<!DOCTYPE lettre [
<!ELEMENT lettre (p+)>
<!ELEMENT p (#PCDATA)>
]>
<lettre>
<p>Allô le monde.<p>
</lettre>
Pour vérifier que votre document est conforme aux déclarations, faites-le valider
(icône
).
Rappelez-vous que, s’il y a des erreurs, vous pouvez cliquer sur un message
d’erreur pour aller directement à l’erreur dans le document.
Notez que les réponses données n’incluent pas la déclaration DOCTYPE. Si vous voulez copier ces réponses dans oXygen, vous devez copier séparément la déclaration DOCTYPE complète et la placer avant la réponse copiée pour obtenir un document valide.
Pour garder une trace de votre travail, sauvegardez vos documents en utilisant le numéro de la question comme nom de fichier.
Notion de « documents différents » :
Certains exercices parlent du nombre de documents différents. Pour ces questions, deux documents qui ne diffèrent que par la présence de blancs, de commentaires, par l’utilisation d’appels d’entité, de balises auto-fermantes, par l’ordre des spécifications d’attribut à l’intérieur d’une balise, ou par le choix des délimiteurs de valeurs d’attributs, sont considérés comme semblables. Ainsi, ce document :
<visite entrée="11:12" sortie='>16:00'>Belle visite!</visite>
et celui-ci :
<visite sortie=">16:00 " entrée=' 11:12' >
<!-- Vérifier l’heure de sortie. -->
Belle visite!
</visite >
(tous les deux bien formés) ne sont pas comptés comme différents.
<!DOCTYPE corps [ <!ELEMENT corps (para+)> <!ELEMENT para (#PCDATA)> ]>
<corps>
<para>Un
paragraphe.</para>
</corps>
<corps>
<para>Un
paragraphe.</para>
<para>Un autre
paragraphe.</para>
</corps>
<!DOCTYPE compteur [ <!ELEMENT compteur (marque+)> <!ELEMENT marque (#PCDATA)> ]>
<compteur>
<marque/>
</compteur>
<compteur>
<marque
/>
<marque>Ouch !</marque>
</compteur>
date et l’autre sans date: <!DOCTYPE mémo [ <!ELEMENT corps (#PCDATA)> <!ELEMENT date (#PCDATA)> <!ELEMENT auteur (#PCDATA)> <!ELEMENT mémo (auteur, date?, corps)> ]>
<mémo>
<auteur>Louis</auteur>
<corps>Bonne
journée à
tous!</corps>
</mémo>
<mémo>
<auteur>Marie-Hélène</auteur>
<date>2025-12-31</date>
<corps>Bonjour
Isabelle et
Marie-Pier!</corps>
</mémo>
<!DOCTYPE mémo [ <!ELEMENT date (#PCDATA)> <!ELEMENT auteur (#PCDATA)> <!ELEMENT mémo (date?, auteur)> ]>
<mémo>
<date>Aujourd’hui</date>
<auteur>Louis</auteur>
</mémo>
<mémo>
<auteur>Marie-Hélène</auteur>
</mémo>
<!DOCTYPE a [ <!ELEMENT a (b, c)?> <!ELEMENT b EMPTY> <!ELEMENT c EMPTY> ]>
<a>
<b />
<c
/>
</a>
<a></a>
Y a-t-il d’autres documents que les deux que vous avez créés qui soient conformes à ces déclarations?
Non. On pourrait écrire différemment les documents, notamment leurs éléments vides, mais leur structure hiérarchique correspondrait toujours à un des deux documents ci-dessus.
<!DOCTYPE a [ <!ELEMENT a (b)> <!ELEMENT b EMPTY> ]>
Un seul.
<a><b/></a>
<!DOCTYPE a [ <!ELEMENT a (b?)> <!ELEMENT b EMPTY> ]>
Deux.
<a><b/></a>
<a></a>
<!DOCTYPE a [ <!ELEMENT a (b, (b | c))> <!ELEMENT b EMPTY> <!ELEMENT c EMPTY> ]>
Deux.
<a><b/><b/></a>
<a><b/><c/></a>
<!DOCTYPE a [ <!ELEMENT a ((c | b), (b | c))> <!ELEMENT b EMPTY> <!ELEMENT c EMPTY> ]>
Quatre.
<a><b/><b/></a>
<a><b/><c/></a>
<a><c/><b/></a>
<a><c/><c/></a>
<!DOCTYPE a [ <!ELEMENT a (b | c*)> <!ELEMENT b EMPTY> <!ELEMENT c EMPTY> ]>
Une infinité.
<a><b/></a>
<a></a>
<a><c/></a>
<a><c/><c/></a>
<!DOCTYPE a [ <!ELEMENT a (a | b)> <!ELEMENT b EMPTY> ]>
<a><b/></a>
<a><a><b/></a></a>
<a><a><a><b/></a></a></a>
Il peut sembler étrange qu’un type d’élément puisse
« se contenir lui-même », mais c’est
pourtant une situation courante, par exemple en HTML, où un élément
<em> (emphase) peut imbriquer un autre élément
<em>, et ce, sans limite sur le niveau
d’imbrication. Ainsi, ce passage :
<p>
<em>Ceci est <em>très <em>très</em></em> important!</em>
</p>
est parfaitement valide en HTML. Il peut être utile, pour analyser de
tels cas, de dessiner explicitement la structure hiérarchique correspondant
au document. Par exemple, la troisième réponse possible donnée ci-dessus
correspond à cette structure hiérarchique:
.
Une infinité.
Combien de documents différents sont conformes aux déclarations suivantes?
<!DOCTYPE fiche [ <!ELEMENT fiche EMPTY> <!ATTLIST fiche secrète (vrai | faux) #REQUIRED> ]>
Deux.
Créez chacun de ces documents.
<fiche secrète='vrai' />
<fiche secrète="faux"></fiche>
Combien de documents différents sont conformes aux déclarations suivantes?
<!DOCTYPE fiche [ <!ELEMENT fiche EMPTY> <!ATTLIST fiche secrète (vrai | faux) #IMPLIED> ]>
Trois.
Créez chacun de ces documents.
<fiche />
<fiche secrète="vrai" />
<fiche secrète="faux" />
Créez deux documents différents conformes aux déclarations suivantes (un avec spécification d’attribut et un sans) :
<!DOCTYPE fiche [ <!ELEMENT fiche (#PCDATA)> <!ATTLIST fiche secrète (faux | vrai) #IMPLIED> ]>
<fiche>Le poisson-lanterne</fiche><fiche secrète='vrai'>Le requin</fiche>Combien de documents différents sont conformes à ces déclarations?
Une infinité (à cause de la présence du #PCDATA, qui permet un texte arbitrairement long).
Créez deux documents différents conformes aux déclarations suivantes (un avec spécification d’attribut et un sans) :
<!DOCTYPE fiche [ <!ELEMENT fiche (#PCDATA)> <!ATTLIST fiche secrète (vrai) #IMPLIED> ]>
<fiche /><fiche secrète="vrai" />(#PCDATA). Pour le rappeler, (#PCDATA)
n’exige pas la présence de texte, mais la permet,
simplement.Créez un document, conforme aux déclarations suivantes, qui contient un élément
date, et un autre qui n’en contient pas:
<!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)> ]>
date:<fiche>
<titre>Le
poisson-lanterne</titre>
<note>Ne pas oublier vos
lunettes de soleil!</note>
</fiche>date:<fiche>
<titre>Le
poisson-lanterne</titre>
<note>Ne pas oublier vos
lunettes de soleil!</note>
<note>L'an dernier, le
<date forme-iso='2028-06-21'>21
juin 2028</date>,
premier repérage en mer. Historiquement,
c'est le <date
forme-iso="1543-08-30" calendrier='julien'
>30 sextilis
1543</date> que cette espèce a été
répertoriée pour la
première fois.</note>
</fiche><!DOCTYPE compteur [ <!ELEMENT compteur (marque+)> <!ELEMENT marque (#PCDATA)> ]>
<compteur></compteur>
Non, il faut au moins une occurrence de marque dans
compteur.
<!DOCTYPE compteur [ <!ELEMENT compteur (#PCDATA)> ]>
<compteur/>
Oui, un élément déclaré (#PCDATA) peut toujours être vide.
<!DOCTYPE compteur [ <!ELEMENT compteur (marqueur*)> <!ELEMENT marqueur (#PCDATA)> ]>
<compteur/>
Oui, il peut n’y avoir « aucune répétition » de marqueur dans
compteur.
<!DOCTYPE compteur [ <!ELEMENT compteur (marqueur*)> <!ELEMENT marqueur (#PCDATA)> ]>
<compteur> <marqueur> <marqueur /> </marqueur> </compteur>
Non, marqueur ne peut contenir que du texte (ou être vide), pas
de sous-élément.