La version française de cette traduction est :
http://www.la-grange.net/w3c/html4.01/

Traducteur : Karl Dubost - <karl+misc@la-grange.net> dans le cadre de l'effort de la liste de discussion w3c-translators.fr@w3.org
La version française peut contenir des erreurs. La version anglaise de cette note est l'unique version normative. Version originale : http://www.w3.org/TR/1999/REC-html401-19991224


3 À propos de SGML et HTML

Sommaire

  1. Introduction à SGML
  2. Les structures SGML utilisées en HTML
    1. Les éléments
    2. Les attributs
    3. Les références de caractères
    4. Les commentaires
  3. Comment lire le DTD de HTML
    1. Les commentaires du DTD
    2. Les définitions des entités paramètres
    3. Les déclarations des éléments
    4. Les déclarations des attributs

Cette section du document introduit le langage SGML et présente ses relations avec HTML. La présentation complète de SGML en est laissée à la norme (voir [ISO8879]).

3.1 Introduction à SGML

Le langage SGML est un système qui permet de définir des langages de balisage. Les auteurs balisent leurs documents en marquant les informations de structure, de présentation et sur la sémantique tout au long du document. HTML est un exemple de langage de balisage. Voici un exemple de document HTML :

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
     "http://www.w3.org/TR/html4/strict.dtd">
<HTML>
   <HEAD>
      <TITLE>Mon premier document HTML</TITLE>
   </HEAD>
   <BODY>
      <P>Bonjour tout le monde !
   </BODY>
</HTML>

Un document HTML se divise en deux parties, une section d'en-tête (ici, entre <HEAD> et </HEAD>) et un corps (ici, entre <BODY> et </BODY>). Le titre du document apparaît dans l'en-tête (en même temps que d'autres informations concernant le document) et le contenu du document apparaît dans le corps. Dans cet exemple, le corps contient un unique paragraphe, balisé par <P>.

Chaque langage de balisage, défini en SGML, est appelé une application SGML. Une application SGML se caractérise généralement par :

  1. Une déclaration SGML. La déclaration SGML spécifie quels caractères et quels délimiteurs peuvent apparaître dans l'application ;
  2. Une définition de type de document (DTD). Le DTD définit la syntaxe des structures de balisage. Le DTD peut inclure des définitions supplémentaires tels que des références d'entités de caractères ;
  3. Une spécification qui décrit la sémantique imputée au balisage. Cette spécification impose également des restrictions sur la syntaxe qui ne peuvent pas être exprimées dans le DTD ;
  4. Les instances du document contenant les données (le contenu) et le balisage. Chaque instance contient une référence au DTD qui doit être utilisé pour l'interpréter.

Cette spécification comprend une déclaration SGML, trois définitions de type de document (voir la section sur les informations de version HTML pour une description des trois) et une liste des références de caractères.

3.2 Les structures SGML utilisées dans HTML

Les sections suivantes présentent les structures SGML qui sont utilisées dans HTML.

L'appendice liste quelques une des fonctionnalités de SGML qui sont rarement gérées par les outils et les agents utilisateurs HTML et qui donc devraient être évitées.

3.2.1 Les éléments

Une définition de type de document SGML déclare les types d'élément qui représentent les structures ou les comportements voulus. HTML comprend des types d'élément qui représentent des paragraphes, des liens hypertextes, des listes, des tables, des images, etc.

Chaque déclaration de type d'élément décrit généralement trois parties : une balise ouvrante, un contenu et une balise fermante.

Le nom de l'élément apparaît dans la balise ouvrante (écrit selon cette forme-ci <nom-élément>) et la balise fermante (écrit selon cette forme-là </nom-élément>) ; remarquez le caractère barre oblique « / » avant le nom de l'élément, dans la balise fermante. Par exemple, les balises ouvrante et fermante du type d'élément UL délimitent les éléments d'une liste :

<UL>
<LI><P>...élément de liste 1...
<LI><P>...élément de liste 2...
</UL>

Certains types d'élément HTML autorisent les auteurs à omettre la balise fermante (par exemple, les types d'élément P et LI). Quelques rares types d'élément admettent également l'omission de la balise ouvrante ; par exemple, HEAD et BODY. Le DTD de HTML indique, pour chaque type d'élément, si les balises ouvrantes ou fermantes sont obligatoires ou non.

