3.2. Eléments, marques et attributs
Précédent | Chapitre 3. Introduction à SGML | Suivant

## 3.2. Eléments, marques et attributs

Toutes les DTDs écrites en HTML ont des caractéristiques communes. Ce n'est guère surprenant comme le montre inévitablement la philosophie qui sous-tend SGML. Une des manifestations les plus visibles de cette philosophie est la caractérisation en contenu et éléments.

Votre documentation (que ce soit une seule page Web ou un ouvrage volumineux) est vue comme étant un contenu. Ce contenu est alors divisé (et ensuite subdivisé) en éléments. L'objectif de l'ajout de marques est de nommer et de définir le début et la fin de ces éléments pour traitement ultérieur.

Considérez par exemple un livre type. Au plus haut niveau, ce livre lui-même est un élément. Cet élément “livre” contient évidemment des chapitres, qui peuvent aussi être légitimement considérés comme des éléments. Chaque chapitre contiendra à son tour des éléments, tels que des paragraphes, des citations et de notes de bas de page. Chaque paragraphe peut lui-même contenir encore des éléments, pour identifier le texte parlé par exemple, ou les noms des personnages de l'histoire.

Vous pouvez si vous le voulez voir cela comme un “morcelement” du contenu. A la racine, vous avez un morceau, le livre. Un niveau en dessous, vous avez plus de morceaux, les chapitres individuels. Ils sont à leur tour morcelés en pargraphes, notes de bas de page, noms des personnages, et ainsi de suite.

Remarquez que vous pouvez différencier les éléments sans utiliser la terminologie SGML. C'est vraiment immédiat. Vous pouvez le faire avec un surligneur et un livre imprimé, en utilisant des couleurs différentes pour chaque type d'élément.

Nous n'avons bien sûr pas de surligneur électronique, il nous faut donc un autre moyen d'indiquer à quel élément appartient chaque morceau du contenu. Dans les languages écrits avec SGML ,(HTML, DocBook, et al.), cela se fait avec des marques.

Une marque sert à dire où commence et où finit un élément. La marque ne fait pas partie de l'élément lui-même. Comme chaque DTD est habituellement écrite pour marquer des types d'informations spécifiques, chacune reconnaîtra des éléments différents, et aura donc des noms différents pour les marques.

Pour un élément appelé `nom-de-l'élément`, la marque de début sera normalement `<`nom-de-l'élément`>`. La marque de fin correspondante sera `</`nom-de-l'élément`>`.

Exemple 3.1. Utiliser un élément (marques de début et de fin)

HTML dispose d'un élément pour indiquer que le contenu inclus est un paragraphe, appelé `p`. Cet élément a une marque de début et une de fin.

<p>C'est un paragraphe. Il commence avec la marque de début pour l'élément 'p', et se terminera avec la marque de fin pour l'élément 'p'</p> <p>C'est un autre paragraphe. Mais il est beaucoup plus court.</p>

Tous les éléments n'ont pas besoin d'une marque de fin. Certains n'ont pas de contenu. En HTML, par exemple, vous pouvez indiquer que vous voulez avoir une ligne horizontal dans votre document. Cette ligne n'a bien sûr aucun contenu, vous n'avez donc besoin que de la marque de début pour cet élément.

Exemple 3.2. Utiliser un élément (marque de début uniquement)

HTML dispose d'un élément pour inclure une ligne horizontale, appelé `hr`. C'est un élément sans contenu, il n'a donc qu'une marque de début.

<p>C'est un paragraphe.</p> <hr> <p>C'est un autre paragraphe. Une ligne horizontale le sépare du précédent.</p>

Si ce n'était pas encore clair, les éléments peuvent contenir d'autres éléments. Dans l'exemple du livre plus haut, ce livre contenait tous les chapitres, qui à leur tour contenaient tous les paragraphes, et ainsi de suite.

Exemple 3.3. Eléments dans des éléments ; `em`
<p>C'est un <em>paragraphe</em> simple où certains <em>mots</em> ont été <em>mis en valeur</em>.</p>

