# Le langage SGML/Version imprimable

* Si vous imprimez cette page, choisissez « Aperçu avant impression » dans votre navigateur, ou cliquez sur le lien Version imprimable dans la boîte à outils, vous verrez cette page sans ce message, ni éléments de navigation sur la gauche ou en haut.
* Cliquez sur Rafraîchir cette page pour obtenir la dernière version du wikilivre.
* Pour plus d'informations sur les version imprimables, y compris la manière d'obtenir une version PDF, vous pouvez lire l'article Versions imprimables.
Une version à jour et éditable de ce livre est disponible sur Wikilivres, une bibliothèque de livres pédagogiques, à l'URL : https://fr.wikibooks.org/wiki/Le_langage_SGML

# Historique

SGML est l'acronyme en anglais de Standard Generalized Markup Language signifiant « langage de balisage généralisé normalisé ». C'est un langage de description général pour les documents formalisé par la norme ISO 8879:1986, employé dans les industries de la documentation et de l'édition.

## Création

Initialement, les documents étaient écrits avec des mises en formes spécifiques à la machine et aux imprimantes. En 1967, William Tunnicliffe présente pour la première fois une approche pour séparer le fond du document par rapport à sa forme. C’est le début du GCA GenCode Committee qui élaborera les bases du premier langage de balisage généralisé.
En 1969, par Charles Goldfarb (chef de projet chez IBM), Edward Mosher et Raymond Lorie ont créé un langage descriptif appelé Generalized Markup Language (GML, initialement un acronyme de leurs noms : Goldfarb, Mosher et Lorie), destiné à encapsuler un ancien langage Script d'impression trop lié physiquement aux possibilités techniques des imprimantes, basé sur les travaux de William Tunnicliffe. L'ensemble du GML et du langage d'impression compose le DCF (Document Composition Facility) où l'interprétation du balisage est indiqué par un fichier spécial nommé le profile, ainsi qu'une bibliothèque de macros. Le GML permit à IBM de construire un système de gestion de toute sa documentation : 90 % des documents techniques sont écrits en GML.
En 1986, Goldfarb a quitté IBM et développé le successeur du GML nommé SGML publié sous la norme ISO 8879:1986.

## Utilisation

Dès 1984, les communautés européennes s'associent à ce développement novateur en adoptent le SGML comme standard pour leurs très nombreuses publications officielles, dans le cadre du projet FORMEX (Formalized Exchange of Electronic Publications). Elles développent aussi Mark-It, le premier parser SGML qui ne souffre pas de restrictions par rapport aux spécifications les plus avancées du SGML.
L'un des principes fondamentaux sur lequel repose le SGML est la séparation complète entre la structure logique d'un document (titres, chapitres, paragraphes, illustrations…), qui est identifiée par des balises insérées dans le document lui-même, et sa mise en page, qui dépend du support de présentation (livre, journal, écran, graphique même) et qui est définie en dehors du document dans une ou plusieurs feuilles de style (police, style, taille et couleur des caractères, alignement et espacement des paragraphes…).
SGML rationalise les systèmes documentaires d'IBM ; plus de 90 % de la documentation est écrite en GML. En France, son utilisation a beaucoup facilité le travail des avionneurs, Airbus reprenant ainsi la documentation de la SNECMA aussitôt affichable sous ses propres normes, et récupérée à leur tour par ses propres clients qui les affichaient à leurs normes ; ou par des arsenaux livrant facilement à leurs clients (armée de l'air, marine et armée de terre, et parfois armées étrangères) des documentations à ces normes personnalisées sans aucun surcoût.
Ce langage devient notamment un standard de représentation au CERN, qui a besoin d'unifier de façon rigoureuse la présentation des documents de ses équipes mais sans pour autant les déconcentrer en leur imposant des détails techniques de typographie. L'INRIA réalisera un des premiers éditeurs SGML, appelé Grif, de type traitement de texte avec une interface voisine de celle de Word.
En 1989, Tim Berners-Lee crée le HTML, une autre application de SGML, pour le World Wide Web. En adoptant la syntaxe du SGML pour HTML, Tim Berners-Lee confrontait une technologie complexe à de plus en plus d'utilisateurs.
En 1995, Dan Connolly rejoint le World Wide Web Consortium (W3C) et ajoute le SGML à la liste des activités de cet organisme de standardisation. XML est créé dans l'objectif de définir un langage aussi générique, mais plus simple que SGML. De fait, XML est un sous-ensemble de SGML. La spécification du 10 février 1998 explique que « Son but est de permettre au SGML générique d'être transmis, reçu et traité sur le Web de la même manière que l'est HTML aujourd'hui ».

