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 marquage descriptif :: Les instructions de traitement du texte ne font plus partie du document. Le texte peut-être traité facilement par différents outils (indexation, transformations, affichage, …), lesquels peuvent facilement ignorer les parties du document qui ne les concerne pas. Il y a indépendance du fond et de la forme.
le type de document : Le type d’un document est uniquement défini par sa structure, donc les éléments autorisés, interdits, et leur disposition. Le type d’un document permet de valider la structure de ce document (à l’aide de parsers). Il apporte une connaissance de la sémantique et permet l’écriture d’outils de traitement plus intelligents.
l’indépendance : Au niveau du document, le marquage descriptif plutôt que procédural apporte une standardisation du marquage. Au niveau du traitement du document, c’est la déclaration SGML qui garantit l’indépendance quant au système. Il devient possible de partager des documents entre systèmes hétérogènes sans perte d’information.
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 :
CDATA
: n’importe quelles données valides. Elles ne seront pas analysées par le parser,IDREF
: un pointeur sur un autre élément ; introduit un mécanisme de références croisées,NUMBER
: une suite de chiffres uniquement.
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 :
#REQUIRED
: une valeur doit obligatoirement être spécifiée,#IMPLIED
: la présence de cet attribut c’est pas nécessaire,#CURRENT
: la dernière valeur spécifiée est utilisée.
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 :
INCLUDE
: la portion de texte est traitée normalement,IGNORE
: la portion de texte n’est pas du tout traitée par le parser,CDATA
: la portion de texte peut contenir des balises SGML ou des entités, mais qui ne devraient pas être reconnues comme telles par le parser,RCDATA
: même comportement, sauf pour les entités qui seront reconnues comme telles,TEMP
: permet simplement de marquer une section. La portion de texte est traitée normalement.
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 :
ISO 646 (7-bit ASCII),
ISO 8859-1 (ISO Latin-1),
ISO 10646 (Superset de Unicode sur 4 octets).
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 :
le jeu de caractère utilisé pour la définition de la syntaxe ;
les combinaisons de bits (ou codes caractères) qui ne devraient pas être utilisées dans un document ;
les caractères spéciaux (function characters) : espaces, masquage, etc. ;
les délimiteurs du marquage ;
les règles de nommage ;
les noms réservés ;
les limites.
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 :
SEPCHAR
: ce caractère peut être utilisé partout ou un espace est nécessaire au sens SGML. Ce mot-clef est typiquement utilisé pour définir le symbole de tabulation qui n’est pas reconnu comme tel par le norme ;MSSCHAR
: ce caractère demande au parser d’ignorer le caractère qui le suit immédiatement ;MSOCHAR
: ce caractère demande au parser d’ignorer les caractères suivants jusqu’à occurrence d’un caractèreMSICHAR
;FUNCHAR
: caractère déclaré sans comportement particulier. Peut être nommé comme tous les autres caractères définis ici dans le document.::SGML FUNCTION RE 13 RS 21 SPACE 64 TAB SEPCHAR 5 SO MSOCHAR 14 SI MSICHAR 15
Mots réservés, mot-clefs et casse
La sous-section NAMING
permet de spécifier les caractères autorisés
en plus des caractères alphanumériques, pour tout nom SGML (identifiants génériques, nom d’attribut, nom d’entité, …).
LCNMSTRT
: Lowercase Name Start,UCNMSTRT
: Uppercase Name Start,LCNMCHAR
: Lowercase Name Characters,UCNMCHAR
: Uppercase Name Characters.::SGML NAMING LCNMSTRT “” UCNMSTRT “” LCNMCHAR “.-“ UCNMCHAR “.-“ NAMECASE GENERAL YES ENTITY NO
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.
DATATAG
: permet de spécifier des chaînes de caractères agissant comme balise fermante en plus de leur rôle de données textuelles dans le document.OMITTAG
: possibilité d’omettre la balise ouvrante ou la balise fermante d’un élément.RANK
: possibilité de considérer un identifiant générique comme une racine et un suffixe : un élément ne possédant pas de suffixe le déduit de l’élément identique prprécédent.SHORTTAG
: possibilité d’utiliser des balises ouvrantes vides, d’omettre la balise fermante, d’omettre les séparateurs de valeur littérale pour un attribut, …
La classe LINK
nécessiterait plus d’explication.
La classe OTHER
contient les particularités qui n’entrent pas dans
les autres classes :
CONCUR
: permet l’utilisation de plusieurs DTD pour un seul document. Si cette capacité est validée, elle est suivie par une valeur représentant le nombre maximum de DTD alternatives (en plus de la première).SUBDOC
: supporte les entitités représentent des documents SGML complets.::SGML SCOPE DOCUMENT | INSTANCE
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 :
l’interprétation des identifiants externes dans les déclarations d’entité doit être la même quels que soient les outils utilisés pour un document donné,
l’échange de documents SGML entre différents systèmes doit préserver cette même interprétation des identifiants externes.
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 :
PUBLIC
; définit un identifiant externe public (ceux introduits dans le document avec le mot-clef =PUBLIC=),ENTITY
; définit une entité externe,SGMLDECL
; définit l’emplacement du texte utilisé pour remplir la déclaration SGML du document,DELEGATE
; permet de déléguer à un autre catalogue la résolution d’entités externes comportant un préfixe donné.CATALOG
; spécifie un catalogue devant être consulté après le catalogue courant.
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
Docbook
http://docbook.sourceforge.net
http://www.oasis-open.org/committees/docbook/intro.shtml