D'autres types d'élément HTML ne possèdent aucun contenu. Par exemple, l'élement de saut de ligne BR n'a aucun contenu ; son seul rôle est de terminer une ligne de texte. De tels éléments vides n'ont jamais de balise fermante. La définition de type de document et le texte de la spécification indiquent si un type d'élément est vide (sans contenu) ou sinon, s'il peut avoir un contenu, ce qui est considéré comme contenu légal.

Les noms des éléments sont toujours insensibles à la casse.

Veuillez consulter la norme SGML pour obtenir plus d'informations à propos des règles qui contrôlent les éléments (par exemple, ils doivent être correctement imbriqués, c'est-à-dire, une balise fermante referme, en remontant jusqu'à la balise ouvrante correspondante, toutes les balises ouvrantes intermédiaires avec des balises fermantes manquantes, (section 7.5.1), etc.).

Par exemple, le paragraphe suivant :

<P>Ceci est le premier paragraphe.</P>
...un élément de bloc...

peut être réécrit sans sa balise fermante :

<P>Ceci est le premier paragraphe.
...un élément de bloc...

tant que la balise ouvrante <P> soit fermée par l'élément de bloc suivant. De la même manière, si un paragraphe est imbriqué dans un élément de bloc, tel que :

<DIV>
<P>Ceci est le paragraphe.
</DIV>

la balise fermante de l'élément de bloc englobant (ici, </DIV>) implique automatiquement la balise fermante de la balise ouvrante libre <P>.

Les éléments ne sont pas des balises. Certaines personnes font référence aux éléments comme à des balises (par exemple, « la balise P »). Souvenez-vous que l'élément est une chose et que la balise en est une autre (qu'elle soit ouvrante ou fermante). Par exemple, l'élément HEAD est toujours présent, même si les balises ouvrante et fermante de HEAD peuvent être absentes dans le balisage.

Tous les types d'élément déclarés dans cette spécification sont listés dans l'index des éléments.

3.2.2 Les attributs