## Références

* ↑ http://www.sgmlsource.com/history/sgmlhist.htm — « A Brief History of the Development of SGML »
* ↑ https://www.iso.org/fr/standard/16387.html — ISO 8879:1986 — « Traitement de l'information — Systèmes bureautiques — Langage normalisé de balisage généralisé (SGML) »

# Syntaxe

Les documents au format SGML décrivent une structure arborescente où chaque nœud contient du texte de contenu et plusieurs autres nœuds. La syntaxe se base sur quelques éléments décrits brièvement dans cette section et de manière plus détaillée dans les chapitres suivants.

## Élément/balise

Un élément ou balise définit un conteneur. Le premier élément est l'élément racine du document, et contient tous les autres éléments, directement ou indirectement.
La syntaxe utilise les signes < et > pour encadrer le nom de l'élément.
Exemple :
Cette première syntaxe est celle de l'ouverture d'un élément. Après son ouverture, le contenu de l'élément est décrit : texte, éléments imbriqués, ... Puis l'élément est fermé en utilisant la syntaxe de fermeture. Cette syntaxe est presque identique à celle de l'ouverture, excepté qu'il n'y a aucun attribut et que le nom est précédé d'un caractère slash.
Exemple :
Ce chapitre donne un bref aperçu de la syntaxe ; pour plus de détails sur la syntaxe des éléments, voir le chapitre Éléments, et Attributs pour leurs attributs.

## Attribut

Un élément peut avoir des attributs afin de spécifier des informations liées à l'élément lui-même (par exemple, un identificateur unique permettant de retrouver cet élément). Chaque attribut a un nom et une valeur spécifiés avec la syntaxe nom="valeur". Ils doivent être placés sur la balise d'ouverture de l'élément, après le nom et avant le caractère >.
Exemple :
Ce chapitre donne un bref aperçu de la syntaxe ; pour plus de détails sur la syntaxe des éléments, voir le chapitre Attributs.

## Commentaire

Les commentaires sont utiles pour expliquer la syntaxe ou le contenu sans que les explications appartiennent au contenu du document. Leur syntaxe est basée sur celles des balises spéciales en encadrant le texte du commentaire entre <!-- et -->.
Exemple :

## Balises spéciales

Les balises spéciales permettent d'insérer des informations n’appartenant pas au contenu du document lui-même. Les commentaires vus précédemment sont une forme de balises spéciales à ignorer. Le contenu des balises spéciales est inclut entre <! et >.
La première balise spéciale que l'on trouve en général est celle du DOCTYPE spécifiant le type du document et le DTD utilisable pour l'interpréter. Cette balise est placée en première position dans le document.
Exemple :

## Structure globale

Les sections précédentes décrivent les différents éléments de la syntaxe sans détails. L'exemple de document ci-dessous utilise la syntaxe vue dans ce chapitre, avec imbrication d'éléments, attributs et commentaires. La syntaxe est détaillée dans les chapitres suivants.

# Éléments

Un élément ou balise définit un conteneur de données, un nœud de la structure arborescente du document. Le premier élément est l'élément racine du document, et contient tous les autres éléments, directement ou indirectement.
Un élément peut être attaché à des informations spécifiques sous forme d'attributs qui seront vus en détails dans le chapitre suivant.
Le contenu d'un élément commence après la balise d'ouverture d'un élément et se termine avant la balise de fermeture.