La DTD définira les règles qui disent quels éléments peuvent être inclus dans quels autres éléments, et ce qu'ils peuvent précisement contenir.

### Important:

Les gens confondent souvent marques et éléments comme si c'étaient des termes interchangeables. Ce n'est pas le cas.

Un élément est une partie de la structure d'un document. Un élément a un début et une fin. Les marques définissent où commence et où finit le document.

Quand le présent document (ou quelqu'un d'autre qui connait le SGML) parle de la marque “the <p> tag”, cela se rapporte au texte composé des trois caractères `<`, `p` et `>`. Mais la phrase “l'élément <p>” désigne tout l'élément.

Cette distinction est très subtile. Mais gardez la à l'esprit.

Les éléments peuvent avoir des attributs. Un attribut a un nom et une valeur, et sert à donner des informations supplémentaires concernant l'élément. Ce peuvent être des informations qui précisent comment l'élément doit être formaté, ou un identifiant unique pour cette occurrence de l'élément, ou autre chose encore.

Les attributs d'un élément sont donnés dans la marque de début de l'élément et ont la forme ``nom-de-l'attribut`="`valeur-de-l'attribut`"`.

Dans les versions récentes d'HTML, l'élément `p` a un attribut appelé `align`, qui suggère un alignement (justification) du paragraphe au programme affichant l'HTML.

L'attribut `align` peut prendre l'une des quatre valeurs prédéfinies, `left`, `center`, `right` et `justify`. Si l'attribut n'est pas précise, la valeur par défaut est `left`.

Exemple 3.4. Utiliser un élément avec un attribut
<p align="left">L'attribut align est superflus pour ce paragraphe, puisque 'left' est la valeur par défaut.</p> <p align="center">Ce paragraphe sera peut-être centré.</p>

Certains attributs ne prennent que des valeurs prédéfinies, comme `left` ou `justify`. D'autres peuvent prendre les valeurs que vous voulez. Si vous avez besoin de quotes (`"`) dans un attribut, mettez la valeur de l'attribut entre simples quotes.

Exemple 3.5. Simples quotes dans un attribut
<p align='right'>Je suis &agrave; droite&nbsp;!</p>

Vous n'avez pas toujours besoin de mettre la valeur de l'attribut entre simples quotes. Les régles à ce sujet sont cependant subtiles, et il est beaucoup plus simple de toujours mettre entre simples quotes les valeurs des attributs.

### 3.2.1. A faire…

Pour tester les exemples donnés dans ce document, vous devrez installer des logiciels sur votre système et vérifiez qu'une variable d'environnement est correctement définie.

1. Téléchargez et installez `textproc/docproj` du catalogue des logiciels portés de FreeBSD. C'est un méta-port qui doit télécharger et installer tous les programmes et fichiers utilisés par le Projet de Documentation.

2. Ajoutez les lignes pour définir `SGML_CATALOG_FILES` à vos procédures d'initialisation de l'interpréteur de commandes.

   Exemple 3.6. `.profile`, pour les utilisateurs de sh(1) et bash(1)
   SGML_ROOT=/usr/local/share/xml SGML_CATALOG_FILES=${SGML_ROOT}/jade/catalog SGML_CATALOG_FILES=${SGML_ROOT}/iso8879/catalog:$SGML_CATALOG_FILES SGML_CATALOG_FILES=${SGML_ROOT}/html/catalog:$SGML_CATALOG_FILES SGML_CATALOG_FILES=${SGML_ROOT}/docbook/catalog:$SGML_CATALOG_FILES export SGML_CATALOG_FILES
   Exemple 3.7. `.login`, pour les utilisateurs de csh(1) et tcsh(1)
   setenv SGML_ROOT /usr/local/share/xml setenv SGML_CATALOG_FILES ${SGML_ROOT}/jade/catalog setenv SGML_CATALOG_FILES ${SGML_ROOT}/iso8879/catalog:$SGML_CATALOG_FILES setenv SGML_CATALOG_FILES ${SGML_ROOT}/html/catalog:$SGML_CATALOG_FILES setenv SGML_CATALOG_FILES ${SGML_ROOT}/docbook/catalog:$SGML_CATALOG_FILES

   Déconnectez-vous et reconnectez-vous ensuite, ou exécutez ces commandes pour définir la variable d'environnement.