Les éléments peuvent avoir des propriétés qui leur sont associées, appelées attributs, et qui peuvent avoir des valeurs (par défaut, ou encore définies par l'auteur ou par un script). Les couples attribut/valeur apparaissent avant le caractère « > » final de la balise ouvrante d'un élément. Un nombre quelconque de couples attribut/valeur (autorisés), séparés par des espaces, peut apparaître dans la balise ouvrante d'un élément. Ils peuvent survenir dans n'importe quel ordre.

Dans cet exemple, l'attribut id est défini pour un élément H1 :

<H1 id="section1">
Ceci est un titre identifié grâce à l'attribut id
</H1>

Par défaut, SGML exige que toutes les valeurs d'attribut soient délimitées en utilisant indiféremment les guillemets doubles (code décimal ASCII 34) ou les guillemets simples (code décimal ASCII 39). Les guillemets simples peuvent être inclus à l'intérieur de la valeur d'attribut quand la valeur est délimitée par des guillemets doubles, et vice versa. Les auteurs peuvent également utiliser les références de caractères numériques pour représenter le guillemet double « &#34; » et le guillemet simple « &#39; ». Pour le guillemet double, les auteurs peuvent également utiliser la référence d'entité de caractère « &quot; ».

Dans certains cas, les auteurs peuvent spécifier la valeur d'un attribut sans guillemets. La valeur d'attribut peut contenir uniquement les lettres (a-z et A-Z), les chiffres (0-9), le caractère trait d'union « - » (code décimal ASCII 45), le caractère virgule (code décimal ASCII 46), le caractère souligné « _ » (code décimal ASCII 95) et le caractère deux-points « : » (code décimal ASCII 58). Nous recommandons l'utilisation des guillemets même lorsqu'il est possible de les omettre.

Les noms des attributs sont toujours insensibles à la casse.

Les valeurs des attributs sont généralement insensibles à la casse. La définition de chaque attribut, dans le manuel de référence, indique si sa valeur est indifférente ou non à la casse.

Tous les attributs définis par cette spécification sont listés dans l'index des attributs.

3.2.3 Les références de caractères

Les références de caractères sont des noms numériques ou symboliques pour les caractères qui peuvent être inclus dans un document HTML. Ils sont utiles pour faire appel aux caractères rarement utilisés ou ceux que les outils d'édition rendent difficiles ou impossibles à saisir. Vous verrez des références de caractères tout au long de ce document ; ils commencent par un signe « & » et se termine par un caractère point-virgule « ; ». En voici des exemples courants :

Nous expliquons les références de caractères HTML en détails un peu plus loin dans la section sur les jeux de caractères d'un document HTML. La spécification contient également une liste des références de caractères qui peuvent apparaître dans les documents HTML 4.

3.2.4 Les commentaires

Les commentaires HTML ont la syntaxe suivante :

<!-- ceci est un commentaire -->
<!-- ainsi que celui ci,
    qui occupe plus d'une ligne -->

Les blancs [ndt. white space] ne sont pas permis entre le délimiteur d'ouverture de la déclaration de balisage « <! » et le délimiteur d'ouverture de commentaire « -- », mais ils sont autorisés entre le délimiteur de fin de commentaire « -- » et le délimiteur de fin de déclaration de balisage « > ». Une erreur classique c'est inclure une chaîne de traits d'union « --- » à l'intérieur d'un commentaire. Les auteurs devraient éviter de placer deux traits d'unions adjacents, ou plus, à l'intérieur des commentaires.

L'information qui apparaît entre les commentaires n'a aucune signification particulière (par exemple, les références de caractères ne sont pas interprétées comme telles).

Remarquez que les commentaires sont du balisage.

3.3 Comment lire le DTD de HTML

Chaque déclaration d'élément et d'attribut dans cette spécification est accompagnée par son fragment de définition de type de document. Nous avons choisi d'inclure les fragments de DTD dans la spécification, plutôt que de rechercher une manière plus compréhensible, mais plus longue et moins précise, de décrire les propriétés d'un élément. Le mode d'emploi suivant devrait permettre aux lecteurs non familiarisés avec SGML de lire le DTD et de comprendre les détails techniques de la spécification HTML.

3.3.1 Les commentaires du DTD

Dans les DTD, les commentaires peuvent s'étaler sur une ou plusieurs lignes. Dans le DTD, les commentaires sont délimités par une paire de marques « -- », par exemple :

<!ELEMENT PARAM - O EMPTY       -- valeur de propriete nommee -->

Ici, le commentaire « valeur de propriété nommée » explique l'utilisation du type d'élément PARAM. Les commentaires du DTD sont uniquement informatifs.

3.3.2 La définition des entités paramètres

Le DTD de HTML commence par une série de définitions d'entités paramètres. Une définition d'entité paramètre définit une sorte de macrocommande qui peut être appelée et résolue ailleurs dans le DTD. Ces macrocommandes ne peuvent pas apparaître dans les documents HTML, seulement dans le DTD. D'autres types de macrocommandes, appelées références de caractères, peuvent être utilisées elles dans le texte d'un document HTML ou à l'intérieur des valeurs des attributs.

Quand l'entité paramètre est appelée par son nom dans le DTD, elle est alors développée sous la forme d'une chaîne de caractères.

Une définition d'entité paramètre commence par le mot-clé « <!ENTITY % », suivi par le nom de l'entité, la chaîne de caractères entre guillemets correspondant au développement de l'entité et finalement un caractère de fermeture « > ». Les instances des entités paramètres dans un DTD commencent par « % », suivi du nom de l'entité paramètre et terminé par un caractère point-virgule « ; » optionnel.

L'exemple suivant définit la chaîne de caractères dans laquelle l'entité « %fontstyle; » se développera :

<!ENTITY % fontstyle "TT | I | B | BIG | SMALL">

la chaîne de caractère correspondant à l'entité paramètre peut contenir d'autres noms d'entités paramètres. Ces noms sont alors développés récursivement. Dans l'exemple suivant, l'entité paramètre « %inline; » est définie de façon à inclure les entités paramètres « %fontstyle; », « %phrase; », « %special; » et « %formctrl; ».

<!ENTITY % inline "#PCDATA | %fontstyle; | %phrase; | %special; | %formctrl;">

Vous rencontrerez fréquemment deux entités de DTD dans le DTD de HTML : « %block; » et « %inline; ». Elles sont utilisées lorsque le modèle de contenu comprend, respectivement, des éléments de bloc et des éléments en-ligne, (définis dans la section sur la structure globale d'un document HTML).

3.3.3 Les déclarations des éléments

Le substrat du DTD de HTML est constitué des déclarations des types d'éléments et leurs attributs. Le mot-clé « <!ELEMENT » commence une déclaration et le caractère « > » la termine. Entre ceux-ci sont spécifiés :

  1. le nom de l'élément ;
  2. si les balises de l'élément sont ou non optionnelles. Quand deux traits d'union apparaissent après le nom de l'élément, cela signifie que les balises ouvrante et fermante sont obligatoires. Un trait d'union suivi par la lettre « 0 » signifie que la balise fermante peut être omise. Une paire de lettres « 0 » indique que les balises ouvrante comme fermante peuvent être omises ;
  3. le contenu de l'élément, s'il existe. On appelle le contenu qui est autorisé pour un élément son modèle de contenu. Les types d'éléments qui sont destinés à n'avoir aucun contenu sont appelés éléments vides. Le modèle de contenu de tels éléments est déclaré en utilisant le mot-clé « EMPTY ».

Dans cette exemple :

    <!ELEMENT UL - - (LI)+>

Cet exemple illustre la déclaration d'un type d'élément vide :

    <!ELEMENT IMG - O EMPTY>

Les définitions du modèle de contenu

Le modèle de contenu décrit ce que peut contenir une instance d'un type d'élément. Les définitions du modèle de contenu peuvent inclure :

Le modèle de contenu d'un élément est spécifié selon la syntaxe suivante. Veuillez remarquer que la liste suivante constitue une simplification des règles de la syntaxe SGML complète et ne permet pas, par exemple, de définir les préséances.

( ... )
Délimite un groupe.
A
A doit être présent, une fois seulement.
A+
A doit être présent une ou plusieurs fois.
A?
A doit être présent zéro ou une fois.
A*
A peut être présent zéro ou plusieurs fois.
+(A)
A peut être présent.
-(A)
A ne peut pas être présent.

errata-14

A | B
A ou B peuvent l'un ou l'autre être présents, mais pas les deux.
A , B
A et B doivent tous deux être présents, dans cet ordre.
A & B
A et B doivent tous deux être présents, dans n'importe quel ordre.

Les exemples suivants sont tirés du DTD de HTML :

   <!ELEMENT UL - - (LI)+>

L'élément UL doit contenir un ou plusieurs éléments LI.

   <!ELEMENT DL    - - (DT|DD)+>

L'élément DL doit contenir un ou plusieurs éléments DT ou DD, dans n'importe quel ordre.

   <!ELEMENT OPTION - O (#PCDATA)>

L'élément OPTION peut contenir seulement du texte et des entités, telles que &amp; -- ceci est indiqué par le type de données SGML « #PCDATA ».

Quelques uns des types d'élément HTML utilisent une fonctionnalité supplémentaire SGML pour exclure des éléments de leur modèle de contenu. Les éléments exclus sont précédés par un trait d'union. Les exclusions explicites sont prioritaires sur les éléments autorisés.

Dans cet exemple, la présence de « -(A) » signifie que l'élément A ne peut pas apparaître dans un autre élément A (c.à-d., les ancres ne peuvent pas être imbriquées).

   <!ELEMENT A - - (%inline;)* -(A)>

Remarquez que le type d'élément A, qui fait pourtant partie de l'entité paramètre « %inline; » du DTD, est exclu explicitement à cause de « -(A) ».

De la même manière, la déclaration de type d'élément suivante pour FORM interdit les formulaires imbriqués :

   <!ELEMENT FORM - - (%block;|SCRIPT)+ -(FORM)>

3.3.4 Les déclarations des attributs

Le mot-clé « <!ATTLIST » commence la déclaration des attributs admis par un élément. Il est suivi par le nom de l'élément en question, une liste des définitions d'attribut et un caractère « > » de fermeture. Chaque définition d'attribut forme un triplet qui définit :

Dans cet exemple, l'attribut name est défini pour l'élément MAP. L'attribut est optionnel pour cet élément.

<!ATTLIST MAP
  name        CDATA     #IMPLIED
  >

Les valeurs autorisées pour l'attribut sont donnés comme étant du type « CDATA », un type de données SGML. Le type « CDATA » représente du texte qui peut contenir des références de caractères.

Pour plus d'information sur les types « CDATA », « NAME », « ID » et les autres types de données, veuillez consulter la section sur les types de données HTML.

Les exemples suivants illustrent plusieurs définitions d'attribut :

rowspan     NUMBER     1         -- nombre de rangées occupées par la cellule --
http-equiv  NAME       #IMPLIED  -- nom de l'en-tête de réponse HTTP  --
id          ID         #IMPLIED  -- id unique sur l'ensemble du document --
valign      (top|middle|bottom|baseline) #IMPLIED

L'attribut « rowspan » requiert une valeur de type « NUMBER ». La valeur par défaut est donnée explicitement comme étant "1". L'attribut « http-equiv » requiert une valeur de type « NAME ». L'attribut optionnel « id » requiert une valeur de type ID. L'attribut optionnel « valign » est contraint de prendre l'une des valeurs de l'ensemble {top, middle, bottom, baseline}.

Les entités du DTD dans les définitions d'attributs

Les définitions d'attributs peuvent également contenir les références d'entités paramètres.

Dans cet exemple, nous voyons que la liste des définitions d'attributs pour l'élément LINK commence par l'entité paramètre « %attrs; ».

<!ELEMENT LINK - O EMPTY               -- un lien independant du média -->
<!ATTLIST LINK
  %attrs;                              -- %coreattrs, %i18n, %events --
  charset     %Charset;      #IMPLIED  -- encodage caractères de la ressource appelée --
  href        %URI;          #IMPLIED  -- URI de la ressource appelée --
  hreflang    %LanguageCode; #IMPLIED  -- code de langue --
  type        %ContentType;  #IMPLIED  -- type de contenu consultatif --
  rel         %LinkTypes;    #IMPLIED  -- types de lien relatif --
  rev         %LinkTypes;    #IMPLIED  -- types de lien à rebours --
  media       %MediaDesc;    #IMPLIED  -- pour restitution sur ce média --
  >

balise ouvrante : obligatoire, balise fermante : interdite

L'entité paramètre « %attrs; » est définie ainsi :

<!ENTITY % attrs "%coreattrs; %i18n; %events;">

L'entité paramètre « %coreattrs; » dans la définition de « %attrs; » se développe ainsi :

<!ENTITY % coreattrs
 "id          ID             #IMPLIED  -- id unique sur tout le document --
  class       CDATA          #IMPLIED  -- liste de classes, séparées par des espaces --
  style       %StyleSheet;   #IMPLIED  -- info de style associé --
  title       %Text;         #IMPLIED  -- titre consultatif --"
  >

L'entité paramètre « %attrs; » a été définie par commodité puisque ces attributs sont définis pour la plupart des types d'élément HTML.

De même, le DTD définit l'entité paramètre « %URI; » comme se développant dans la chaîne de caractères "CDATA".

<!ENTITY % URI "CDATA"
    -- un identifiant de ressource uniforme (URI),
       voir [URI]
    -->

Ainsi que le montre l'exemple, l'entité paramètre « %URI; » fournit aux lecteurs du DTD plus d'informations, tel le type de données attendu par un attribut. Des entités similaires ont été définies pour « %Color; », « %Charset; », « %Length; », « %Pixels; », etc.

Les attributs booléens 

Certains attributs jouent le rôle de variables booléennes (par exemple, l'attribut selected de l'élément OPTION). Leur apparition dans la balise ouvrante d'un élément implique que la valeur de l'attribut est « vraie ». Leur absence implique une valeur « fausse ».

Les attributs booléens peuvent légalement prendre une valeur unique : le nom de l'attribut lui-même (par exemple, selected="selected").

Cet exemple définit l'attribut selected comme étant un attribut booléen.

selected     (selected)  #IMPLIED  -- option présélectionnée --

L'attribut prend la valeur « vraie » du fait de sa présence dans la balise ouvrante de l'élément :

<OPTION selected="selected">
...contenus...
</OPTION>

En HTML, les attributs booléens peuvent apparaître dans leur forme minimisée -- la valeur de l'attribut apparaît seule dans la balise ouvrante de l'élément. Donc, l'attribut selected peut être défini en écrivant :

<OPTION selected>

à la place de :

<OPTION selected="selected">

Les auteurs devraient avoir connaissance du fait que nombre d'agents utilisateurs reconnaissent seulement la forme minimisée des attributs booléens et non leur forme complète.