Back to home

Le langage SGML

Published:

Conçu dans les années 1960 à 1970, le langage SGML (Standard Generalized Markup Language), normalisé ISO 8879:1986, est le père des langage de description à balises d’aujourd’hui (HTML , XML). Cette introduction couvre les notions de DTD (Document Type Definition), de déclaration et de document SGML.

Ce document est une retranscription de la présentation que j’ai faite de SGML pour la société Atlantide au séminaire Langages de description en Mars 2003. Il a précédemment été publié sur mon précédent site.


Historique des langages de description et de SGML

La préhistoire

Aux débuts de l’histoire de l’informatique, l’ordinateur sert à faire du traitement par lots (batch). Il est essentiellement une machine à calculer, prenant des données en entrée, et régurgitant d’autres données en sortie. Les données sont donc sérialisées pour pouvoir alimenter l’ordinateur, et seuls des codes de contrôle permettent de les formatter. Ces caractères spéciaux, insérés au milieu du code, forment un marquage procédural des données.

L’émergence de nouveaux concepts

En 1967, William Tunnicliffe, de la GCA (Graphic Communications Association), fait une présentation au Canada dans laquelle il expose la séparation du contenu d’un document d’avec son format. A la fin des années 60, Stanley Rice (New York) propose l’idée d’un catalogue universel de balises paramétrables pour la description d’une structure éditoriale. Ces idées introduisent l’utilisation d’un nouveau type de marquage dans les données : le marquage descriptif. Le comité de composition de la GCA (composition committee) développa alors GenCode. A ce stade, il est reconnu que plusieurs marquages différents sont nécessaires suivant le type de document considéré, et que les documents peuvent être structurés en plusieurs documents plus petits. Le projet évolua pour aboutir au comité GenCode.

En 1969, sur les idées de Rice et Tunnicliffe, Charles Goldfarb, directeur de recherche chez IBM, Edward Mosher and Raymond Lorie inventèrent GML (Generalized Markup Language). GML (qui comprend aussi les initiales de ses inventeurs) permettait d’éditer et formatter du texte, et de traiter et partager de l’information sur des systèmes hétérogènes. GML introduisit le concept de type de documents, et une structure arborescente du marquage. Goldfarb continua ensuite ses recherches, créant de nouveaux concepts comme les références ou les types de documents multiples, qui furent intégrés ensuite à SGML.

Le développement de SGML

En 1978, le comité sur le traitement de l’information de l’ANSI (American National Standards Institute) créa un nouveau comité (Computer Languages for the Processing of Text committee). Goldfarb fut invité à rejoindre ce comité pour élaborer une norme basée sur GML. Malgré le peu de succès de GenCode, le GCA rejoint le comité.

Le premier brouillon du futur standard SGML est publié en 1980. En 1983, le GCA reconnaît la sixième version de SGML comme une norme : GCA 101-1983. Les premiers clients importants sont les département de la finance (IRS) et de la défense (DoD) américains. Enfin, en 1984, l’organisation ISO (International Organization for Standardization) rejoint le comité et en 1986 SGML devient une norme internationale.

Introduction

SGML est un standard international définissant des méthodes de représentation d’un texte électronique, indépendamment du matériel et du système utilisés. SGML ne définit pas un langage, mais le moyen de décrire un langage de description (ou à balises). Il s’agit d’un méta-langage.

SGML introduit :

Le document SGML

Le prologue

Tout document SGML est constitué d’un prologue et d’une instance de document. Le prologue sert à définir le langage utilisé dans l’instance de document qui suit. Il contient la DTD (Document Type Definition) et la déclaration SGML.