## Balise d'ouverture

La syntaxe utilise les signes < et > pour encadrer le nom de l'élément.
Exemple :
L'élément peut avoir des attributs afin de spécifier des informations qui lui sont liées à l'élément lui-même (par exemple, un identificateur unique permettant de retrouver cet élément). Chaque attribut a un nom et une valeur spécifiés avec la syntaxe nom="valeur". Ils doivent être placés sur la balise d'ouverture de l'élément, après le nom et avant le caractère >.
Exemple :

## Balise de fermeture

L'élément est fermé en utilisant une balise de fermeture. Sa syntaxe est presque identique à celle de l'ouverture, excepté qu'il n'y a aucun attribut et que le nom est précédé d'un caractère slash.
Exemple :
Selon les règles définies par le DTD pour chaque élément :
* La fermeture peut être implicite, et la présence d'une balise de fermeture est inutile,
* La reprise du nom de l'élément n'est pas obligatoire, l'élément pouvant être fermé avec </> :

### Fermeture implicite

La fermeture implicite de l'élément rend l'utilisation d'une balise de fermeture inutile. Dans la DTD, la définition des éléments contient un caractère concernant la présence de la balise de fermeture :
* - Balise requise,
* O Balise optionnelle.
En HTML certains éléments n'ayant aucun contenu (mais des attributs selon les cas) sont fermés implicitement :
En XML et en XHTML, la fermeture implicite n'est pas autorisée : tout élément ouvert doit être fermé explicitement.

# Attributs

Un élément peut avoir des attributs afin de spécifier des informations liées à l'élément lui-même. Par exemple, un identificateur unique permettant de retrouver un élément sera spécifié sous la forme d'un attribut. Un attribut a un nom et en général une valeur associée.

## Syntaxe

Un attribut a un nom et une valeur spécifiés avec la syntaxe nom="valeur". Ils doivent être placés sur la balise d'ouverture de l'élément, après le nom et avant le caractère >.
Exemple :
Un attribut peut ne pas avoir de valeur.
Exemple :
En XML et en XHTML, l'absence de valeur n'est pas autorisée : tout attribut doit avoir une valeur explicitement spécifiée.

# Commentaires

Les commentaires sont utiles pour expliquer la syntaxe ou le contenu sans que les explications appartiennent au contenu du document.

## Syntaxe

Leur syntaxe est basée sur celles des balises spéciales en encadrant le texte du commentaire entre <!-- et -->.
Exemple :
Cette syntaxe est aussi utilisée en HTML et XML.
Cependant la syntaxe est plus complexe : les commentaires commencent et se terminent par un double tiret à l'intérieur de la déclaration des types de document SGML, comme dans l'exemple ci-dessous qui est un extrait de la déclaration du type des documents XML :
L'exemple ci-dessus contient 3 commentaires mis en évidence dans la déclaration entre <! et !>.
Cette syntaxe, légale en SGML, mais interdit l'utilisation d'une séquence de tirets dans les commentaires en XML et HTML.

# Texte

Les éléments d'un document structuré en SGML contiennent d'autres éléments ou du texte brut informel non structuré. Un texte doit obligatoirement être contenu dans un élément, l'objectif premier du SGML étant la représentation explicite de la structure logique du texte : chapitres, paragraphes, sections, indexs, ... L'affichage d'un document SGML dépend de la DTD du document, de la feuille de style associée, et d'éventuelles instructions de présentation. Un autre objectif du SGML était de permettre l'indexation du contenu textuel.

## Jeu de caractères dans un document

La spécification SGML prévoit des mécanismes pour autoriser l'inclusion de tout caractère Unicode 2.0 (ISO/IEC 10646) dans un document SGML. Un document débute généralement par une ou plusieurs déclarations dont une définition du jeu de caractère employé. La première déclaration référence un jeu de caractère par un identifiant public reconnu. Des caractères additionnels peuvent être définis en utilisant leur point de code Unicode.

## Dans un élément