3. Créez un fichier `exemple.xml`, où vous mettrez :

   <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head> <title>Exemple de fichier HTML</title> </head> <body> <p>C'est un paragraphe avec du texte.</p> <p>C'est encore un paragraphe avec du texte.</p> <p align="right">Ce paragraphe sera peut-être justifié &agrave; droite.</p> </body> </html>

4. Essayez de le valider avec un analyseur syntaxique SGML.

   L'analyseur syntaxique nsgmls(1) fait partie de `textproc/docproj`. nsgmls(1) lit normalement un document marqué en utilisant une DTD SGML et génère l'Element Structure Information Set (ESIS) - Informations sur la Structuration en Eléments - mais cela ne nous concerne pas pour le moment.

   Néanmoins, avec le paramètre `-s`, nsgmls(1) ne génère rien mais affiche simplement les messages d'erreurs éventuels. C'est utile pour vérifier si votre document est correct ou non.

   Utilisez nsgmls(1) pour vérifier si votre document est valide :

   `%` `nsgmls -s example.xml`

   Vous constaterez que nsgmls(1) n'affiche rien. Cela signifie qu'il a validé votre document.

5. Voyez ce qui ce passe si vous oubliez un élément requis. Supprimez les marques `title` et `/title` et relancer la validation.

   `%` `nsgmls -s example.xml` nsgmls:example.xml:5:4:E: character data is not allowed here nsgmls:example.xml:6:8:E: end tag for "HEAD" which is not finished

   Les messages d'erreur de nsgmls(1) sont structurés en colonnes séparés par des deux-points ou des points-virgules.

   Colonne | Signification
   --- | ---
   1 | Nom du programme qui a généré l'erreur. Ce sera toujours `nsgmls`.
   2 | Nom du fichier où se trouve l'erreur.
   3 | Numéro de la ligne où se trouve l'erreur.
   4 | Numéro de la colonne où se trouve l'erreur.

   5

   Une lettre donnant le type de message d'erreur. `I` pour un message d'information, `W` pour un message d'avertissement, `E` pour un message d'erreur et `X` pour les références croisées. (Ce n'est cependant pas toujours la cinquième colonne. `nsgmls -sv` affiche `nsgmls:I: SP version "1.3"` - selon la version installée. Comme vous pouvez le constater, c'est un message d'information.) Vous voyez donc que nous avons dans notre exemple des messages d'erreurs.

   6 | Le texte du message d'erreur.

   Vous aurez plus d'informations sur les erreurs de nsgmls(1) dans la Unofficial 'Kindler, Gentler HTML Validator' FAQ.

   Ne pas mettre les marques `title` a généré 2 erreurs différentes.

   La première erreur indique que l'analyseur SGML a rencontré un contenu (ici, des caractères, au lieu d'une marque de début d'élément) alors qu'il attendait autre chose. Dans le cas présent, l'analyseur attendait une marque de début pour un élément valide à l'intérieur de `head` (`title` par exemple).

   La deuxième erreur est due au fait que les éléments `head` doivent contenir un élément `title`. nsgmls(1) considère alors que l'élément n'est pas complet. La marque de fin indique donc que l'élément se termine alors qu'il n'est pas correctement renseigné.

6. Remettez l'élément `title` en place.

Précédent | Niveau supérieur | Suivant
Chapitre 3. Introduction à SGML | Sommaire | 3.3. La déclaration DOCTYPE

Ce document, ainsi que d'autres peut être téléchargé sur ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/

Pour toutes questions à propos de FreeBSD, lisez la documentation avant de contacter <questions@FreeBSD.org>.
Pour les questions sur cette documentation, contactez <doc@FreeBSD.org>.