::SGML
<!DOCTYPE poem SYSTEM "poem.dtd" [
<!ELEMENT redifined.tag	  - -    (#PCDATA) >
<!ENTITY author         "David Soulayrol" >
<!ENTITY stanza1 SYSTEM "strophe1.sgml" >
<!ENTITY stanza1 SYSTEM "strophe2.sgml" >
]>

Le prologue est introduit par la première ligne, avec le mot-clef DOCTYPE. Il peut être présent dans le document lui-même, ou bien seulement référencé par le document (comme ici avec le mot clef SYSTEM), auquel cas il peut se présenter aussi sous une forme compilée pour le système.

La partie entre crochets appartient aussi au prologue et constitue un sous-ensemble de la DTD (DTD subset). Il permet de définir des entités propres au document, ou de modifier la DTD utilisée. Les définitions écrites dans cette parties sont lues en premier par le parser, et prennent le pas sur les définitions d’une DTD externe car seule la première déclaration compte en SGML.

D’une manière générale, la balise ouvrante <! introduit un contexte SGML. Le contenu de ce contexte est traité selon la syntaxe SGML, et non pas comme le reste du document.

L’instance de document

L’instance de document constitue le document lui-même. Il ne contient que du marquage et des données ou des références, et ne doit contenir aucune nouvelle déclaration. Un moyen efficace de construire des documents importants consiste à déclarer des entités pour chaque module du document comme ici :

::XML
<poem id=P1 status="revised">
  <title>Un Poème de &author;</title>
  &stanza1;
  &stanza2;
</poem>

La DTD (Document Type Definition)

La définition de document (DTD) est un ensemble de règles régissant la structure du document SGML. L’écriture d’une DTD est un compromis entre laxisme et rigidité. C’est un exercice qui peut s’avérer difficile, en particulier s’il s’agit de traiter un texte existant. Appliquer une DTD à un texte, c’est aussi l’interpréter, choisir un aspect plutôt qu’un autre.

Déclaration des éléments

Une DTD est un ensemble de déclarations. Les lignes ici définissent chacune un élément. Chaque déclaration d’élément est constituée de trois parties ; un nom ou groupe de noms, les règles minimisation, et un modèle de contenu (model content). Chaque partie est séparée par des caractères d’espacement (tabulation, nouvelle lignes, …).

::SGML
-- Dans la DTD: --
<!ELEMENT poem                - -    (title?, stanza+) >
<!ELEMENT title		      - O    (#PCDATA) >
<!ELEMENT stanza	      - O    (line+) >
<!ELEMENT (line | line2)      O O    (#PCDATA) >

Les règles de minimisation sont constituées d’une paire de caractères qui sont soit - soit O, O signifiant optionnel. Ces caractères représentent respectivement la possibilité de minimisation de la balise de début de l’élément (start-tag) et de celle de fin (end-tag). En dernier lieu cependant, un élément doit toujours pouvoir être distingué de l’élément qui le contient, et de ceux qui le précèdent ou le suivent : dans l’exemple précédent, l’élément line peut ne comporter aucun balise que s’il est le seul fils d’un élément stanza.

Le modèle de contenu, décrit entre parenthèses, spécifie les éléments pouvant être contenus dans l’élément définit. Il peut aussi contenir certains mots-clefs, comme PCDATA ou EMPTY. La DTD peut être vue comme un arbre, dont le tronc est l’élément le plus haut (poem), et dont les branches mènent éventuellement jusqu’aux données textuelles (#PCDATA).

Un élément figurant dans le modèle de contenu peut être immédiatement suivi d’un indicateur d’occurrence. SGML en définit trois : + pour un ou plusieurs, ? pour aucun ou un seul et * pour aucun ou plusieurs.

La syntaxe du modèle de contenu indique aussi l’ordre dans lequel les éléments fils doivent apparaître. SGML définit trois opérateur de séquence ou de groupement : , définit un ordre fixe. & représente un ET : tous les éléments spécifiés doivent apparaître, mais dans n’importe quel ordre. Enfin, | spécifie que seul l’un des éléments proposés peut apparaître.

Les opérateurs présentés ici possèdent tous un nom formel permettant d’être redéfinis dans la déclaration SGML.

Les exceptions

Le modèle introduit jusqu’ici ne permet pas de résoudre le problème induit par des objets flottants (images, notes, …). Ces objets ne peuvent pas être décrits dans la structure du document… Ou bien ils devraient apparaître à tous les niveaux de cette structure, ce qui pollue inutilement la structure du document et n’est pas envisageable pour de gros ouvrages.

SGML définit deux types d’exception pour pallier à cela. Les liste d’inclusion permettent d’ajouter la possibilité d’apparition d’éléments à n’importe quel endroit d’un modèle de contenu, même ceux définit avec #PCDATA. Cette liste est introduite avec un + après le modèle de contenu.

::SGML
-- Dans la DTD: --
<!ELEMENT poem - O    (title?, (stanza |couplet)+ )  +(note | variant) >

Les liste d’exclusion, au contraire, permettent d’empêcher l’apparition d’éléments dans un modèle de contenu. Elles prennent le pas sur les listes d’inclusion, et sont introduites avec un - après le modèle de document.

::SGML
-- Dans la DTD: --
<!ELEMENT title	           - O    (#PCDATA)  -(variant) >
<!ELEMENT (note | variant) - -    (#PCDATA)  -(note | variant) >

Modèles concurrents

Le deuxième problème est la description de deux modèles de document concurrents. SGML permet d’associer plusieurs DTD à un seul document. Toutefois cette faculté du langage est optionnelle et n’est pas toujours implémentée.

Pour faire usage de différentes vues d’un document, il suffit de préfixer les éléments par le nom du modèle auquel ils appartiennent entre parenthèses. Les éléments communs aux deux modèles ne nécessitent pas d’être préfixés.

::SGML
<!-- Dans l'instance de document: -->
<(poem)stanza><(paged.poem)page> ...

Les attributs

Un attribut apporte une information supplémentaire à une instance particulière d’un élément, sans considération sur son contenu. Les attributs sont introduits dans la balise de début d’un élément uniquement, à la suite de son identifiant sous la forme d’une paire attribut-valeur.

::SGML
<!-- Dans l'instance de document: -->
<poem id=P1 status="draft"> ...

Une liste d’attributs est introduite par le mot-clef ATTLIST, suivi de l’élément, ou de la liste d’éléments, concerné(s). Suivent une ou plusieurs lignes décrivant chacune un attribut avec son nom, le type de valeur qu’il accepte et sa valeur par défaut.

::SGML
-- Dans la DTD: --
<!ATTLIST poem
      id                  ID                                 #IMPLIED
      status              (draft | revised | published)      draft 

Le nom d’un attribut suit les mêmes règles de nommage que tous les autres noms SGML. Il ne nécessite pas d’être unique dans le document, mais seulement dans la liste d’attributs d’un élément donné. L’attribut id possède normalement un sens spécial. Il permet de désigner de manière unique un élément par convention.

La seconde partie d’un attribut peut être un mot-clef ou bien une liste de valeurs admissibles. En plus du mot-clef ID, on peut trouver :

La troisième partie indique comment une absence de cet attribut doit être interprétée. Elle peut être un mot-clef ou bien une valeur par défaut. Les mots-clefs peuvent être les suivants :

Les entités

Jusqu’ici, nous n’avons décrit le document SGML qu’en suivant scrupuleusement sa structure. Une entité, au contraire, procure un moyen de nommer n’importe quelle partie arbitraire du document, sans aucune considération pour sa structure ; ce peut être une chaîne de caractères ou un fichier entier.

Une entité externe comprend un identifiant SYSTEM et/ou un identifiant PUBLIC ou autre dans sa déclaration. SYSTEM permet de nommer tout objet pouvant être retourné par le système. En théorie, une telle entité peut représenter un fichier, le résultat d’une requête en base de données, le résultat d’un appel à une fonction, … En pratique, les processeurs SGML implémentent en général seulement l’accès à un fichier.

Les entités sont utiles pour centraliser une définition utilisée de nombreuses fois dans un document : le nom de l’auteur, une référence à un organisme, … ou exprimer des caractères non représentables sur un système donné.

::SGML
-- Dans la DTD: --
<!ENTITY author 'Moi' >
<!ENTITY html-dtd SYSTEM "html.dtd"
               PUBLIC "-//IETF//DTD HTML//EN">

<!-- Dans l'instance de document: -->
&nom-entité; ou &nom-entité, &#charcode

Une entité paramètre est introduite par % plutôt que par & et n’occupe pas le même espace de noms. Elle ne peut apparaître que dans un contexte SGML, et pas dans le document lui-même.

::SGML
-- Dans la DTD: --
<!ENTITY % TEI.prose 'INCLUDE' >
<!ENTITY % TEI.extensions.dtd 
            SYSTEM 'mystuff.dtd'>

<!-- Dans l'instance de document: -->
%nom-entité; ou %nom-entité

Sections marquées

Il est parfois intéressant de rendre conditionnelle l’apparition de certaines sections d’un document. Il est aussi intéressant parfois, par exemple lorsque l’on inclut des exemples de code, de demander au parser d’ignorer complètement une section donnée afin qu’il ne soit pas perturbé par l’apparition d’un marquage inattendu. Le marquage de sections en SGML permet tout cela.

::SGML
<!-- Dans l'instance de document: -->
<![ CDATA [
    <exemple>code</exemple>

Il existe différents mots-clefs permettant d’introduire une section marquée :

L’usage de section marquée est particulièrement utile lorsque utilisé conjointement avec des entités paramètre.

::SGML
<!ENTITY % TEI.prose 'INCLUDE' >
<![ %TEI.prose; [
    ...
]]>

La déclaration SGML

Tout document SGML définit un langage dans son prologue et l’utilise dans l’instance de document. En général, les outils implémentant le standard fournissent la syntaxe de référence (reference concrete syntax), celle que l’on a vu jusqu’ici, et quelques jeux de caractères standards : ASCII, EBCDIC. Toutefois, il arrive que la syntaxe de référence ne convienne pas, que la taille maximale autorisée pour les identifiants génériques soit trop petite, etc. Dans ce cas uniquement, la déclaration SGML est requise et doit être placée en tête du prologue.

Globalement, la déclaration apporte des informations sur la structure lexicale de l’application, et la DTD sa structure syntaxique. Elle est constituée d’une liste de sections permettant chacune de paramétrer un aspect du langage définit : le jeu de caractères qu’il utilise, ses spécificités syntaxiques, ses capacités particulières, …

En pratique, la DTD est importée d’un fichier externe, et la déclaration est incluse depuis ce fichier. L’utilisateur final n’a donc souvent aucune idée de son existence.

::SGML
<!SGML "ISO 8879:1986"
    -- La déclaration SGML ici:             --
    -- CHARSET                              --
    -- SYNTAX                               --
    -- FEATURES				--
    -- SCOPE				--
    -- CAPACITY				--
    -- APPINFO				--
>

Définition syntaxique du document

La section CHARSET définit le jeu de caractères valides des documents appartenant à une application donnée. La description d’un jeu de caractères nécessite trois informations : les caractères du jeu du document, les codes de caractères, et les liens entre ces deux groupes. Cette description étant très longue, SGML permet de s’appuyer sur un standard. Le standard utilisé est donné avec la balise BASESET. Quelques exemples de jeux standards :

La balise DESCSET permet de modifier le mapping définit par le standard entre caractères et codes. Cette sous-section est composée de trois colonnes : la première est le code du caractère du jeu que l’on définit. La seconde est un nombre, permettant de définir une séquence en une ligne. La troisième est le code du caractère du jeu de base, ou bien l’attribut UNUSED, spécifiant une non-appartenance au jeu définit.

::SGML
0	9	UNUSED
127	1	31

Attention : le jeu de caractère définit ici n’est pas le même que le jeu utilisé pour encoder le fichier abritant le document (external charset encoding). Dans la pratique, le jeu de caractères définit ici est seulement utilisé par un rédacteur dans l’utilisation des entités numériques.

SGML possède aussi une notion de jeu de caractères système (system character set). Pour traiter un fichier, l’outil SGML doit transformer le fichier encodé pour le faire correspondre à la description donnée dans la déclaration, ou au contraire, adapter le jeu définit dans la déclaration à celui du système.

SGML a une limite à l’indépendance : comment lire une déclaration SGML dont on ne connaît pas l’encodage a priori ? C’est impossible, et le standard note à ce propos qu’il faut soit l’identifier avec un nom ou un numéro, soit utiliser une copie lisible par l’homme.

Définition lexicale du document

::SGML
SYNTAX [PUBLIC reference [SWITCHES codes] ]

La section SYNTAX définit la application concrete syntax, qui est la syntaxe d’un document de cette application. Elle est complémentaire à la reference concrete syntax qui est la syntaxe des applications SGML, et qui définit le format des spécifications SGML comme les déclarations.

La balise SYNTAX peut être suivie du mot-clef PUBLIC qui introduit une syntaxe de référence à partir de laquelle celle-ci sera définie. Si ce mot-clef est utilisé, le mot-clef SWITCHES peut ensuite permettre à deux caractères d’alterner leur rôle respectif. Si ces mots-clefs facultatifs ne sont pas utilisés, l’ensemble des sous-sections de la syntaxe doivent être définies. Ces sous-sections sont :

La section SYNTAX contient une deuxième définition de jeu de caractères. Cette seconde définition n’est valide qu’au sein de cette section. Le principal intérêt est de rendre la définition de la syntaxe indépendante du jeu de caractères définit plus haut.

::SGML
SHUNNED [CONTROLS] codes...

SHUNNED introduit une liste de codes de caractères qui ne doivent pas être utilisés dans un document de cette application, en général parce que la combinaison des bits qui le composent peuvent poser problème au système. Ces caractères peuvent cependant être utilisés dans la syntaxe, le marquage. La raison en est que le marquage s’arrête au niveau du parser. Le mot-clef CONTROLS s’il est utilisé, ajoute à cette liste tous les caractères de contrôle du système.

FUNCTION spécifie une liste de caractères ayant un sens particulier pour le parser SGML. Les caractères déclarés ici peuvent apparaître dans le document tel quels, ou bien peuvent être invoqués comme des entités : <![CDATA[&#SPACE;]]>.

Les trois premiers éléments, RE (record end), RS (record start) et SPACE doivent toujours être fournis. D’autres fonction peuvent être définies :

Mots réservés, mot-clefs et casse

La sous-section NAMING permet de spécifier les caractères autorisés

L’ordre des chaînes de caractères définies dans LCNMCHAR et UCNMCHAR ou LCNMSTRT et UCNMSTRT doit être le même. Les caractères non affectés par la casse sont représentés de la même manière dans les deux chaînes. Il est aussi possible que des caractères apparaissent plusieurs fois afin de correspondre aux caractères de l’autre casse.

L’attribut NAMECASE indique si les caractères sont transformés en majuscule avant d’être traités. Ainsi, YES signifie que le traitement n’est pas sensible à la casse, NO le contraire. Le mot-clef GENERAL applique cette valeur à tous les éléments du document, ENTITY à ses seules entités.

::SGML
NAMES 	SGMLREF
        DOCTYPE 	DTD
        ELEMENT	EL
        PCDATA	TEXT

La sous-section NAMES permet de surdéfinir les mots-clefs standards de SGML. Les nouveaux mots-clefs doivent être uniques et respecter la syntaxe concrète courante. Le mot-clef SGMLREF permet de conserver les mots-clefs standards s’ils ne sont pas surdéfinis ici.

Minimisation et autres capacités

La sous-section DELIM introduit une liste permettant de surdéfinir les symboles de séparation dans le marquage. La première colonne contient le nom du rôle, et la seconde le nouveau symbole qui lui est assigné. L’exemple donné ici présente quelques uns de ces symboles avec leur valeur standard. Tout comme les surdéfinitions de la section NAMES, celles-ci doivent obéir à quelque logique et rester homogènes avec le reste de la déclaration.

::SGML
DELIM 	GENERAL	   SGMLREF
           GRPO		"("
           GRPC		")"
           STAGO	"<"
           ETAGO	"</"
           TAGC		">"
    SHORTREF   NONE

La sous-section SHORTREF n’est pas abordée ici.

La sous-section QUANTITY permet de surdéfinir quelques quantités limites, telles la longueur maximale du nom d’un élément (NAMELEN).

::SGML
QUANTITY	SGMLREF
        NAMELEN	32
        LITLEN	2048

Le mot-clef SGMLREF rappelle que les valeurs non modifiées ici restent égales à celles définies dans le standard.

::SGML
FEATURES
    MINIMIZE	DATATAG         NO
            OMITTAG   	NO
            RANK		NO
            SHORTTAG	YES  -- Only for NET --
    LINK		SIMPLE	        NO
            IMPLICIT	NO
            EXPLICIT	NO
    OTHER		CONCUR	        NO
            SUBDOC	        NO
            FORMAL	        NO

Cette section précise les les capacités facultatives de SGML utilisées dans cette application. Ces capacités sont regroupées selon trois classes : MINIMIZE, LINK et OTHER. L’exemple fourni ici est une définition des ces capacités pour XML. SHORTTAG est nécessaire pour l’utilisation des éléments vides (null end tag).

La classe MINIMIZE contient les options de minimisation ; omission de la balise de fermeture, omission du nom d’une balise ouvrante… On parle de document normalisé lorsque aucune option de minimisation n’est autorisée.

La classe LINK nécessiterait plus d’explication.

La classe OTHER contient les particularités qui n’entrent pas dans les autres classes :

La balise SCOPE spécifie si la syntaxe définie dans cette déclaration s’applique exclusivement à l’instance de document ou à la DTD également. La déclaration utilise toujours la syntaxe de référence (reference concrete syntax), ainsi que la DTD par défaut.

La section CAPACITY permet de fixer quelques valeurs qualitatives des ressources nécessaire pour le traitement d’un document de l’application concernée. Ces valeurs ne représentent pas grand chose (tant elles dépendent de l’implémentation des outils) et ne sont que très rarement utilisées en pratique.

La balise APPINFO est très peu utilisée (à ma connaissance).

Les catalogues

L’utilisation de plusieurs applications SGML différentes sur un système, l’appel à plusieurs vendeurs différents mène à deux problèmes :

Les catalogues sont une réponse à court terme pour le premier point. Un catalogue associe un identifiant public externe ou un nom d’entité à un fichier, une URL ou n’importe quel autre objet.

Chaque entrée du catalogue associe un identifiant système (FSI - Formal System Identifier) à une entité externe définie dans le document. La plupart du temps, un objet de stockage est utilisé (SOI - Storage Object Identifer). Ces derniers sont un sous-ensemble des premiers.

::SGML
SGMLDECL "docbook.decl"

PUBLIC "ISO 8879:1986//ENTITIES Added Latin 1 EN//" "ISOlat1.ent"

PUBLIC "-//W3C//DTD XHTML 1.1//EN"
     "http://www.w3c.org/TR/xhtml11/DTD/xhtml11.dtd"

PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "xhtml1-strict.dtd"

DELEGATE "-//IETF" "http://www.ietf.org/catalog.txt"

Parmi les types d’entrée d’un catalogue, on rencontre :

Le SDIF (SGML Document Interchange Format) adresse le deuxième point soulevé, et n’est pas développé ici.

Applications et héritage

TEI (Text Encoding Initiative)

L’objectif de TEI est, depuis 1987, de représenter de manière électronique toute forme de littérature. Sa DTD est employée par de nombreuses organisations, majoritairement tournées vers la culture : religion, histoire, dictionnaires, …

DocBook

DocBook a été conçu au départ par les éditions O’Reilly et HAL Computer Systems. Aujourd’hui, c’est le Comité Technique DocBook du Consortium OASIS qui s’en occupe. Le but de DocBook est la rédaction de livres, et son champ d’application, particulièrement bien adapté à l’informatique, a rallié à lui de nombreux utilisateurs et acteurs. La communauté du logiciel libre en particulier l’utilise énormément.

Il existe de nombreuses feuilles de styles (XSL et DSSSL) et de nombreux projets permettant de produire à partir de DocBook des documents adaptés à tous types de support : texte, Postscript, PDF, LaTeX, HTML, man, …

TEI et DocBook supportent SGML et XML.

SGML et HTML

HTML est un dialecte ouvert et standardisé de SGML, comme la DTD TEI ou Docbook. Il a été conçu pour être un moyen de publication rapide et simple associé au protocole HTTP. L’association HTTP-HTML a rapidement éclipsé les autres protocoles destinés au partage de l’information comme WAIS ou Gopher.

SGML et XML

XML est un sous-ensemble strict de SGML. Contrairement à tous les langages vus ci-avant, il ne s’agit pas d’une application de SGML. XML est né au W3C avec l’idée d’adapter SGML au Web afin de réutiliser la somme importante de documents existant sous le standard de 1986.

XML se veut plus simple afin d’être facilement assimilable : il n’y a pas de minimisations, ni de redéfinition de la syntaxe, aucune spécificité exotique ou complexe comme les modèles concurrents. Il n’existe donc pas de déclaration, et la DTD n’est même pas requise.

XML est aussi plus strict afin d’être facilement utilisable : le jeu de caractères considéré est Unicode, les arguments sur la syntaxe et la minimisation servent aussi ici.

Conclusions

SGML is dead. I might wish it to be otherwise, but it ain’t. (Norman Walsh)

SGML est aujourd’hui nettement en perte de vitesse. Le langage XML lui est beaucoup préféré pour sa simplicité, autant du point de vue de l’apprentissage que de la facilité de traitement. En outre, les systèmes même exotique d’aujourd’hui sont capable de traiter des jeux de caractères relativement standards et nécessitent moins le souci constant de postabilité qu’addressait entre autres objects SGML.

Néanmoins, SGML bénéficie encore d’une large communauté. Il a introduit les concepts qui sous-tendent de nombreux langages aujourd’hui, et des logiciels mûrs et très fonctionnels continuent de la supporter.

Liens

SGML

http://xml.coverpages.org/sgml.html

http://xml.coverpages.org/wlw11.html#HD_toce

http://home.chello.no/~mgrsby/sgmlintr/sgmldec.htm

TEI

http://www.tei-c.org

http://etext.lib.virginia.edu

Docbook

http://www.docbook.org

http://docbook.sourceforge.net

http://www.oasis-open.org/committees/docbook/intro.shtml

W3C

http://www.w3.org/MarkUp

http://www.w3.org/XML/