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

INU3011 Documents structurés

Exercices après Cours 5

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).


Table des matières

Ces documents sont-ils valides ? Sinon, pourquoi ?

Contenus acceptés par un modèle de contenu

Description des contenus acceptés par un modèle de contenu donné

Modèle de contenu correspondant à une description donnée

Comparaison de modèles de contenu

Comparaisons deux-à-deux

Comparaisons diverses


Ces documents sont-ils valides ? Sinon, pourquoi ?

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

    Non; les valeurs d’un attribut de type énuméré sont sensibles à la casse (majuscules vs minuscules).

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

    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é.

  3. <!DOCTYPE fiche [
       <!ELEMENT fiche (#PCDATA)>
       <!ATTLIST fiche secrète (vrai | faux) #REQUIRED>
    ]>
    <fiche secrète=" vrai " />
    - Réponse

    Oui; un contenu vide est toujours conforme au modèle de contenu #PCDATA.

  4. <!DOCTYPE fiche [
       <!ELEMENT fiche (#PCDATA)>
       <!ATTLIST fiche secrète (vrai | faux) #REQUIRED>
    ]>
    <fiche>Ma fiche</fiche>
    - Réponse

    Non; l’attribut « secrète » est #REQUIRED et doit donc être spécifié pour tout élément « fiche ».

  5. <!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>
    - Réponse

    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 &amp;. Il ne peut donc pas être valide.

  6. <!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>
    - Réponse

    Non. Ni l’espace ni la barre oblique ne sont acceptées à l’intérieur d’une valeur d’attribut de type NMTOKEN.

  7. <!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>
    - Réponse

    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.

  8. <!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>
    - Réponse

    Non; l’élément « date » n’est pas permis dans le « titre ».

  9. <!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>
    - Réponse

    Non; l’élément « date » ne peut pas être utilisé sans l’attribut « forme-iso ».

  10. <!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>
    - Réponse

    Non; une « fiche » doit obligatoirement comporter au moins une « note » après le « titre ».

  11. <!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>
    - Réponse

    Oui. Encore une fois, un contenu vide (ici, celui de l’élément « date ») est toujours conforme au modèle de contenu #PCDATA.


Contenus acceptés par un modèle de contenu

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>

Description des contenus acceptés par un modèle de contenu donné

Décrivez en mots les contenus acceptés par :

  1. (a|b)*

    - Réponse

    Toutes les suites (même la suite vide) d’éléments <a/> et <b/>, entremêlés dans n’importe quel ordre.

  2. (b|a)+

    - Réponse

    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.

  3. (b,a)+

    - Réponse

    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/>, …

  4. (nom | (prénom, nomFamille))

    - Réponse

    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.

Modèle de contenu correspondant à une description donnée

Rédigez un modèle de contenu qui accepte :

  1. Un sous-élément <a/> et un sous-élément <b/>, dans n’importe quel ordre; autrement dit, soit <a/><b/>, soit <b/><a/>.

    - Réponse

    ((a, b) | (b, a))

  2. Les mêmes contenus que ceux acceptés par (a?, b?), sauf le contenu vide.

    - Réponse

    ((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.

  3. Entre deux et quatre répétitions (occurrences) de l’élément remarque.

    - Réponse
    Une des réponses possibles :

    (remarque, remarque, remarque?, remarque?)

    Cet exercice est similaire à un de ceux faits en classe.

  4. 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 :

    - Réponse
    Deux des réponses possibles :

    ((chap, bibl?)+, bibl)

    ((chap+, bibl)+, bibl?)

    Ces deux modèles de contenu sont équivalents.

  5. † Un nombre pair (au moins 2) d’éléments <a/>, <b/> ou <c/>, entremêlés dans n’importe quel ordre.

    - Réponse

    ((a|b|c), (a|b|c))+

  6. † Un nombre impair d’éléments <a/>, <b/> ou <c/>.

    - Réponse

    ((a|b|c), ((a|b|c), (a|b|c))*)

  7. † 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/>.

    - Réponse

    (a, b, c, (a|b|c)*)

  8. † 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/>.

    - Réponse

    ((a|b|c)*, c, b, a)

  9. † Une des deux suites d’éléments <c/><h/><a/><t/> ou <c/><h/><i/><e/><n/>.

    - Réponse
    Deux des réponses possibles :

    ((c,h,a,t) | (c,h,i,e,n))

    (c, h, ((a, t) | (i, e, n)))


Comparaison de modèles de contenu

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 [
 <!ELEMENT a EMPTY>
 <!ELEMENT b EMPTY>
 <!ELEMENT c EMPTY>
 <!ELEMENT doc
(modèle-de-contenu-proposé)>
]>
<doc>
contenu-à-tester</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 Bouton "validate").

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/>.

Comparaisons deux-à-deux

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
côtés du "|" sont inversés, ce qui ne change rien.

(a, b)? versus (a, b?)
- Réponse
Incomparables

<a/> est refusé à gauche et accepté à droite,
un contenu vide est accepté à gauche et refusé à droite,
<a/><b/> est accepté à gauche et à droite,
donc les deux modèles ne sont pas disjoints.

(a, b)? versus (a, b?)?
- Réponse
(a, b)? est plus restrictif que (a, b?)?

Tout ce qui est accepté à gauche (<a/><b/> et un contenu vide) l’est aussi à droite, mais
<a/> est refusé à gauche et accepté à droite.

(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/> et
<a/><b/>) l’est aussi à droite, mais
<b/> est refusé à gauche et accepté à droite

((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/>
et <b/>) l’est aussi à droite, mais
<a/><b/> est refusé à gauche et accepté à droite.

((a|b), b) versus ((a,b) | (b,b))
- Réponse
Équivalents

Les deux modèles acceptent exactement les deux mêmes
contenus, soit <a/><b/> et <b/><b/>.

(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
contenu vide, qui est accepté seulement à droite. Le modèle de droite est donc plus
permissif que celui de gauche.

(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 (#PCDATA | a | c)* est un
modèle de contenu mixte, qui accepte donc du texte comme contenu direct,
en plus des sous-éléments aussi acceptés par (a | c)*.
Ainsi, par exemple, le contenu suivant est accepté à gauche, et refusé à droite:
<c/>Salut la <a/><a/> compagnie<c/>!

(a*)+ versus (a+)*
- Réponse
Équivalents

Les deux modèles acceptent exactement les mêmes contenus,
soit une suite, peut-être vide, de n’importe combien d’éléments <a/>. Ils sont donc
équivalents à simplement (a*), tout comme (a*)* d’ailleurs.

(a*,b)+ versus (a|b)*
- Réponse
(a*,b)+ est plus restrictif que (a|b)*

Les deux modèles acceptent des suites de <a/> et de <b/>
entremêlés dans n’importe quel ordre. Cependant, (a*,b)+ n’accepte
que les suites non vides se terminant par un <b/>, alors que
(a|b)* accepte n’importe quelle suite, même vide ou se terminant
par un <a/>.

((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
qui est de <b/><a/>, qui n’est accepté que par le modèle de gauche. Celui-ci est
donc plus permissif que le modèle de droite.

Comparaisons diverses

  1. † Que pouvez-vous dire à propos des modèles de contenu suivants :

    - Réponse
    Ils sont équivalents; tous acceptent les trois contenus suivants : vide, <a/> et <b/>.
  2. † Situez les uns par rapport aux autres les modèles de contenu suivants :

    1. (a?, b?)
    2. (a? | b?)
    3. (b | (a, b))
    4. (b | (a, b?))
    5. ((b, a?) | (a, b?))
    6. ((b, a?) | (a, b?))?
    - Réponse
    compar.png