Un texte doit obligatoirement être contenu dans un élément.
Exemple :
Le texte de l'élément section de l'exemple ci-dessous peut être interprété comme du SGML :
Pour éviter l'interprétation d'un texte contenant une syntaxe SGML, il est possible d'utiliser un balisage CDATA :

# DTD

SGML facilite le développement de types de documents ou de langages de marquage spécialisés. Une application SGML est un ensemble de règles pour l'utilisation d'un ou plusieurs types de documents. Elle est généralement développée après identification des besoins d'échanges formels de données dans une communauté, un secteur d'activité, ...
Une définition de type de document est composée de deux parties : une partie formelle en SGML appelée DTD, et un ensemble de conventions d'application.

## DTD

DTD signifie Document Type Definition en anglais, c'est à dire Définition de Type de Document en français. Il s'agit d'un fichier définissant la syntaxe des documents, et permet donc leur validation :
* Nom d'élément valides,
* Attributs qu'ils peuvent avoir,
* Valeurs possible pour les attributs,
* Contenu possible pour les éléments.
La syntaxe des DTD est définie par la spécification du SGML. Une DTD permet la validation de documents SGML, mais aussi de documents HTML, XML et XHTML. Cependant, la DTD du HTML est normalisée, et celle d'un document XML doit respecter les restrictions et contraintes de la syntaxe XML.
Chaque DTD définit une classe de documents à laquelle sont rattachées toutes les instances similaires, sous la forme d'une grammaire donnant la liste des éléments (ou balises), des attributs, leur contenu et leur agencement, ainsi que le vocabulaire supplémentaire sous la forme d'une liste d'entités de caractère.
Exemple :
Cet exemple contient 4 déclarations d'éléments pour un type de document nommé Memo.
La séquence décrivant le contenu des éléments est entre parenthèses. Elle est précédée de deux caractères qui spécifient respectivement si la balise d'ouverture et la balise de fermeture sont obligatoires ou optionnelles :
* - Balise requise,
* O Balise optionnelle.
| <!element Memo - - (Salutation, P*, Closing?)> | L'élément <Memo> contient un élément <Salutation>, aucun ou plusieurs éléments <P>, et finir éventuellement par un élément <Closing>. |
| <!element Salutation O O (Date & To & Address?)> | L'élément <Salutation> contient un élément <Date>, un élément <To>, et finit éventuellement par un élément <Address>. |
| Les deux lettres O signifient que les balises d'ouverture et de fermetures sont optionnelles. Cela ne signifie pas que l'élément de salutation est optionnel, car il est indiqué comme obligatoire dans la séquence de l'élément Memo. Cet élément est donc toujours présent, sans aucune balise, ce qui signifie la présence de son contenu. Les deux exemples d'instances ci-dessous sont donc valides : ||
| <Memo> <Salutation> <Date></Date> <To>Lecteurs de ce wikilivre</To> </Salutation> <P>Avec les deux balises de Salutation.</P> </Memo> | <Memo> <Date></Date> <To>Lecteurs de ce wikilivre</To> <P>Sans les deux balises de Salutation.</P> </Memo> |
| <!element (P|Closing|To|Address) - O (#PCDATA)> | Les éléments <P>, <Closing>, <To> et <Address> contiennent du texte (#PCDATA). |
| <!element Date - O EMPTY> | L'élément <Date> est vide. |
La notation #PCDATA indique un contenu textuel. La notation EMPTY (sans parenthèses) indique un contenu vide.

# Liens et bibliographie

Ce chapitre présente quelques ressources supplémentaires relatives au sujet.

## Liens
### Sujets connexes sur wikilivres

* Le langage HTML : La syntaxe du langage HTML (HyperText Markup Language) est dérivée du SGML.
* Programmation XML : XML (eXtended Markup Language) est un autre langage dérivé du SGML.

### Sur les autres projets wiki

* Wikipédia : Standard Generalized Markup Language

### Autres liens

* Tutoriel en anglais sur le SGML
* ISO — Norme ISO 8879:1986