Copyright © 2023 Yves MARCOUX; dernière modification de cette page: 2023-02-06.

INU3011 Documents structurés

Exercices après Cours 4

Yves MARCOUXEBSIUniversité 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 Bouton "validate"). 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="&gt;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.


Table des matières

Création de documents valides (sans attributs)

Création de documents valides (avec attributs)

Ces documents sont-ils valides ? Sinon, pourquoi ?


Création de documents valides (sans attributs)

  1. Créez deux documents différents conformes aux déclarations suivantes :
    <!DOCTYPE corps [
       <!ELEMENT corps (para+)>
       <!ELEMENT para (#PCDATA)>
    ]>
    - Réponse
    Certaines des réponses possibles :
    • <corps>
       <para>Un paragraphe.</para>
      </corps>

    • <corps>
       <para>Un paragraphe.</para>
       <para>Un autre paragraphe.</para>
      </corps>

  2. Créez deux documents différents conformes aux déclarations suivantes :
    <!DOCTYPE compteur [
       <!ELEMENT compteur (marque+)>
       <!ELEMENT marque (#PCDATA)>
    ]>
    - Réponse
    Certaines des réponses possibles :
    • <compteur>
       <marque/>
      </compteur>

    • <compteur>
       <marque />
       <marque>Ouch !</marque>
      </compteur>

  3. Créez deux documents différents conformes aux déclarations suivantes; un avec date et l’autre sans date:
    <!DOCTYPE mémo [
       <!ELEMENT corps (#PCDATA)>
       <!ELEMENT date (#PCDATA)>
       <!ELEMENT auteur (#PCDATA)>
       <!ELEMENT mémo (auteur, date?, corps)>
    ]>
    - Réponse
    Certaines des réponses possibles :
    • <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>

  4. Créez deux documents différents conformes aux déclarations suivantes :
    <!DOCTYPE mémo [
       <!ELEMENT date (#PCDATA)>
       <!ELEMENT auteur (#PCDATA)>
       <!ELEMENT mémo (date?, auteur)>
    ]>
    - Réponse
    Certaines des réponses possibles :
    • <mémo>
       <date>Aujourd’hui</date>
       <auteur>Louis</auteur>
      </mémo>

    • <mémo>
       <auteur>Marie-Hélène</auteur>
      </mémo>

  5. Créez deux documents différents conformes aux déclarations suivantes:
    <!DOCTYPE a [
       <!ELEMENT a (b, c)?>
       <!ELEMENT b EMPTY>
       <!ELEMENT c EMPTY>
    ]>
    - Réponse
    • <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?

    - Réponse

    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.

  6. Combien de documents différents sont conformes aux déclarations suivantes?
    <!DOCTYPE a [
       <!ELEMENT a (b)>
       <!ELEMENT b EMPTY>
    ]>
    - Réponse

    Un seul.

    Créez chacun de ces documents.
    - Réponse
    • <a><b/></a>

  7. Combien de documents différents sont conformes aux déclarations suivantes?
    <!DOCTYPE a [
       <!ELEMENT a (b?)>
       <!ELEMENT b EMPTY>
    ]>
    - Réponse

    Deux.

    Créez chacun de ces documents.
    - Réponse
    • <a><b/></a>

    • <a></a>

  8. Combien de documents différents sont conformes aux déclarations suivantes?
    <!DOCTYPE a [
       <!ELEMENT a (b, (b | c))>
       <!ELEMENT b EMPTY>
       <!ELEMENT c EMPTY>
    ]>
    - Réponse

    Deux.

    Créez chacun de ces documents.
    - Réponse
    • <a><b/><b/></a>

    • <a><b/><c/></a>

  9. Combien de documents différents sont conformes aux déclarations suivantes?
    <!DOCTYPE a [
       <!ELEMENT a ((c | b), (b | c))>
       <!ELEMENT b EMPTY>
       <!ELEMENT c EMPTY>
    ]>
    - Réponse

    Quatre.

    Créez chacun de ces documents.
    - Réponse
    • <a><b/><b/></a>

    • <a><b/><c/></a>

    • <a><c/><b/></a>

    • <a><c/><c/></a>

  10. Combien de documents différents sont conformes aux déclarations suivantes?
    <!DOCTYPE a [
       <!ELEMENT a (b | c*)>
       <!ELEMENT b EMPTY>
       <!ELEMENT c EMPTY>
    ]>
    - Réponse

    Une infinité.

    Créez deux de ces documents.
    - Réponse
    En voici quatre possibles :
    • <a><b/></a>

    • <a></a>

    • <a><c/></a>

    • <a><c/><c/></a>

  11. † Créez trois documents différents conformes aux déclarations suivantes:
    <!DOCTYPE a [
       <!ELEMENT a (a | b)>
       <!ELEMENT b EMPTY>
    ]>
    - Réponse
    • <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: Structure hiérarchique récursive.

    Combien de documents différents sont conformes à ces déclarations?
    - Réponse

    Une infinité.


Création de documents valides (avec attributs)

  1. Combien de documents différents sont conformes aux déclarations suivantes?

    <!DOCTYPE fiche [
       <!ELEMENT fiche EMPTY>
       <!ATTLIST fiche secrète (vrai | faux) #REQUIRED>
    ]>
    - Réponse

    Deux.

    Créez chacun de ces documents.

    - Réponse
    • <fiche secrète='vrai' />

    • <fiche secrète="faux"></fiche>

  2. Combien de documents différents sont conformes aux déclarations suivantes?

    <!DOCTYPE fiche [
       <!ELEMENT fiche EMPTY>
       <!ATTLIST fiche secrète (vrai | faux) #IMPLIED>
    ]>
    - Réponse

    Trois.

    Créez chacun de ces documents.

    - Réponse
    • <fiche />

    • <fiche secrète="vrai" />

    • <fiche secrète="faux" />

  3. 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>
    ]>
    - Réponse
    Document sans spécification d’attribut:
    <fiche>Le poisson-lanterne</fiche>
    Document avec spécification d’attribut:
    <fiche secrète='vrai'>Le requin</fiche>

    Combien de documents différents sont conformes à ces déclarations?

    - Réponse

    Une infinité (à cause de la présence du #PCDATA, qui permet un texte arbitrairement long).

  4. 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>
    ]>
    - Réponse
    Document sans spécification d’attribut:
    <fiche />
    Document avec spécification d’attribut:
    <fiche secrète="vrai" />
    Ces documents ont un contenu vide, ce qui est conforme au modèle de contenu (#PCDATA). Pour le rappeler, (#PCDATA) n’exige pas la présence de texte, mais la permet, simplement.
  5. 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)>
    ]>
    - Réponse
    Document sans élément date:
    <fiche>
     <titre>Le poisson-lanterne</titre>
     <note>Ne pas oublier vos lunettes de soleil!</note>
    </fiche>
    Document avec élément 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>

Ces documents sont-ils valides ? Sinon, pourquoi ?

  1. Le document suivant est-il valide ?
    <!DOCTYPE compteur [
       <!ELEMENT compteur (marque+)>
       <!ELEMENT marque (#PCDATA)>
    ]>
    <compteur></compteur>
    - Réponse

    Non, il faut au moins une occurrence de marque dans compteur.

  2. Le document suivant est-il valide ?
    <!DOCTYPE compteur [
       <!ELEMENT compteur (#PCDATA)>
    ]>
    <compteur/>
    - Réponse

    Oui, un élément déclaré (#PCDATA) peut toujours être vide.

  3. Le document suivant est-il valide ?
    <!DOCTYPE compteur [
       <!ELEMENT compteur (marqueur*)>
       <!ELEMENT marqueur (#PCDATA)>
    ]>
    <compteur/>
    - Réponse

    Oui, il peut n’y avoir « aucune répétition » de marqueur dans compteur.

  4. Le document suivant est-il valide ?
    <!DOCTYPE compteur [
       <!ELEMENT compteur (marqueur*)>
       <!ELEMENT marqueur (#PCDATA)>
    ]>
    <compteur> <marqueur> <marqueur /> </marqueur> </compteur>
    - Réponse

    Non, marqueur ne peut contenir que du texte (ou être vide), pas de sous-élément.