Utilisation des feuilles XML et XSL pour le Web
CahiersGUTenberg n?33-34 — Congrès GUT’99 – Journée XML – 19 mai 1999
XML et XSL: un nouveau départ pour le web
Michel GOOSSENS
CERN, Division IT, CH-1211 Genève 23, Suisse,
Résumé. Fin 1996, le W3C et les plus grandes entreprises développant des logiciels pour l’internet se sont mis d’accord de collaborer pour définir un langage de balisage normalisé et optimisé pour le web: ce fut la naissance de XML (eXtensible Markup Language ou « langage extensible de balisage »). XML est basé sur SGML, dont il élimine un grand nombre de fonctions peu utilisées ou jugées trop complexes. De plus il évite la plupart des limitations inhérentes à ès une introduction au langage XML,nous décrivons XSL (eXtensible Style Language) qui permet la présentation et la transformation de l’information XML. Pour terminer nous disons quelques mots sur d’autres développements récents du monde XML.
Abstract. Late in 1996, the W3C and several major software vendors decided to define a markup language specifically optimized for the web: XML (eXtensible Markup Language) was born. It is a simple dialect of SGML,which does not use many of SGML’sseldom-used and complex functions, and does away with most limitations of HTML. After an introduction to the XML standard, we describe XSL (eXtensible Stylesheet Language)for presenting and transforming XML information.
Finally we say a few words about other recent developments in the XML arena.
Mot-clés : SGML, XML, XSL, HTML,XPath
1. Vers une description structurelle des documents
Dans l’environnement informatiséactuel, il est important que nos documents soient mis à la disposition d’une communauté aussi large que possible. Pour optimiser les possibilités de réutilisation de ces documents par les différents supports, visualisateurs, bases de données, etc., il est primordial que les documents soient clairement balisés structurellement, portables et indexables pour faciliter les recherches. Ceci nécessite une normalisation maximale à tous les niveaux. De plus il faut que les différents acteurs du monde de l’informatique suivent ces normes, ce qui n’est jamais acquis a priori. C’est pourquoi un maximum de développeurs doivent être impliqués dans la phase de définition de nouvelles normes, ce qui fut le cas de XML, dont nous parlerons plus loin.
1.1. Au début était SGML
Pour normaliser la description de la structure d’un document, SGML fut adopté par l’ISO en 1986[38]. Toutefois, SGML, qui propose à la fois une approche générale et ouverte, est assez complexe à mettre en œuvre. Pour la grande majorité des documents, surtout ceux distribuéssur l’internet, 20%seulement de la fonctionnalité de SGML est utilisée. Àl’origine, HTML tentait également de séparer les aspects structure et présentation d’un document. Malheureusement, Netscape et Microsoft, qui se livrent une bataille féroce pour contrôler le marché juteux de la distributionde l’information sur l’internet, en particulier grâce à leurs butineurs respectifs, recherchent principalement des gains commerciaux immédiats. Ainsi, pour attirer les utilisateurs, ils ont pollué le langage HTML par des extensions « maison », qui mettent en évidence les performances spécifiques de leurs produits. Évidemment ces extensions ne sont pas compatibles avec la spécification HTML comme définie par le W3C (World-Wide Web Consortium), ce qui rend le gestion des documents extrêmement problématique.
1.2. Puis vint XML
En réaction à cette tour de Babel des dialectes HTML, plusieurs acteurs du monde internet, comme Microsoft, Netscape et Sun, ont travaillé ensemble et ont défini un nouveau langage, qui combine les avantages de SGML et HTML : le langage de balisage extensible XML (Extensible Markup language) qui fut introduit officiellement le 10 février 1998 avec la publication de la recommandation XML[46]. XML est une version simplifiée de SGML qui doit assurer le libre échange des documents entre différentes applications internet.
2. Le langage XML
Tout comme son parent SGML [16], XML[24] est un méta-langage. Il permet la définition d’un langage pour décrire la structure de l’information pour un type de document donné en proposant un formalisme normalisé pour construire un langage de balisageadaptéaux besoins d’uneapplication spécifique. Ainsi XML et SGML diffèrent essentiellement de HTML, qui est une application de SGML avec une syntaxe figée et non extensible.
Pour chaque classe de documents XML (par exemple la famille HTML) nous pouvons définir une DTD (Data Type Declaration ou déclaration de classe de document), qui décrit les éléments et leurs attributs, les relations, le contenu, etc.
Pour simplifierletraitement des documents surleweb, XML n’imposepasla présence d’une DTD. En fait, un document XML doit avant tout être « bien-formé »: il se composed’unouplusieurséléments, dontunélément racine,qui contienttous lesautres.
De plus tous les éléments dudocument, délimités pas leurs balises de début et de fin, doivent être imbriqués correctement.
Un document XML bien-formé qui est correct par rapport à une DTD est dit « valide ». Dans ce cas on vérifie le document par rapport à sa grammaire.
Un document XML peut contenir des données textuelles ou binaires. Pour les données binaires aucune contrainte n’est imposée; il faut seulement qu’elles soient associées à une notation, identifiée par un nom, qui doit être communiqué aux applications traitant les données en question. Un fichier XML de type textuel contient des séquences de caractères. Un caractère est l’unité atomique d’un texte; tout caractère spécifié dans la norme Unicode[35, 2, 1] est autorisé.
Un nom XML commence par une lettre (caractère alphabétique ou idéographique d’Unicode) ou le caractère de soulignement (_) qui peut être suivi par une suite de caractères Unicode (à l’exception de quelques-uns).
Un texte XML est un mélange de données de type caractères et de marques. Ce marquage consiste en balises de début et balises de fin, d’éléments vides, de références de type entité ou caractère, des commentaires, des DTD et des instructions de traitement. Pour des raisons de place nous nous limiterons aux plus importantes.
2.1. Un document XML simplissime
Le document XML le plus simple (et « bien-formé ») a la forme:
Onn’a nul besoind’une DTD et c’estl’application XML (p.ex. leprogramme devisualisation) qui devra interpréter les actions associées à la balise . Un autre fichier un peu plus complet, mais toujours pas valide, comme nous ne spécifions pas de DTD associé, est le suivant:
Clair de Luneème>
Notons l’emploi d’un caractère accentué dans le nom de l’élément poème. En effet,
XML permet l’utilisationde noms d’éléments, d’attributs,etc. en russe, arabe, chinois ou japonais, ce qui n’a pas manqué d’accélérer le niveau d’adoption de la nouvelle norme dans les pays non-anglophones.
Le systèmede balisageest construit à partir de délimiteurs, de symboles spéciaux, de mots-clé ayant une signification particulière. Par exemple si « para » identifie l’élément « paragraphe », sera la balise qui, dans le document, marque le début d’unparagraphe, « » étant les délimiteurs indiquant respectivement le début et la fin de la balise. La balise de fin de paragraphe sera .
2.2. Différences entre SGML et XML
Comme évoqué précédemment, XML a éliminé une grande partie de la fonctionalité générale de SGML (comme décrite dans [38, 11, 12]). On notera, en particulier, les points suivants:
– l’omission de balises est interdite, c’est-à-dire : chaque balise de début doit avoir une balise de fin correspondante;
– pour les élément vides il y a une nouvelle notation ( est aussi valable);
– les commentaires ont nécessairement la forme , c’est-à-dire : il est impossible d’inclure des commentaires à l’intérieur des déclarations d’éléments ou d’attributs;
– dans les modèles de contenu on ne peut utiliser des exclusions ou inclusions,ni l’opérateur et (&);
– toutes les valeurs des attributssont spécifiées entre une paire desimples (’)ou doubles (") quotes ;
– pour le nom des éléments et attributs, les majuscules et minuscules sont trai-tées comme des caractères distincts,donc ,et sont des balises de trois éléments différents (en HTML classique la casse des caractères ne différencie pas les noms dans ce cas).
3. Anatomie d’une DTD pour un document XML
Comme nous l’avons indiqué ci-dessus une application XML peut traiter un document XML sans nécessairement avoir accès à la DTD décrivantla classe de documents pour le document en question. Néanmoins, il est primordial pour une bonne compréhension des possibilités du langage XML de rappeler la fonction et la structure de base d’une DTD. Il est à noter que la DTD peut être spécifiée en entier ou en partie à l’extérieur ou à l’intérieur d’un document source XML.
Une déclaration de type de document définit:
– le nom des types d’élément, leur contenu, y compris combien de fois et dans quel ordre d’autres éléments peuvent y apparaître (section 3.1);
– les attributs éventuels et leur valeurs par défaut (section 3.2); – le nom des entités qui peuvent être utilisées (section 3.3).
Comme la précision et la robustessede l’information baliséeen XML est un atout non négligeable, il est important de pouvoir vérifier les documents XML par rapport à une DTD. Ainsi, nous serons assurés de leur validité et nous pourrons les distribuer sur le web sans poser de problèmes aux applications qui pour des raison d’efficacité les interpréteraient sans référence à la DTD.
Il est utile de répéter qu’XML différencie la casse des caractères (présence de minuscules et majuscules)dans les noms des éléments (balises), desattributset des entités, qui doivent donc toujours être entrés textuellement.
3.1. Éléments
Chaque typed’élément dela structurelogiqued’undocument doitêtredéclaré. Cette déclaration donne le nom du type de l’élément et indique, entre parenthèses, ce que peut, ou doit contenir l’élément en question (son modèle de contenu). Un exemple est le suivant:
Ce modèle indique que l’élément « mémo » doit contenir un élément entête, suivi d’un contenu,puis peut (sans obligation) être suivi d’un élément ps.
Le modèle de contenu peut faire appel à des opérateurs d’ordre et de choix, comme suit:
a | b a ou b (dans n’importe quel ordre); a , b a suivi de b (dans l’ordre indiqué); a une fois l’élément a; a? zéro ou une fois l’élément a; a* zéro ou plusieurs fois l’élément a; a+ au moins une fois l’élément a; ( ) un groupe d’éléments.
Un élément peut être vide (mot clé EMPTY), il peut contenir d’autres éléments, des caractères, ou un mélange des deux: dans ce dernier cas on parle de contenu mixte. Pour un contenu mixte XML est très strict: ni le nombre ni l’ordre des éléments ne peuvent être spécifiés explicitement et le mot clé #PCDATA doit être le premier dans le modèle de contenu:
1
2
3
4
5
La première ligne déclare l’élément br comme étant vide. La deuxième ligne déclare qu’un livre contient au moins un élément chapitre, puis aucun ou plusieurs éléments annexe, puis aucun ou un élément biblio suivi d’un éventuel élément index. La ligne 3 déclare que l’élément e1 ne contient que des données textuelles analysées, alors que la ligne 4 déclare que l’élément e2 peut contenir des données textuelles analysées, ainsi que les éléments a1, a2 et a3 (toutefois nous ne savons rien concernant le nombre d’occurrences, ni de leur ordre). La dernière ligne, qui fait référence à des entités paramètres, sera expliquée à la section 3.3.
Finalement, si un élément peut contenir des caractères ou tout autre élément défini dans la DTD nous utilisons le mot-clé ANY. Ce type de déclaration n’est pas très riche en information pour limiter la structure d’un document, mais a son utilité comme élément « conteneur » générique.
3.2. Attributs
Les attributs permettent d’associer des paires nom-valeur aux éléments définis dans la DTD. Des attributs peuvent seulement être spécifiés à l’intérieur d’une balise de début ou d’élément vide. Les définitions d’attribut spécifient:
– la liste exhaustive des noms d’attribut associés à un élément;– le type des attributs en question; – une valeur par défaut.
Une déclaration d’attribut comporte:
– le nom de l’élément;
– le nom de l’attribut;
– soit le type de l’attribut, indiqué par un mot-clé:
CDATA | données textuelles (caractères quelconques); |
ENTITY | nom d’entité générale; |
ENTITIES | noms d’entités générales ; |
ID | identificateur unique d’un élément; |
IDREF | valeur d’appel d’identificateur d’élément; |
IDREFS | valeurs d’appel d’identificateurs d’élément; |
NMTOKEN | unité lexicale nominale; |
NMTOKENS | unités lexicales nominales; |
NOTATION | nom de notation. |
Alternativement on spécifie, entre parenthèses, la liste de toutes les valeurs possibles pour cet attribut;
– une valeur par défaut, sous la forme d’une des valeurs autorisées, spécifiéeentre guillemets, ou d’un mot-clé:
#FIXED l’attribut a une valeur fixe, et ne peut prendre que cette valeur;
#REQUIRED une valeur doit obligatoirement être spécifiée par l’utilisateur;
#IMPLIED si une valeur n’est pas spécifiée, le système de traitement en définira une.
Voici un exemple, qui combine quelques-unes des possibilités évoquées. Dans le cas de l’attribut type la DTD doit contenir une définition de type NOTATION pour chacune des valeurs mentionnées, avec un renvoi vers une ressource système ou publique pour traiter les données associées à l’élément en question (p.ex. un programme de visualisation capable de décoder le format graphique choisi).
nom CDATA #IMPLIED échelle "1.0" #FIXED fond (rouge|bleu|jaune) "bleu" type NOTATION (eps|gif|bmp|tiff) "eps">
3.3. Entités
Des entités peuvent être utiles dans plusieurs circonstances:
– la définitiondecaractères difficilesou impossiblesà saisiravec un clavier stan-dard (caractères nationaux, symboles graphiques et mathématiques). Avec un appel de caractère nous spécifions directement le code Unicode du caractère en question, par exemple l’esperluette (&) est le caractère 38 en Ascii:
Pour undocument bien-formé, XML prédéfinitles entitésamp(&),lt(), apos (’) et quot ("). Par contre, pour tout document valide ces entités doivent nécessairement être déclarées dans la DTD. Notons qu’avec XML on a accès par défaut à tous les caractères définis par Unicode[35, 2].
– La définition de notations raccourcies pour des suites de caractères saisies fré-quemment (entités générales) p.ex.
Éditions du Seuil">
– L’inclusion de fichiers externes, par exemples les différentes parties d’un longdocuments XML, ou des documents non-XML (entités externes) p.ex.
– La définition de variables dans une DTD pour en faciliter la structuration logique (entités paramètres) p.ex.
Les entités sont déclarées dans la DTD (dans le sous-ensemble interne ou externe). Comme nous l’avons montré dans les exemples ci-dessus, la définition d’une entité peut contenir des balises,desappels d’entités,etc., qui seront interprétés aumoment où l’entité sera développée par le programme d’analyse XML.
Pour faire référence à une entité générale on utilise un appel d’entité, qui a la forme & suivi du nom de l’entité suivi de ;. Par exemple pour utiliser l’entité Seuil définie ci-dessus nous saisissonsdans le texte &Seuil;ce qui générera la suitede caractères « Éditions du Seuil ».
Les entités paramètres, qui peuvent seulement être définies et utilisées à l’intérieur de la DTD sont un outil commode pour modulariser la structure d’une DTD et ainsi la rendre plus lisible et plus facile à tenir à jour ou à modifier. Tout définition d’une entité paramètre doit précéder son utilisation.
3.4. Exemple : un poème de Verlaine
Dans ce qui suitnous allons utiliserplusieurs types dedocuments, et chaque foisleur structure sera décrite à l’aide d’une ou de plusieurs DTD. Supposons que nous voulions créer une DTD pour saisir des poèmes. Comme exemple de texte nous utiliserons la célèbre « Chansond’automne » dePaul Verlaine (durecueil Poèmes saturniens édité en 1866). Regardons le texte en question.
Les sanglots longs Je me souviens
Des violons Des jours anciens De l’automne Et je pleure;
Blessent mon coeur Et je m’en vais
D’une langueur Au vent mauvais
Monotone. Qui m’emporte Tout suffocant Deçà, delà,
Et blême, quand Pareil à la Sonne l’heure, Feuille morte.
3.4.1. Première réalisation : les éléments triomphent
Nousvoulonspouvoirspécifier letitredupoème, sonauteur,peut-être lerecueil dont il a été tiré et sa date d’édition. Tout mettrons tout cela un préambule. Pour le corps d’un poème nous préconisons de le diviser en stances qui, à leur tour, contiennent des lignes, avec ou sans renfoncement. La DTD ci-dessous est une première réalisation du cahier de charges évoqué où nous codons toute l’information à l’aide d’éléments.
La seule partie dans cette DTD que nous n’avons pas encore rencontrée est la première ligne. Elle est optionnelle et correspond à la déclaration XML. Elle spécifie la version de XML utilisée (mot-clé version) qui peut être suivie du codage (mot-clé encoding)et une spécification si le document peut être traité seul, c’est-à-dire : sans devoir faire appel à des déclarations d’éléments dans une DTD externe, auquel cas on ajoute « standalone="yes"», ou sinon « standalone="no"».
Voici le fichier source de la DTD, :
1
2 3
4
5
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Maintenant nous pouvons baliser notre poème en utilisant cette DTD. Nous montrons le fichier source XML ci-dessous. La deuxième ligne y correspond à une déclaration de type de document (mot-clé DOCTYPE). Dans ce cas elle spécifie que le document a comme racine l’élément poème dont la structure est définie dans une DTD qui se trouve dans le fichier ,qui est disponible sur le système (mot-clé SYSTEM) où le document est traité.
1
2 egrave;me SYSTEM "">
3
4
5 Chanson d’automne
6 Poèmes saturniens
7 1866
8 Paul Verlaine
9 éambule>
10
11
12 Les sanglots longs
13 Des violons
14 De l’automne
15 Blessent mon coeur
16 D’une langueur
17 Monotone.
18
19
20 Tout suffocant
21 Et blême, quand
22 Sonne l’heure,
23
24
25 Je me souviens
26 Des jours anciens
27 Et je pleure ;
28
29
30 Et je m’en vais 31 Au vent mauvais
32 Qui m’emporte
33 Deçà, delà, 34 Pareil à la
35 Feuille morte.
36
37
38 ème>
À l’aide d’un programme d’analyse nous pouvons vérifier si le fichier XML est valide. Nous lefaisons,par exemple, avec xml4j[21],unprogramme Javadéveloppé par IBM qui peut valider des documents XML.
> java XJParse -p .parsers.ValidatingSAXParser
: 460 ms (35 elems, 0 attrs, 49 spaces, 300 chars)
Le même programme offre la possibilité d’obtenir une vue en arbre du document.
> java ui.TreeViewer
:
START
START
START
START
END
END
END
Le résultat est montré à la figure 1. Nous y voyons dans la fenêtre de gauche les différentes parties de l’arbre, que l’on peut traverser facilement en ouvrant ou fermant certains éléments (visibles comme dossier). À droite nous avons le fichier source.
FIGURE 1 – Représentation en arbre du document
Nous pouvons aussi traiter ce fichier avec le programme d’analyse SGML nsgmls[6] de James CLARK et obtenir une sortie [7]. Nous devons toutefois indiquer qu’il s’agit d’un fichier XML, d’où la présence du fichier (la déclaration SGML adaptée pour XML) sur la ligne de commande ci-dessous.
> nsgmls
1 (poème
2 (préambule
3 (titre
4 -Chanson d’automne
5 )titre
6 (recueil
7 -Poèmes saturniens
8 )recueil
9 (date 10 -1866
11 )date
12 (auteur
13 -Paul Verlaine
14 )auteur
15 )préambule
16 (corps
17 (stance
18 (ligne
19 -Les sanglots longs
20 )ligne
21 (ligne
22 -Des violons
23 )ligne
24 (ligne
25 (r
26 )r
27 -De l’automne
28 )ligne
29 (ligne
30 -Blessent mon coeur
31 )ligne
32 (ligne
33 -D’une langueur
34 )ligne
35 (ligne
36 (r
37 )r
38 -Monotone.
39 )ligne
40 )stance
41 (stance
42 (ligne
43 -Tout suffocant
44 )ligne
45 (ligne
46 -Et blême, quand
47 )ligne
48 (ligne
49 (r
50 )r 51 -Sonne l’heure,
52 )ligne
53 )stance
54 (stance
55 (ligne
56 -Je me souviens
57 )ligne
58 (ligne
59 -Des jours anciens
60 )ligne
61 (ligne
62 (r
63 )r
64 -Et je pleure ;
65 )ligne
66 )stance
67 (stance
68 (ligne
69 -Et je m’en vais
70 )ligne
71 (ligne
72 -Au vent mauvais
73 )ligne
74 (ligne
75 (r
76 )r
77 -Qui m’emporte
78 )ligne
79 (ligne
80 -Deçà, delà,
81 )ligne
82 (ligne
83 -Pareil à la
84 )ligne
85 (ligne
86 (r
87 )r 88 -Feuille morte.
89 )ligne
90 )stance
91 )corps
92 )poème
93 C
La signification des différentes composantes de cette sortie est détaillée à l’URL nous, il suffit de savoir que les parenthèses représentent les éléments et qu’ils sont étiquetés du nom de l’élément en question. Le contenu de l’élément est contenu entre la parenthèse ouverte et la parenthèse fermée (par exemple le contenu de l’élément préambule commence à la ligne 2 et finit à la ligne 15). Les attributs commencent par un A majuscule (voir fichier à la page 15).
3.4.2. Deuxième variante: un savant mélange d’éléments et d’attributs
En général il y a plusieurs manières pour approcher la définition d’une DTD, qui décrit la façon dont nous voulons structurer les données dans notre document XML. Une approche assez traditionnelle balisant pratiquement toute l’information à l’aide d’éléments a été présentée. Nous pouvons tout aussi bien préférer de baliser uniquement le texte du poème à l’aide d’éléments et de spécifier tous les autres détails avec des attributs. C’est l’approche adoptée dans notre deuxième variante de DTD que nous avons baptisée poemfr1.dtdet qui a la forme suivante:
1
2 3 4
5
6
7
8
9
10 recueil CDATA #IMPLIED 11 date CDATA #IMPLIED
12 auteur CDATA #IMPLIED>
13
14
15
16
17
18
19 r CDATA "0em" >
Voici le fichier verlainefr1.xmlqui contient du poème balisé d’après cette DTD.
1
2 egrave;me SYSTEM "" [
3
4 ]>
5
6
7
8 recueil="Poèmes saturniens"
9 date="1866"
10 auteur="Paul Verlaine"/>
11
12 Les sanglots longs
13 Des violons
14 De l’automne
15 Blessent mon coeur 16 D’une langueur
17 Monotone.
18 Tout suffocant
19 Et blême, quand
20 Sonne l’heure,
21 Je me souviens
22 Des jours anciens
23 Et je pleure ;
24 Et je m’en vais
25 Au vent mauvais
26 Qui m’emporte
27 Deçà, delà, 28 Pareil à la
29 Feuille morte.
30
31 ème>
Les informations concernant auteur, titre, etc., (lignes 7–10) ainsi que les débuts des stances (lignes 12, 18, 21, 24) et les renfoncements éventuels (lignes 14, 17, etc.) sont ici codés à l’aide d’attributs. Nous vérifions la validité du fichier avec xml4j.
> java XJParse -p .parsers.ValidatingSAXParser
: 499 ms (21 elems, 40 attrs, 36 spaces, 249 chars)
La figure 2 est une représentation par l’application xmlviewer[20] du document vue en arbre est dans la fenêtre en haut à gauche, les attributs de l’élément mis en évidence à droite, puis on trouve le document source en bas à gauche et finalement la DTD à droite. Cette application est très intéressante pour naviguer à travers un document XML. java .xmlviewer.XmlViewer
Nous montrons également une partie de la sortie obtenue avec le programme nsgmls.
FIGURE 2 – Le documentvu par l’application xmlviewer
1 (poème
2 Atitre CDATA Chanson d’automne
3 Arecueil CDATA Poèmes saturniens
4 Adate CDATA 1866
5 Aauteur CDATA Paul Verlaine
6 (préambule
7 )préambule
8 (corps
9 Astance TOKEN oui
10 Ar CDATA 0em
11 (ligne
12 -Les sanglots longs
13 )ligne
14 Astance TOKEN non
15 Ar CDATA 0em 16 (ligne
17 -Des violons
18 )ligne
19
20 Astance TOKEN non
21 Ar CDATA 6pt
22 (ligne
23 -Qui m’emporte
24 )ligne
25 Astance TOKEN non
26 Ar CDATA 0em
27 (ligne
28 -Deçà, delà,
29 )ligne
30 Astance TOKEN non
31 Ar CDATA 0em
32 (ligne
33 -Pareil à la
34 )ligne
35 Astance TOKEN non
36 Ar CDATA 1em
37 (ligne 38 -Feuille morte.
39 )ligne
40 )corps
41 )poème
42 C
Nous y observons clairement la présence des attributs et de leur valeur (par exemple la ligne 2 indique que titre est de type CDAT et a la valeur « Chanson d’automne »). Notons également que les valeurs par défaut sont utiliséespour les attributsnon spécifiés explicitement (ainsi en ligne 14 stance a la valeur non et en ligne 15 r une valeur égale a 0em).
3.4.3. Variante ultime : rien que des attributs
Nous pouvons même aller à l’extrême et spécifier tout le poème comme valeurs d’attributs.Cette ultime approche montre également comment étendre une DTD en spécifiant des attributs supplémentaires à ceux déjà définis dans le sous-ensemble externe de la DTD. Ceci se fait dans le sous-ensemble interne de la DTD, c’est-à-dire : dans la partie déclaration de balisage à l’intérieur de la déclaration de type de document. C’est ce qui est montré ci-dessous en lignes 3–8. XML permet plusieurs instructions pour les définitions d’attributs pour un élément donné: toutes les définitions sont combinées. On peut même donner plusieurs définitions pour le même attribut pour un élément donné. Toutefois dans ce cas, seule la première définition est prise en compte et les définitions ultérieures sont ignorées. Comme le sous-ensemble interne de la DTD est lu avant le sous-ensemble externe, dans notre cas les définitions en lignes 3–7 dans le fichier verlainefr2.xmlmontré ci-dessous sont lues avant celles dans le fichier DTD éférencé en ligne 2.
1
2 egrave;me SYSTEM "" [
3
4
5
6
7
8 ]>
9
10
11 recueil="Poèmes saturniens"
12 date="1866"
13 auteur="Paul Verlaine"/>
14
15
16 |
| nb="2" texte="Des violons"/> |
17 |
| nb="3" texte="De l’automne"/> |
18 |
| nb="4" texte="Blessent mon coeur"/> |
19 |
| nb="5" texte="D’une langueur"/> |
20 |
| nb="6" texte="Monotone."/> |
21
22
23 24
25
26
27
28 |
| nb="14" texte="Au vent mauvais"/> |
29 |
| nb="15" texte="Qui m’emporte"/> |
30 |
| nb="16" texte="Deçà, delà,"/> |
31 |
| nb="17" texte="Pareil à la"/> |
32 |
| nb="18" texte="Feuille morte."/> |
33 |
| |
34 | ème> |
Nous avons balisél’élément comme s’ilétait élément vide, même si, dans la
DTD,iln’apasétédéfinicommetel.Cebalisageexpliciteetcompletesttrèscommode pour gérer des textes dans les bases de données, comme il est simple d’en extraire n’importe quel type d’information. Évidemment pour chaque DTD une nouvelle déclaration XSL devra être développée pour visualiser le document (voir la section 5).
4. Domaines nominaux
Les domaines nominaux (namespaces[41]) permettent de garantir l’unicité des noms d’éléments et d’attributs même lorsque plusieurs DTD (modules ou logiciels) sont combinées. En effet il n’est pas rare que des noms identiques soient utilisés dans ces modules à des fins différentes. La spécification définissant les domaines nominaux introduit une méthode pour délimiter la partie du document où un nom est visible en créant un « domaine de validité » comme suit:
– un domaine nominal est un ensemble de noms caractérisé par un URI [22];
– cet URI identifie d’une façon unique les noms de types d’élément et d’attribut appartenant à ce domaine nominal;
– cet URI ne doit pas correspondre à une ressource réelle; – cet URI servira comme préfixe pour rendre un nom non-ambigu.
Undomainenominal estdéfini àl’aided’uneséried’attributsréservés. Untelattribut sera la chaîne de caractères xmlns ou aura la chaîne xmlns: comme préfixe.
Le double point est utilisé pour séparer le préfixe identifiant le domaine nominal de la partie locale, les deux unités ensemble formant un « nom qualifié » (voir les règles de production à la section B pour plus de détails).
1
3
4
5
6
7
Dans l’exemple précédent nous voyons comment le préfixe xmlns: permet de définir l’abréviation qui sera utilisée pour identifier un domaine nominal. Ainsi « xsl: » en ligne 1 est déclaré correspondre à la chaîne Transform, alors que la ligne 2 déclare fo: comme représentant la chaîne http:
La partie locale du nom qualifié—template en ligne 3 ou apply-templates en ligne 5 et sequence en ligne 4—doit avoir un sens dans le domaine nominal en question—xsl et fo dans notre cas.
Un domaine nominal par défaut peut être indiqué comme à la ligne 3 ci-dessous, qui spécifie que les noms non préfixés (comme le
en ligne 5) appartiennent au domaine nominal XHTML
1
2 xmlns:xsl=";
3 xmlns=";
4
5
6
4.1. Déclarer un domaine nominal pour un élément
Une déclaration de domaine nominal est valable pour l’élément où elle est spécifiée et pour tous les éléments contenus dans cet élément, à moins qu’une autre déclaration de domaine nominal utilisant la même partie abréviation ne soit rencontrée. Ainsi, les domaines nominaux peuvent se chevaucher et être redéfinis localement comme le montre l’exemple suivant:
1
2
3
4
5
Particule | Masse | Détails |
neutron | 939.56 MeV | 11 12 13 udd886.7 séeDeVie> 14 p,e,anueésintégration> 15 16 |
19
20
21
De la ligne 5 à la ligne 18, le domaine nominal par défaut est celui de XHTML. Par contre, en ligne 11 nous redéfinissons le domaine nominal par défaut qui devient autreDomNom pour l’élément pdg et ses descendants. Il reste effectif jusqu’en ligne 15 où nous quittons le cadre de l’élément pdg.
Si nous voulons éliminer toute référence à un domaine nominal nous pouvons spécifier un URI vide (xmlns=""). Dans ce cas les éléments sans préfixe nominal dans le domaine de validité de la déclaration n’ appartiennent à aucun domaine nominal. Notons toutefois (voir exemple ci-dessous) que le domaine nominal par défaut ne s’applique par directement aux attributs.
4.2. Déclarer un domaine nominal pour un attribut
Les domaines nominaux s’appliquent aussi aux attributs. Notons qu’une balise XML ne peut contenir deux attributs avec un nom identique (en accord avec la section 3.1 de la spécification XML), ni avec des noms qualifiés ayant une même partie locale et des préfixes liés à des domaines nominaux identiques.
1
2 xmlns:d2="" >
3 xmlns="" >
4
5 6
7
8
Dans cet exemple, les lignes 1–3 définissent trois domaines nominaux (d1, d2 et le défaut) qui correspondent tous à l’URI ligne 4 estillégale(les deuxattributsont lemêmenom), toutcommela ligne5(lesdeux attributs ont une même partie locale et des domaines nominaux liés à un URL identique). Par contre la ligne 6 dont les deux attributs ont un nom différent est légale. La ligne 7 est également correcte car le domaine nominal par défaut ne s’applique pas aux attributs.
5. Le langage XSL
La spécificationdulangage XSL (Extensible Stylesheet Language ou langageextensible pour feuilles de style) est divisée en trois parties:
1. XPath[48]: un langage pour adresser une partie d’un document XML. Il est utilisé avec les recommandations XSLT et XPointer.
2. XSLT [53]: un langage pour transformer les documents XML en d’autres documents XML.
3. XSLF [52]: unvocabulairepour spécifier le formataged’un document XML. XSLF utiliseunefeuilledestyle XSLT pour transformer ledocument source XML enun autre document XML qui utilise les éléments du vocabulaire de formatage.
Actuellement la plupart des applications de XSL n’utilisent que les parties XPath et
XSLT. Nous les traiterons en priorité et ne mentionnerons qu’en passant quelques caractéristiques de XSLF, dont la spécification n’est pas encore finalisée. En complément à l’information sur XSL dans ses pages nous suggérons des tutoriels, listes de discussions et foire aux questions dans [27, 26, 8, 25, 17].
5.1. Le langage XPath
Le langage XPath propose une syntaxe et sémantique communes pour les fonctions partagées entre XSLT et XPointer[49]. Le but principal de XPath est d’adresser les différentes parties d’un document XML. XPath propose également quelques fonctions pour manipuler les suites de caractères, les nombres et les booléens. La syntaxe du langage XPath adopte une syntaxe compacte non-XML, qui permet son utilisation dans les URIs et à l’intérieur des attributs XML.
XPathmodéliseundocument XML commeunarbredenœuds (detypeélément, attribut, texte, etc..). XPath permet de calculer une valeur de type caractère pour chaque type de nœud. La construction syntaxique principale de XPath est l’expression dont l’évaluation peut donner quatre types d’objets: un ensemble (une collection nonordonnée) de nœuds, un booléen (« vrai » ou « faux ») , un nombre (virgule flottante) ou une chaîne de caractères (une séquence de caractères Unicode).
5.1.1. Chemins de localisation
Un chemin de localisation (location path) est le type d’expression le plus commun de XPath. Il utilise treize axes pour se déplacer dans le document.
child contient les descendants immédiats (les « enfants ») du nœud contexte, en d’autres mots le nœud par rapport auquel on spécifie le chemin de localisation. Les nœuds de type attribut ou domaine nominal ne sont pas considérés comme des descendants du l’élément contenant.
child::section choisit les nœuds de type section qui sont des descendants immédiats du nœud contexte, child::* choisit tous les descendants directs du nœud contexte.
descendant contient tous les descendants (enfants, petits-enfants, ) du nœud contexte. Comme pour l’axe child cet axe ne contient jamais de nœuds de type attribut ou domaine nominal.
descendant::soussectionchoisitlesnœudsdetypesoussectionquisont des descendants du nœud contexte.
parent contientl’ascendantimmédiat(parentausens« père»ou«mère»)dunœud contexte, s’il existe. Pour un nœud de type attribut et domaine nominal il s’agit de l’élément auquel le nœud en question est attaché (l’élément « contenant »). parent::article choisit l’ascendant immédiat de type article du nœud contexte.
ancestor contient lesascendants(parent, grand-parent, etc.)dunœudcontexte. Le parent sera le premier sur l’axe, le parent du parent le deuxième, etc.
ancestor::articlechoisit l’ascendant de type articledu nœud contexte.
following-sibling contient les nœuds qui suivent le nœud contexte et qui ont le même parent que ce dernier (c’est-à-dire : les « frères » et « sœurs »). Pour un nœud de type attribut ou domaine nominal l’axe following-siblingest vide.
preceding-sibling contient les nœuds qui précèdent le nœud contexte et qui ont le même parent que ce dernier. Pour un nœud de type attribut ou domaine nominal l’axe following-siblingest vide.
following contient tous les nœuds dans le même document que le nœud contexte qui le suivent d’après l’ordre dans le document, en excluant les descendants et les nœuds de type attribut ou domaine nominal.
preceding contient tous les nœuds dans le même document que le nœud contexte qui le précèdent d’après l’ordre dans le document, en excluant les ascendants et les nœuds de type attribut ou domaine nominal.
self ne contient que le nœud contexte.
descendant-or-self contient lenœud contexte et ses descendants; le nœud contexte est le premier nœud sur l’axe, son premier enfant le deuxième, et ainsi de suite (voir l’axe descendant).
ancestor-or-self contient lenœud contexte et ses ascendants; lenœud contexte est le premier nœud sur l’axe, son parent le deuxième, et ainsi de suite (voir l’axe parent).
attribute contient les attributs du nœud contexte. Si le nœud contexte n’est pas de type élément l’axe sera vide.
namespace contient les nœuds de type domaine nominal du nœud contexte. L’axe est vide si le nœud contexte n’est pas de type élément.
Pour certains cas il existe une notation courte d’après le schéma suivant (la forme courte est à gauche, son équivalent long à droite): nom child::nom @nom attribute::nom . self::node()
.. parent::node()
// descendant-or-self::node()
Voici quelques exemples de l’utilisationdeces axes (avec la forme courte équivalente si elle existe):
– "child::section"choisit les enfants de type section du nœud contexte. "section"en est la forme courte.
– "child::text()"choisit les nœuds enfants de type texte du nœud contexte.
"texte()"en est la forme courte.
– "child::node()"choisit tous les nœuds enfants du nœud contexte indépendamment du type du nœud. "node()"en est la forme courte.
– "attribute::couleur"choisit l’attribut ayant le nom couleur du nœud contexte. "@couleur"en est la forme courte.
– "attribute::*"choisit tous les attributs du nœud contexte.
"@*" en est la forme courte.
– "descendant::soussection"choisit les descendants de type soussectiondu nœud contexte.
– "ancestor::soussection"choisit les ascendants de type soussectiondu nœud contexte.
– "ancestor-or-self::soussection"choisit les ascendants de type soussectiondu nœud contexte ainsi que le nœud contexte lui-même s’il correspond au type d’élément soussection.
– "descendant-or-self::soussection"choisit les descendants de type soussectiondu nœud contexte ainsi que le nœud contexte lui-même s’il correspond au type d’élément soussection.
"//soussection"en est la forme courte.
– "self::soussection"choisit le nœud contexte s’il correspond au type d’élément soussection,autrement ne choisit rien.
– "child::section/descendant::soussection"choisit les descendants de type soussectiondes enfants de type section du nœud contexte.
"section//soussection"en est la forme courte.
– "child::*/child::para"choisit tous les petits-enfants de type para du nœud contexte.
– "/" sélectionne la racine du document (qui est toujours le parent de l’élément document (voir la production [1] de la grammaire de XML).
– "/descendant::liste/child::item"choisit tous les éléments de type item dans le même document que le nœud contexte qui ont un parent de type liste (le / initial indique que nous commençons à la racine du document).
– "child::liste[position()=2]"choisit le deuxième enfant de type liste du nœud contexte. "liste[2]"en est la forme courte.
– "child::liste[position()=last()]"choisit le dernier enfant de type liste du nœud contexte. "liste[last()]"en est la forme courte.
– "child::liste[position()=last()-1]"choisit l’avant-dernier enfant de type liste du nœud contexte. "liste[last()-1]"en est la forme courte.
– "child::liste[position()=>3]"choisit tous les enfants de type liste du nœud contexte sauf les deux premiers.
"liste[position()=>3]"en est la forme courte.
– "following-sibling::section[position()=1]"choisit le prochain élément de type section qui a le même parent que le nœud contexte.
– "preceding-sibling::section[position()=1]"choisit le précédent élément de type sectionqui a le même parent que le nœud contexte.
– "/descendant::figure[position()=17]"choisit le dix-septième élément de type figure dans le document.
"//figure[17]"en est la forme courte.
– "/child::article/child::section[position()=3]/ child::soussection[position()=5]"choisit la cinquième soussectionde la troisième section de l’élément document article.
"article/section[3]/soussection[5]"en est la forme courte.
– "child::note[attribute::type=’attention’]"choisit les enfants du nœud de contexte de type note qui ont un attribut type qui a la valeur attention."note[@type=’attention’]"en est la forme courte.
– "child::note[attribute::type=’attention’][position()=3]" choisit le troisième enfant du nœud de contexte qui est de type note et qui a un attribut type qui a la valeur attention.
"note[@type=’attention’][3]"en est la forme courte.
– "child::note[position()=3][attribute::type=’attention’]" choisit le troisième enfant du nœud de contexte s’il est de type note et a un attribut type qui a la valeur attention.
"note[3][@type=’attention’]"en est la forme courte.
– "child::section[child::titre]"choisit les enfants du nœud de contexte qui sont de type section et qui ont un ou plusieurs enfants titre. "section[titre]"en est la forme courte.
– "child::section[child::titre=’Introduction’]"choisit les enfants du nœud de contexte qui sont de type sectionet qui ont un ou plusieurs enfants titre avec une valeur « Introduction».
"section[titre=’Introduction’]"en est la forme courte.
– "child::*[self::section or self::annexe]"choisit les enfants de type section et annexe du nœud de contexte.
– "child::*[self::section or self::annexe][position()=last()]" choisit le dernier enfant de type section ou annexe du nœud de contexte.
– "child::ligne[attribute::couleur and attribute::largeur]" choisit les enfants de type ligne du nœud de contexte qui ont les deux attributs couleur et largeur.
"ligne[@couleur and @largeur]"en est la forme courte.
– "/descendant::para[1]"choisit le premier descendant de type para.
– "/descendant-or-self::node()/child::para[position()=1]" choisit tous les éléments de type para qui sont les premiers enfants para de leur parents. "//para[1]"en est la forme courte.
– "self::node()/descendant-or-self::node()/child::para"choisit tous les éléments descendants de type para du nœud de contexte. ".//para"en est la forme courte.
– "parent::node()/child::titre"choisit tous les enfants de type titre de l’élément parent du nœud de contexte. "../titre"en est la forme courte.
Chaque axe possède un type de nœud principal:
– pour l’axe attribute le type de nœud principal est attribut; – pour l’axe namespace le type de nœud principal est namespace; – pour les autres types d’axe le type de nœud principal est « élément ».
Dans les exemples précédents nous avons implicitement introduit deux autres notions de base de XPath, à savoir la façon de spécifier les tests pour sélectionner un ensemble de nœuds et l’utilisation de prédicats pour qualifier davantage cette sélection.
La sélection est opérée en spécifiant une expression joker (wildcard)en combinaison le cas échéant avec une spécification d’un type de nœud, dont il existe quatre types: comment()(commentaire), text() (texte), processing-instruction(Litéral) (instruction de traitement), node() (type générique).
En particulier, le test nodal child::section choisit les éléments de type section qui sont des enfants du nœud contexte. En l’absence d’un tel élément, l’ensemble videest sélectionné. D’une façon analogue letest nodal attribute::couleurchoisit l’attribut couleur du nœud contexte. Si le nœud contexte ne possède pas un tel attribut l’ensemble vide est sélectionné.
Les expressions prédicats sont spécifiées entre crochets [ ], ce qui donne par exemple: [titre=’Introduction’].
5.1.2. Expressions
Une expression peut être une référence à une variable, une sous-expression, une valeur littérale, un nombre ou un appel de fonction. Des parenthèses peuvent être utilisées pour améliorer la compréhension ou pour guider l’analyse de l’expression.
Pour les appels de fonctions on évalue d’abord leurs arguments en les convertissant au type requis par la fonction, après quoi la fonction concernée est appelée dans la librairiedes fonctions qui fait partie du contexte de l’évaluationde l’expression en lui passant les arguments résultat retourné par la fonction devient la valeur de la sous-expression.
Un chemin de localisation peut également figurer dans une expression. Dans ce cas l’expression retourne l’ensemble des nœuds sélectionnés par le chemin. L’opérateur d’union | combine plusieurs ensembles de nœuds.
La définition formelle de XPath se trouve à l’annexe C. Une liste des fonctions XPath et XSLT est à l’annexe E.
5.2. Introduction au langage XSLT
Unetransformation XSLT —appelée une feuille de style — estunesériederègles pour transformer un arbre source (source tree) XML en un arbre résultant (result tree). La transformation se fait en associant des motifs (patterns) à des modèles (templates) et en les appliquant aux éléments de l’arbre source. Chaque élément dans le fichier source ne peut correspondre qu’à un seul motif dans la feuille de style. Le modèle en question est alors initialisé pour transformer l’élément source en une partie de l’arbre résultant.
L’arbre source et l’arbre résultant sont disjoints et peuvent avoir une structure totalement différente. En effet des éléments de l’arbre source peuvent passer par un filtre, être réordonnés ou une structure arbitraire peut être insérée dans l’arbre résultant.
Comme indiqué ci-dessus une feuille de style contient une série de règles. Chaque règle a deux parties: un motif de correspondance (match pattern) pour sélectionner des éléments dans l’arbre source et un modèle qui sera initialisé pour construire une partie de l’arbre résultant. Cette structure générale permet d’appliquer une même feuille de style à une large classe de documents caractérisés par une arborescence source similaire. Exemple simple:
1
2 3
4
5
La ligne un est le motif, qui spécifie que le modèle de traitement des lignes 2–4 est à appliquer aux éléments du document source qui ont un type emph (notons toutefois que certains éléments de type emph peuvent être traités différemment s’ils sont sélectionnés par un motif ayant une priorité plus élevée, voir la section 5.5 de la spécification XSLT[53]).
5.2.1. Structure d’une feuille de style
Ci-dessous suit une liste de tous les éléments qui peuvent être utilisés au niveau supérieur d’une feuille de style XSLT. Les endroits où le contenu ou un attribut doivent être spécifiés sont indiqués par . Il est à souligner qu’une feuille de style peut contenir zéro ou plusieurs éléments des différents types indiqués. À part l’élément (ligne3),quidoit,s’ilestprésent,précéder touslesautres,l’ordre de spécification des éléments dans une feuille de style n’est pas significative, sauf pour le traitement d’éventuelles conditions d’erreur. Notons que le domaine nominal xsl: (ligne 2) a été choisi pour préfixer tous les éléments XSLT.
1
2
4
5
6
7
8
9 10
11
12
13
14
5.2.2. Modèle de traitement
XSLT interprète undocument XML commeunarbre,c’est-à-dire :deuxfeuillesdestyle ou documents source qui sont décrits par un même arbre seront traités par XSLT de façon identique.
XSLT connaît sept types de nœuds dans un arbre:
– le nœud racine, qui a comme unique descendant le nœud document;
– les nœuds élément, qui correspondent aux éléments dans le source XML. Ils sont dans le même ordre que les balises de début dans le document source. Pour chaque attribut spécifié ou qui a une valeur par défaut un nœud attribut est créé. Un élément vide sans attributs n’a pas de nœuds attachés;
– les nœuds texte, qui contiennent toutes les chaînes de caractères textuels (ne faisant pas partie du balisage). Toutes les données de type caractère qui se suivent sans balisage intermédiaire sont déposées dans un même contenant texte;
– les nœuds attribut, qui contiennent des attributs associés à un élément et sont ainsi toujours attachés à un nœud élément ;
– les nœuds domaine nominal, qui sont construits à partir du document source et de la feuille de style;
– les nœuds instructions de traitement (IT) qui sont créés pour chaque instruction de traitement avec un nom égal à la cible de l’IT. Un tel nœud a comme valeur la chaîne de caractères qui définit l’IT;
– les nœuds commentaire qui sont générés pour chaque commentaire dans le fichier source.
À chaque type de nœud est associée une valeur (comme chaîne de caractères). Pour certains types cette valeur fait partie du nœud lui-même, alors que pour d’autres elle est calculée à partir de la valeur des nœuds des sous-éléments.
6. Exemples de feuilles de style XSL
Cette section contient des exemples de plus en plus complexe montrant l’utilisation des feuilles de style XSL pour transformer les documents XSL et obtenir différentes représentations. Pour bien comprendre les détails il faut se référer aux annexes C (définition du langage XPath), D (définition du langage XSLT) et E (liste des fonctions utilisés avec XPath et XSLT), ainsi qu’aux spécifications XPath[49] et XSLT [53].
6.1. Une invitation sous plusieurs formes
Notre premier exemple est emprunté au LATEX Web Companion[15]. Nous avons décidé d’envoyer une invitation à nos collègues pour leur proposer de se voir quelque part pour faire la fête. Voici la DTD que nous avons choisie pour modéliser l’information:
1
2
3 |
| (to, date, where, why?) > |
4 |
| (#PCDATA) > |
5 |
| (#PCDATA) > |
6 |
| (#PCDATA) > |
7 |
| (#PCDATA) > |
8 |
| (par+) > |
9 |
| (#PCDATA|emph)* > |
10 |
| (#PCDATA) > |
11 |
| (signature) > |
12
Avec ce modèle, qui n’utilise que des éléments pour indiquer le contenu sémantique du document XML, nous balisons le texte (anglais) invitation.xmlsuivant:
1
2
3
4
5
6 Anna, Bernard, Didier, Johanna
7 Next Friday Evening at 8 pm
8 The Web Cafe
9 My first XML baby
10
11
12
13 I would like to invite you all to celebrate
14 the birth of Invitation, my
15 first XML document child.
16 Please do your best to come and join me next Friday 17 evening. And, do not forget to bring your friends.
18 I really look forward to see you soon!
19
20
21
22 Michel
23
24
À l’aide de ce document nous allons montrer comment cette information peut être transformée en plusieurs formats (HTML, LATEX, objets formatés).
6.1.1. Sortie LATEX
Commençons par transformer le document, en LATEX. Pour cette tâche nous nous basons sur la feuille de style XSL invlat1.xslsuivante:
1
2
5
6
7
8
9 \documentclass[12pt]{article}
10 \usepackage{invitation}
11 \begin{document}
12
13
14 \end{document}
15
16
17
18
19 \begin{Front}
20 \To{
21
22 }
23 \Date{
24
25 }
26 \Where{
27
28 }
29 \Why{
30
31 }
32 \end{Front}
33
34
35
36
37 \begin{Body}
38
39
40
41 \end{Body}
42
43
44
45
46
47 \par
48
49
50
51 52 \emph{
53
54 }
55
56
57
58 \begin{Back}
59 \Signature{
60
61 } 62 \end{Back}
63
64
65
66
La ligne 2 définit que ce qui suit est une feuille de style XSL qui correspond à la premièreversiondela spécificationet utiliseledomainenominal représenté par xslqui correspond à l’URI un autre URI est spécifié, la feuille de style ne pourra être traitée.
La ligne 4 indique que nous ne désirons pas générer un fichier XML (par défaut) mais un fichier « texte » (method="text").
Pour traiter l’information présente dans un document il existe essentiellement deux approches :
1. « extraction individuelle » (méthode pull) avec sélection de la valeur des éléments à l’aide d’instructions XSLT xsl:value-of.
2. « distribution sélective » (méthode (push) à l’intérieur des motifs de sélection à l’aide d’instructions xsl:apply-templates.
En règle générale, ces deux méthodes sont utilisées dans une même feuille de style. Ainsi, ligne 13, nous « poussons » les éléments contenus à l’intérieur de l’élément invitation(sélectionné par le motif en ligne 8) à travers la feuille de style par l’instruction.Nousfaisonslamêmeopérationàligne39pour l’élément body, en ligne 48 pour les éléments par et en ligne 53 pour les éléments emph.
Par contre,pour lecontenudel’élément front(ligne18),nous allons« tirer»lesdonnées présentes dans les différents éléments en nous servant des instructions de type . Ainsi, ligne 21, nous obtenons la « valeur » (c’est-à-dire : le contenu textuel dans ce cas) de l’élément to qui est un enfant de front, et ainsi de suitepour l’élément date(ligne 24), where(ligne 27) et why(ligne 30). Similairement pour l’élément back, qui est sélectionné par le motif en ligne 57, nous obtenons la valeur de l’élément signatureen ligne 60.
Les autres composantes intéressantes de cette feuille de style sont les commandes LATEX qui sont introduites à l’aide d’instructions pour chacune des balises XML. Ainsi pour l’élément racine invitation nous écrivons le préambule du document LATEX (lignes 9–11) puis, à la fin (après avoir traité le reste du document grâce à l’instruction XSL de la ligne 13), nous terminons le fichier LATEX avec \end{document}(ligne 14).
Remarquons que chaque balise XML a pratiquement un équivalent en LATEX. C’est le fichier d’extension LATEX (ligne 10) qui interprétera ces balises, comme on peut l’observer dans le fichier source invitation.stysuivant:
1 %
2 % Package to format
3 \setlength{\parskip}{1ex}
4 \setlength{\parindent}{0pt}
5 \pagestyle{empty}%% Turn off page numbering
6 \RequirePackage{array}
7 \newenvironment{Front}%
8 {\begin{center}\huge \sffamily Memorandum\end{center}
9 \begin{flushleft}
10 \begin{tabular}{@{}>{\bfseries}p{.2\linewidth}@{}p{.8\linewidth}@{}}\hline
11 }
12 {To whom: & \@To \\ 13 Occasion: & \@Why \\ 14 Venue: & \@Where \\
15 When: & \@Date \\\hline
16 \end{tabular}
17 \end{flushleft}
18 }
19 \newenvironment{Body}{\vspace*{\parskip}}{\vspace*{\parskip}}
20 \newenvironment{Back} 21 {\begin{flushleft}}
22 {\hspace*{.5\linewidth}\fbox{\emph{\@Sig}}
23 \end{flushleft}
24 }
25 \newcommand{\To}[1]{\gdef\@To{#1}}
26 \newcommand{\Date}[1]{\gdef\@Date{#1}}
27 \newcommand{\Where}[1]{\gdef\@Where{#1}}
28 \newcommand{\Why}[1]{\gdef\@Why{#1}}
29 \newcommand{\Signature}[1]{\gdef\@Sig{#1}}
30 \endinput
Nous avons opté pour une correspondance générique entre les types d’élément XML et leur représentation LATEX. Nous n’avons pas traduit ces éléments directement en constructions élémentaires mais nous avons utilisé des commandes et environnements spécifiques qui « mappent » les noms dans le document source sur un nom LATEX (ainsi l’élément est « mappé » sur la commande \To, etc.). Cette approche
INVITATION To whom: Anna, Bernard, Didier, Johanna Occasion: My first XML baby Venue: The Web Cafe When: Next Friday Evening at 8 pm I would like to invite you all to celebrate the birth of Invitation, my first XML document child. Please do your best to come and join me next Friday evening. And, do not forget to bring your friends. I really look forward to see you soon! From: Michel |
FIGURE 3 – Résultat du formatage d’un document XML avec LATEX
nous permet de généraliser cette extension à d’autres langues (en particulier le français, voir page 41).
La seule chose qui nous manque pour transformer le XML en un autre format est un programme d’analyse qui réalise les recommandations XML et XSL. Il en existe plusieurs, mais dans ce qui suit nous en utilisons uniquement deux, dont le programme xt[5] de James CLARK, un des éditeurs des recommandations de la famille XSL. Il s’agit d’une bibliothèque Java de type jar qui permet de transformer un document XML dans un autre format d’après les règles spécifiées dans une feuille de style XSL.
La commande suivante montre comment utiliser le processeur xt. Nous spécifions lefichier source XML ,la feuilledestyle XSL à l’entrée et nous obtenons le fichier à la sortie. java .Driver
Après compilation du fichier TEX avec LATEX en utilisant l’extension invitation.stynous obtenons le résultat montré à la figure 3.
6.1.2. Sortie HTML
Nous savons déjà que nous pouvons baliser un document XML de plusieurs façons. Dans la première version que nous venons d’étudier, nous avons privilégié l’utilisation de types d’élément distincts pour les différentes parties structurelles de l’information. Une autre possibilité (que nous explorons ci-dessous) spécifie une partie de l’information à l’aide d’attributs, ce qui minimise le nombre de balises. Voici la DTD qui définit la structure du balisage pour cette deuxième version du fichier XML :
1
2
3
4
5 | date CDATA #REQUIRED | |
6 | to CDATA #REQUIRED | |
7 | signature CDATA #REQUIRED | |
8 | where CDATA #REQUIRED | |
9 | why CDATA #IMPLIED | |
10 | > | |
11 |
| (#PCDATA|emph)*> |
12 |
| (#PCDATA)> |
La DTD ne contient plus que trois éléments: invitation (la racine), par et emph. D’après cette DTD nous avons saisi le fichier source XML invitation2.xmlsuivant:
1
2
3
4 date="Next Friday Evening at 8 pm"
5 where="The Web Cafe"
6 why="My first XML baby"
7 signature="Michel"
8 >
9
10 I would like to invite you all to celebrate 11 the birth of Invitation, my 12 first XML document child.
13
14
15 Please do your best to come and join me next Friday 16 evening. And, do not forget to bring your friends.
17
18
19 I really look forward to see you soon!
20
21
Ce fichier invitation2.xmlcontient effectivement la même information que le fichier de la section précédente. En particulier toutes les informations génériques concernant l’invitation (date, to, etc.) sont devenues des attributs de l’élément racine invitation.
Pour transformer le fichier XML invitation2.xmlen HTML nous utilisons le fichier de style XSL invhtml2.xslsuivant:
1
2
5
6
7
8
9
10
Invitation (XSL/CSS formatting)11
12
13
14
15
INVITATION
16
To: | |
When: | |
Venue: | |
Occasion: |
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
La ligne 4 déclare (implicitement) que le domaine nominal par défaut est HTML, ce qui veut dire que chaque balise non qualifiée est considérée comme du HTML. Les motifs des lignes 7, 34 et 42 traitent les trois éléments utilisés dans notre document XML. L’information concernant les destinataires (attribut to), la date (attribut date), etc., est extraite avec des instructions (lignes 19, 21, etc.). Nous avons utilisé l’élément HTML h1 (ligne 15) pour afficher le titre, alors que l’entête est générée à l’aide d’une table (lignes 16–27) et l’information adéquate (motclé et la valeur correspondante) y est introduite dans les cellules, rangée par rangée. Signalons également que nous utilisons l’attribut class sur plusieurs balises HTML (lignes 19, 21, , 29) pour mieux piloter la représentation dans un butineur à l’aide d’une feuille de style CSS [10, 39, 40] qui permet de contrôler les paramètres de visualisation. La ligne 11 déclare comment associer le fichier HTML avec le fichier CSS invit.csssuivant:
1 /* CSS stylesheet for invitation1 in HTML */
2 BODY {margin-top: 1em; /* global page parameters */
3 margin-bottom: 1em;
4 margin-left: 1em;
5 margin-right: 1em;
6 font-family: serif;
7 line-height: 1.1;
8 color: black;
9 }
10 H1 {text-align: center; /* for global title */
11 font-size: x-large;
12 }
13 P {text-align: justify; /* paragraphs in body */
14 margin-top: 1em;
15 }
16 TABLE { border-width: 0pt }
17 TBODY { border-width: 0pt }
18 TD[class="front"] { /* table data in front matter */
19 text-align: left;
20 font-weight: bold;
21 }
22 TD.front { /* table data in front matter */
23 text-align: left;
24 font-weight: bold;
25 }
26 EM {font-style: italic; /* emphasis in body */
27 }
28 P.signature { /* signature */
29 text-align: right;
30 font-weight: bold;
31 }
Nous obtenons le fichier HTML invhtml2.htmlavec le programme xt avec la commande suivante: xt
La figure 4 montre le résultat HTML visualisé à l’aide du butineur Microsoft Explorer en utilisant la feuille de style CSS invit.cssmontré ci-dessus.
6.1.3. Générer des objets de formatage XSL
Un fichier de style qui traduit le fichier source XML en des objets de formatage XSL est le suivant:
1
2
3 xmlns:xsl=";
FIGURE 4 – Le fichier HTML visualisé par MS Explorer
4 xmlns:fo=";>
5
6
7
8
9
10 75pt
11 125pt
12 80pt
13 150pt
14 12pt
15
16
17 labeltext
18 itemid
19 itemtext
20
21
22
23
24 :
25
26
27
28
29
30 31
32
33
34
38 margin-top="{$PageMarginTop}"
39 margin-bottom="{$PageMarginBottom}"
40 margin-left="{$PageMarginLeft}"
41 margin-right="{$PageMarginRight}">
42
43
44
45
46
47
48
49 page-master-first="allpages"
50 page-master-repeating="allpages"/>
51
52
53
54
55
56
57
58
59
60
61 font-weight="bold" text-align-last="centered"
62 space-after.optimum="24pt">
63 INVITATION
64
65
66
67 provisional-label-separation="6pt">
68
69 To
70 listto
71
72
73
74 When
75 listdate
76
77
78
79 Venue
80 listwhere
81
82
83
84 Occasion
85 listwhy
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105 font-weight="bold" text-align-last="end">
106 From:
107
108
109
110
111
Nousn’essaieronspasd’expliquer endétailtoutesleslignesdecettefeuilledestyle(la norme XSLF [52] n’est d’ailleurs pas encore terminée). Nous mentionnons toutefois en ligne 4 la définition du domaine nominal fo, utilisé partout dans le fichier.
Des variables XSL sont définies en lignes 10–14 et utilisées, par exemple, en lignes 38–41.
La définition du « modèle nommé » (named template) listitem se trouve en lignes 16–31. Nous y voyons comment les trois paramètres labeltext (ligne 17), itemid (ligne 18) et itemtext (ligne 19) sont déclarés et comment une valeur par défaut leur est associée. Les valeurs de ces paramètres sont utilisées en lignes 23, 20 et 28, respectivement (la valeur d’un paramètre ou d’une variable est utilisée en faisant précéder son nom par un dollar $ et en entourant le tout d’accolades, comme en ligne 20 avec id="{$itemid}"). Leurs valeurs peuvent être définies quand le modèle nommé listitemest invoqué (lignes 68–72, 73–77, 78–82 et 83–87).
En traitant le fichier source XML invitation.xmlet la feuille de style avec le processeur XSLT xt, nous obtenons un fichier , qui contient une représentation basée sur des objets de formatage XSL. xt
Pour compiler le fichier nous disposons de deux programmes librement accessibles: FOP [34] de James TAUBER et PassiveTEX[29, 30] de Sebastian RAHTZ. Le premier traduit les objets directement en PDF, alors que PassiveTEX utilise pdftex (donc lemoteur formatagedeTEX)pour produirele PDF.Lafigure5montrelerésultat obtenu par ces deux approches.
XSL FOP
XML???FO????PDF
INVITATION
To: Anna, Bernard, Didier, Johanna
When: Next Friday Evening at 8 pm
Venue: The Web Cafe
Occasion: My first XML baby
I would like to invite you all to celebrate the birth of Invitation , my first XML document child.
Please do your best to come and join me next Friday evening. And, do not forget to bring your friends.
I really look forward to see you soon!
From: Michel
XML??XSL?FO?????PassiveTE?X PDF
INVITATION
To: Anna, Bernard, Didier, Johanna
When: Next Friday Evening at 8 pm
Venue: The Web Cafe
Occasion: My first XML baby
I would like to invite you all to celebrate the birth of Invitation, my first XML document child.
Please do your best to come and join me next Friday evening. And, do not forget to bring your friends.
I really look forward to see you soon!
From: Michel
FIGURE 5 – Résultat PDF obtenu avec FOP et avec PassiveTEX
6.1.4. Exemple en français
Jusqu’ici nous avons étudié des exemples XML d’une invitation en anglais. Toutefois, pour une utilisation par des francophones, il est plus commode de baliser le document en français. Un exemple de noms de balises et d’un texte en français se trouve dans le fichier invitationfr.xmlsuivant:
1
2
3
4
5
6 Anna, Bernard, Didier, Johannaà>
7 Vendredi prochain à 20 heures
8 Le Café du Webù>
9 Mon premier bébé XML
10 ête>
11
12
13
14 J’ai le plaisir de vous inviter à la célébration 15 de la naissance d’Invitation, mon 16 premier enfant document XML.
17
18
19 S’il vous plaît, faites tout votre possible pour me rejoindre 20 vendredi prochain. Et n’oubliez pas d’emmener vos amis.
21
22
23 Je me réjouis vraiment d’avance de votre présence.
24
25
26
27
28 Michel
29
30
La version française de la DTD a la même architecture que son analogue anglais, tout en utilisant des noms francisés. Le contenu du fichier DTD invitationfr.dtdsuit:
1 2 3
4
5
6 7 8
9
10
11
12
13
14
Notons l’utilisation de caractères accentués pour certains noms d’éléments, comme entête,àetoù.Lefichierd’,montréci-dessous, contient les définitions des commandes et environnements qui correspondent aux différentes balises du fichier XML (versions anglaise et française).
1 %
2 % Package to format
3 \setlength{\textwidth}{22pc}
4 \setlength{\parskip}{1ex}
5 \setlength{\parindent}{0pt}
6 \pagestyle{empty}%% Turn off page numbering
7 \RequirePackage{array,calc}
8 \newcommand{\ToTitle}{To whom}
9 \newcommand{\WhyTitle}{Occasion}
10 \newcommand{\WhereTitle}{Venue}
11 \newcommand{\DateTitle}{When}
12 \newcommand{\SignatureTitle}{From}
13 \DeclareOption{francais}{% French text for fixed texts
14 \renewcommand{\ToTitle}{À}
15 \renewcommand{\WhyTitle}{À l’occasion de}
16 \renewcommand{\WhereTitle}{Où}
17 \renewcommand{\DateTitle}{Quand}
18 \renewcommand{\SignatureTitle}{De la part de}}
19 \newenvironment{Front}%
20 {\begin{center}
21 \Huge\sffamily INVITATION
22 \end{center}
23 }
24 {\begin{flushleft}
25 \rule{\linewidth}{1pt}\\[2mm]
26 \begin{tabular}{@{}>{\bfseries}ll@{}}
27 \ToTitle: & \@To \\ 28 \WhyTitle: & \@Why \\ 29 \WhereTitle: & \@Where \\
30 \DateTitle: & \@Date
31 \end{tabular}\\[2mm]
32 \rule{\linewidth}{1pt}
33 \end{flushleft}
34 }
35 \newenvironment{Body}{\vspace*{\parskip}}{\vspace*{\parskip}}
36 \newenvironment{Back} 37 {\begin{flushleft}}
38 {\hspace*{.5\linewidth}\fbox{\SignatureTitle: \emph{\@Sig}}
39 \end{flushleft}
40 }
41 \newcommand{\To}[1]{\gdef\@To{#1}}
42 \newcommand{\Date}[1]{\gdef\@Date{#1}}
43 \newcommand{\Where}[1]{\gdef\@Where{#1}}
44 \newcommand{\Why}[1]{\gdef\@Why{#1}}
45 \newcommand{\Signature}[1]{\gdef\@Sig{#1}}
46
47 \ProcessOptions
48
49 \endinput
Il s’agit d’une généralisation du fichier invitation.styintroduit à la section 6.1.1. Nous y avons introduit une paramétrisation des textes imprimés pour les différentes entrées dans l’en-tête, avec une dépendance del’option francais(lignes 13–18,une généralisation à d’autres langues serait triviale).
Le fichier XSL invlat1fr.xslpour traduire l’invitation en français en LATEX suit:
1
2
3
4 xmlns:xsl=";>
5
6
7
8
9
10
11 \documentclass[francais]{article}
12 \usepackage{invitationfr}
13 \usepackage[T1]{fontenc}
14 \begin{document}
15
16
17 \end{document}
18
19
20
21
22 \begin{Front}
23 \To{
24
25 }
26 \Date{
27
28 }
29 \Where{
30
31 }
32 \Why{
33
34 }
35 \end{Front}
36
37
38
39
40 \begin{Body}
41
42
43 \end{Body}
44
45
46
47
48 \par
49
50
51
52 53 \emph{
54
55 }
56
57
58
59 \begin{Back}
60 \Signature{
FIGURE 6 – Résultat du formatage d’une invitation française avec LATEX
61
62 } 63 \end{Back}
64
65
66
67
À l’exception du remplacement des noms d’élément, par leur version française, cette version de la feuille de style est tout à fait identique au fichier écrit à la section 6.1.1.
Après la génération avec xt d’un fichier LATEX à partir du fichier source et de la feuille de style XSL , nous obtenons la présentation de la figure 6.
6.1.5. Alphabets non-latins et documents codés en UTF-8
Nous avons souligné, dans la discussion du langage XML, que celui-ci est véritablement international car basé sur Unicode. Pour voir comment nous pouvons exploiter optimalement cette possibilité nous avons saisi, à l’aide d’un éditeur qui permet l’utilisation du codage UTF-8, un document qui contient du grec, du cyrillique et quelques autres symboles Unicode. Le document source est montré en figure 7 à l’intérieur d’une fenêtre de l’éditeur yudit[32].
Nous reprenons ci-dessous les premières lignes de ce fichier XML.
1
2
3
4
5 %ISOcyr1;
6 ]>
7
8 The word Russian (Ð?Ñ?Ñ?Ñ?ОÐÿÐ?) in Cyrillic:
9 Using ISO Cyrillic set:
10 Русский
11 Using XML Unicode entities:
12 Русский
13
La ligne 4 définit l’entité paramètre ISOcyr1 qui l’associe au fichier . La ligne 5 est un appel d’entité paramètre, qui indique que toutes les déclarations présentes dans ce fichier sont inclues à cet endroit dans le sous-ensemble interne. Le fichier ISOcyr1.pencontient par exemple les déclarations suivantes:
1 |
| "р"> |
2 |
| "Р"> |
3 |
| "с"> |
4 |
| "С"> |
Ces entités sont référencées en ligne 10 du document source, alors qu’en ligne 12 nous utilisons une représentation hexadécimale équivalente pour ces lettres cyrilliques. La ligne 8 en présente une forme en UTF-8, qui est indéchiffrable telle que, mais qui est lisible en figure 7.
La figure 8 montre la feuille de style XSL qui transforme le fichier source en HTML. À la première ligne, nous déclarons que le fichier de sortie est en HTML et qu’il sera codé en UTF-8. La fin du fichier montre comment nous pouvons sélectionner le texte russe en utilisant une représentation Unicode en appel de caractères ou directement en code UTF-8, comme la puce (•) ou le motif grec (???).
Le résultatfinal dela transformationdufichier source XML delafigure7avec lafeuille de style XSL de la figure 8 en HTML visualisé avec le butineur Netscape est montré en figure 9.
FIGURE 9 – Résultat avec HTML d’un fichier UTF8 avec Netscape
6.2. XML et XSL pour manipuler une base de données
Dans notre discussion de XSL comme langage de style, nous nous sommes intéressés jusqu’ici principalement aux aspects de formatage de l’information dans le but de la visualiser.
Toutefois XSLT, la partie transformation de XSL, peut aussi servir comme base pour manipuler (au sens large) des données[3]. Il n’est pas notre intention de reproduire dansces pagesles nombreusesdiscussionssurla définitiond’unlangaged’interrogation (query language) pour des bases de données XML (un atelier de deux jours a rassemblé une centaine de participants à Boston en décembre 1998 où plus de soixante propositions ont été discutées pour définir un tel langage [42]).
6.2.1. Préparation d’un fichier XML
Pour montrer comment utiliser XSLT avec une base de données, nous avons choisi de partir de la série de tables contenant les noms des pays et de leurs monnaies en plusieurs langues préparée par les services de l’Union européenne (voir l’URL la version française). Cette table est balisée en HTML et a la structure suivante:
1
Code ISO 4 ONMOUSEOVER="window.status=’norme ISO 3166 ’; return true" 5 ONMOUSEOUT="window.status=’’; return true">2 | Forme courte | Forme longue | Capitale | Citoyen ou habitant | Adjectif | Unité monétaire | Code ISO 13 ONMOUSEOVER="window.status=’norme ISO 4217 ’; return true" 14 ONMOUSEOUT="window.status=’’; return true">3 | Subdivision de l’unité 16 monétaire |
AD | Andorre | la Principauté d’Andorre | Andorre-la-Vieille | Andorran | andorran | peseta; franc français | ESP; FRF | centimo; centime |
Code ISO | Forme courte | 10Forme longue | Capitale | Citoyen ou habitant | Adjectif | Unité monétaire | Code ISO | Subdivision de l’unité monétaire | 17
AD | Andorre | la Principauté d’Andorre | Andorre-la-Vieille | Andorran | andorran | peseta; franc français | ESP; FRF | centimo; centime |
monnaie | sous-unité | code ISO | pays |
26
27
Comme XML est avant tout un langage pour l’internet la spécification XSLT (à sa section 2.3.1)propose une approche simplifiée pour générer un fichier HTML dans le cas où l’arbre résultant peut être généré à l’aide d’un seule modèle qui agit sur l’élément racine. C’est ce que nous avons mis en œuvre dans notre feuille de style, où, ligne 2, nous déclaronsque le domainenominal par défaut est htmlcequi nous permet d’insérer desinstructions HTML sanspré spécifionsletitre (ligne 4) et construisons la première partie de la table (lignes 5–13). Puis commence une boucle de type xsl:foreachsur les élément /listeDesPays/pays(lignes 14– 24). Le résultat de la boucle est trié par ordre alphabétique du contenu de l’attribut monnaie (ligne 15), mais en éliminant les cas où cette valeur serait non-valable (test en ligne 16). Finalement nous composons une ligne de la table (lignes 17–22)en remplissant la première colonne avec le nom de la monnaie (ligne 18), la deuxième avec le nom de sa sous-unité (ligne 19), la troisième avec le code ISO centré et en police chasse fixe (ligne 20)et la quatrième colonne avec le nom complet du pays (ligne 21). La figure 10 montre le résultat HTML.
6.3. Un recueil de poèmes
Dans ce qui précède nous avons traité des fichiers relativement simples. Dans cette section,nousétudionscommentcombinerplusieursfichierssourceàl’entréeetcomment générer plusieurs fichiers à la sortie. Comme fichiers source, nous avons choisi quelques poèmes de Paul Verlaine que nous avons trouvés sur un site français à l’URL .
La communauté XML (ou SGML) a développé plusieurs DTD « standard » pour être utilisées dans leurs domaines respectifs. Mentionnons d’abord Docbook[36, 9], qui est la base du balisage de beaucoup de manuels d’informatique. Pour notre exemple nousnoustournonsplutôtverslesscienceshumaines, oùlafamilledes DTD duprojet « TEI » (Text Encoding Initiative[4, 33]) est très répandue.
FIGURE 10 – Une table montrant monnaies et pays Nous avons balisé quelques poèmes extraits du recueil Poèmes saturniens dans le fichier :
1
2
3
Poèmes saturniens (1866)4
5
6
Soleils couchants7
8
9 Une aube affaiblie
10 Verse par les champs
11 La mélancolie
12 Des soleils couchants.
13 La mélancolie
14 Berce de doux chants
15 Mon cœur qui s’oublie
16 Aux soleils couchants.
17 Et d’étranges rêves,
18 Comme des soleils
19 Couchants sur les grèves,
20 Fantômes vermeils,
21 Défilent sans trêves,
22 Défilent, pareils
23 À de grands soleils
24 Couchants sur les grèves.
25
26
27
28
29
Mon rêve familier30
31 Je fais souvent ce rêve étrange et pénétrant
32 D’une femme inconnue, et que j’aime, et qui m’aime, 33 Et qui n’est, chaque fois, ni tout à fait la même
34 Ni tout à fait une autre, et m’aime et me comprend.
35
36
37 Car elle me comprend, et mon cœur, transparent 38 Pour elle seule, hélas ! cesse d’être un problème
39 Pour elle seule, et les moiteurs de mon front blême,
40 Elle seule les sait rafraîchir, en pleurant.
41
42
43 Est-elle brune, blonde ou rousse ? ‐ Je l’ignore.
44 Son nom ? Je me souviens qu’il est doux et sonore
45 Comme ceux des aimés que la Vie exila.
46
47
48 Son regard est pareil au regard des statues,
49 Et, pour sa voix, lointaine, et calme, et grave, elle a
50 L’inflexion des voix chères qui se sont tues.
51
52
53
54
55
Nevermore56
57 Souvenir, souvenir, que me veux-tu ? L’automne
58 Faisait voler la grive à travers l’air atone,
59 Et le soleil dardait un rayon monotone
60 Sur le bois jaunissant où la bise détone.
61
62
63 Nous étions seul à seule et marchions en rêvant, 64 Elle et moi, les cheveux et la pensée au vent.
65 Soudain, tournant vers moi son regard émouvant :
66 ? Quel fut ton plus beau jour ? ? fit sa voix d’or vivant,
67
68
69 Sa voix douce et sonore, au frais timbre angélique.
70 Un sourire discret lui donna la réplique, 71 Et je baisai sa main blanche, dévotement.
72
73
74 ‐ Ah ! les premières fleurs, qu’elles sont parfumées !
75 Et qu’il bruit avec un murmure charmant
76 Le premier ? oui ? qui sort de lèvres bien-aimées !
77
78
79
80
81
Chanson d’automne82
83 Les sanglots longs
84 Des violons
85 De l’automne
86 Blessent mon cœur 87 D’une langueur
88 Monotone.
89
90
91 Tout suffocant
92 Et blême, quand
93 Sonne l’heure,
94
95
96 Je me souviens
97 Des jours anciens
98 Et je pleure ;
99
100
101 Et je m’en vais 102 Au vent mauvais
103 Qui m’emporte
104 Deçà, delà, 105 Pareil à la
106 Feuille morte.
107
108
109
Lerecueil setrouvedansun élément detype div1(lignes 2–109)et chaque poème est à l’intérieur d’un élément de type div2 (lignes 2–26, 28–52, etc.). Le titre d’un poème est saisi dans un élément de type head, où nous voyons également l’élément hi pour spécifier le type de mise en évidence (lignes 6, 29, etc.). Les stances sont délimitées par des éléments lg (ligne 8–25, 30–35, 36–41, ) et les lignes individuelles par les éléments l. Parfois, nous indiquons que nous désirons un renfoncement pour une ligne donnée à l’aide de l’attribut rend (lignes 85, 88, etc.).
Avec ces mêmes conventions, nous avons également saisi quelques poèmes du recueil Fêtes galantes dans le fichier :
1
2
3
Fêtes galantes (1869)4
5
6
Clair de lune7
8
9 Votre âme est un paysage choisi
10 Que vont charmant masques et bergamasques,
11 Jouant du luth, et dansant, et quasi
12 Tristes sous leurs déguisements fantasques.
13
14 Tout en chantant sur le mode mineur
15 L’amour vainqueur et la vie opportune,
16 Ils n’ont pas l’air de croire à leur bonheur
17 Et leur chanson se mêle au clair de lune,
18
19 Au calme clair de lune triste et beau,
20 Qui fait rêver les oiseaux dans les arbres
21 Et sangloter d’extase les jets d’eau,
22 Les grands jets d’eau sveltes parmi les marbres.
23
24
25
26
27
Les indolents28
29 Bah ! malgré les destins jaloux,
30 Mourons ensemble, voulez-vous ? 31 ‐ La proposition est rare.
32
33 ‐ Le rare est bon. Donc mourons
34 Comme dans les Décamérons.
35 ‐ Hi ! Hi ! Hi ! quel amant bizarre !
36
37 ‐ Bizarre, je ne sais. Amant
38 Irréprochable, assurément.
39 Si vous voulez, mourons ensemble ?
40
41 ‐ Monsieur, vous raillez mieux encor
42 Que vous n’aimez, et parlez d’or ;
43 Mais taisons-nous, si bon vous semble ! ?
44
45 Si bien que ce soir-là Tircis
46 Et Dorimène, à deux assis
47 Non loin de deux sylvains hilares,
48
49 Eurent l’inexpiable tort
50 D’ajourner une exquise mort.
51 Hi ! hi ! hi ! les amants bizarres !
52
53
54
55
56
Colloque sentimental57
58 Dans le vieux parc solitaire et glacé,
59 Deux formes ont tout à l’heure passé.
60
61 Leurs yeux sont morts et leurs lèvres sont molles,
62 Et l’on entend à peine leurs paroles.
63
64 Dans le vieux parc solitaire et glacé,
65 Deux spectres ont évoqué le passé.
66
67 ‐ Te souvient-il de notre extase ancienne ?
68 ‐ Pourquoi voulez-vous donc qu’il m’en souvienne ?
69
70 ‐ Ton cœur bat-il toujours à mon seul nom ?
71 Toujours vois-tu mon âme en rêve ? ‐ Non.
72
73 ‐ Ah ! les beaux jours de bonheur indicible
74 Où nous joignons nos bouches ! ‐ C’est possible.
75
76 ‐ Qu’il était bleu, le ciel, et grand, l’espoir !
77 ‐ L’espoir a fui, vaincu, vers le ciel noir.
78
79 Tels ils marchaient dans les avoines folles,
80 Et la nuit seule entendit leurs paroles.
81
82
83
Nous combinons les deux recueils à l’aide du fichier principal :
1
2
3
4
5
6 7
8 ]>
9
10
11
12
13
Divers recueils de poèmes14 Verlaine, Paul
15
16 Transcription en code TEI.2
17 Michel Goossens
18
19
20 Distributed by mg for GUTenberg
21
22
23
24 25
26
27
28 Français
29
30
31
32
33
34
35
36 Recueil de poèmes de Paul Verlaine
37
38 Michel Goossens
39 Octobre 1999
40
41
42
43 &Poèmes-saturniens;
44 &Fêtes-galantes;
45
46
47
Ce fichier définit (lignes 6 et 7) des entités externes pour insérer les deux fichiers sources (ligne 43) et (ligne 44). Nous faisons référence à la DTD XML simplifiée pour la TEI ( en ligne 2). Dans le sous-ensemble interne de la DTD, nous définissons quelques autres entités: les tirets ndash et mdash et, plus important pour le français, la ligature œ, qui, absente du codage ISO-8859-1, ne peut donc être saisie directement. Tout ce qui se trouve à l’intérieur de l’en-tête TEI correspondant à l’élément teiHeader (lignes 10–31) sera ignoré dans notre traitement ultérieur. Ce qui nous intéresse se trouvent dans l’élément text (lignes 32–46).
6.3.1. TEX comme formateur avec PassiveTEX
Sebastian RAHTZ a développé une série de feuilles de style XSL pour transformer les fichiers XML codés d’après la DTD TEI-lite en TEX et HTML[31]. java .Driver
En particulier, nous pouvons traiter le fichier contenant des objets de formatage XSLF avec PassiveTEX[29], une adaptation de TEX également par Sebastian RAHTZ qui génère du PDF. Ainso nous générons un fichier (voir figure 11).
6.3.2. Création d’ une toile de fichiers HTML
Nous nous proposons, à partir des mêmes fichiers XML contentant des poèmes de Verlaine, de créer une toile HTML (un ensemble de fichiers, un par poème, complété d’un fichier principal qui permet d’adresser tous les fichiers individuels à l’aide des liens hypertexte).
Voici le fichier de style XSL htmlsplit.xslqui gère cette transformation.
1
2
3
4 ]>
5
Recueil de poèmes de Paul Verlaine Michel Goossens Octobre 1999 1.Poèmes saturniens (1866) 1.1. Soleils couchants Une aube affaiblie Verse par les champs La mélancolie Des soleils couchants. La mélancolie Berce de doux chants Mon cœur qui s’oublie Aux soleils couchants. Et d’étranges rêves, Comme des soleils Couchants sur les grèves, Fantômes vermeils, Défilent sans trêves, Défilent, pareils À de grands soleils Couchants sur les grèves. 1.2. Mon rêve familier Je fais souvent ce rêve étrange et pénétrant D’une femme inconnue, et que j’aime, et qui m’aime, Et qui n’est, chaque fois, ni tout à fait la même Ni tout à fait une autre, et m’aime et me comprend. Car elle me comprend, et mon cœur, transparent Pour elle seule, hélas ! cesse d’être un problème Pour elle seule, et les moiteurs de mon front blême, Elle seule les sait rafraîchir, en pleurant. Est-elle brune, blonde ou rousse ? - Je l’ignore. Son nom ? Je me souviens qu’il est doux et sonore Comme ceux des aimés que la Vie exila. Son regard est pareil au regard des statues, Et, pour sa voix, lointaine, et calme, et grave, elle a L’inflexion des voix chères qui se sont tues. 1.3. Nevermore Souvenir, souvenir, que me veux-tu ? L’automne Faisait voler la grive à travers l’air atone, Et le soleil dardait un rayon monotone Sur le bois jaunissant où la bise détone. Nous étions seul à seule et marchions en rêvant, Elle et moi, les cheveux et la pensée au vent. Soudain, tournant vers moi son regard émouvant : « Quel fut ton plus beau jour ? » fit sa voix d’or vivant, 1 |
- Hi ! Hi ! Hi ! quel amant bizarre ! - Bizarre, je ne sais. Amant Irréprochable, assurément. Si vous voulez, mourons ensemble ? - Monsieur, vous raillez mieux encor Que vous n’aimez, et parlez d’or ; Mais taisons-nous, si bon vous semble ! » Si bien que ce soir-là Tircis Et Dorimène, à deux assis Non loin de deux sylvains hilares, Eurent l’inexpiable tort D’ajourner une exquise mort. Hi ! hi ! hi ! les amants bizarres ! 2.3. Colloque sentimental Dans le vieux parc solitaire et glacé, Deux formes ont tout à l’heure passé. Leurs yeux sont morts et leurs lèvres sont molles, Et l’on entend à peine leurs paroles. Dans le vieux parc solitaire et glacé, Deux spectres ont évoqué le passé. - Te souvient-il de notre extase ancienne ? - Pourquoi voulez-vous donc qu’il m’en souvienne ? - Ton cœur bat-il toujours à mon seul nom ? Toujours vois-tu mon âme en rêve ? - Non. - Ah ! les beaux jours de bonheur indicible Où nous joignons nos bouches ! - C’est possible. - Qu’il était bleu, le ciel, et grand, l’espoir ! - L’espoir a fui, vaincu, vers le ciel noir. Tels ils marchaient dans les avoines folles, Et la nuit seule entendit leurs paroles. 3 |
Sa voix douce et sonore, au frais timbre angélique. Un sourire discret lui donna la réplique, Et je baisai sa main blanche, dévotement. - Ah ! les premières fleurs, qu’elles sont parfumées ! Et qu’il bruit avec un murmure charmant Le premier « oui » qui sort de lèvres bien-aimées ! 1.4. Chanson d’automne Les sanglots longs Des violons De l’automne Blessent mon cœur D’une langueur Monotone. Tout suffocant Et blême, quand Sonne l’heure, Je me souviens Des jours anciens Et je pleure ; Et je m’en vais Au vent mauvais Qui m’emporte Deçà, delà, Pareil à la Feuille morte. 2.Fêtes galantes (1869) 2.1. Clair de lune Votre âme est un paysage choisi Que vont charmant masques et bergamasques, Jouant du luth, et dansant, et quasi Tristes sous leurs déguisements fantasques. Tout en chantant sur le mode mineur L’amour vainqueur et la vie opportune, Ils n’ont pas l’air de croire à leur bonheur Et leur chanson se mêle au clair de lune, Au calme clair de lune triste et beau, Qui fait rêver les oiseaux dans les arbres Et sangloter d’extase les jets d’eau, Les grands jets d’eau sveltes parmi les marbres. 2.2. Les indolents Bah ! malgré les destins jaloux, Mourons ensemble, voulez-vous ? - La proposition est rare. - Le rare est bon. Donc mourons Comme dans les Décamérons. 2 |
FIGURE 11 – Extrait des Poèmes saturniens et des Fêtes galantes de Paul Verlaine.
Cette sortie PDF est générée à partir d’un fichier balisé en XML utilisant la DTD TEI, transformé en objets de formatage par des feuilles de style XSL. Ces objets sont finalement traduits avec PassiveTEX en PDF avec la commande pdftex "&fotex" .
6 xmlns:xsl=";
7 xmlns:date=""
8 xmlns:xt=";
9 extension-element-prefixes="xt">
10
11
12
13 verlaine
14
15
20
21
22
23 Dernière modification : Michel Goossens,
24
25
27 28
29
30
31
32
33
34
35
36
37 30 Oct 1999
38
39
40
41
42
43
44
45 .
46
47
48
49
50
51
52
Monter | 56 57 Précédent 58 59 60 Précédent 62 63 | 65 66 Suivant 67 68 XML et XSL : un nouveau départ pour le web 71 69 Suivant 71 72 |
75
76
77
78
79
80
85
86
87
88
89
90
91
92
93
94
95
96
97
98
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127 128
129
130 131 132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
***** Début de l’élément non-prévu
152
153
Fin de l’élément non-prévu ******
154
155
156
Cette feuille de style XSL est assez complexe et nous allons en examiner les points les plus importants. D’abord la ligne 7 introduit le domaine nominal date et la ligne 8 le domaine nominal xt, qui, de plus, est déclaré comme étant un préfixe d’élément d’extension. Ceci signifie que le code préfixé est une extension du processeur que nous utilisons (xt le cas échéant) et qu’il n’y a aucune garantie que notre feuille de style marche avec un autre processeur (comme lotusxsl), sauf si ce dernier inclut un support pour les mêmes fonctions ou éléments. Les extensions pour les processeurs se trouvent dans leurs documentations respectives (les sections Extension Functions et Multiple Output Documents dans [5] dans notre cas).
Nous utilisons la fonction d’extension pour générer la date (ligne 29), tout en nous assurant avant que les fonctions de date sont bien disponibles (lignes 25–26). Si elles ne le sont pas nous écrivons la chaîne de caractères « 30 Oct 1999 » (ligne 38). Les lignes 29–34 montrent quelques-unes des fonctions pour manipuler les chaînes de caractères (voir la section E pour une liste et un renvoi à la section de la spécification XPathoù elles sont décrites). Ces même lignes montrent également comment utiliser les variables XSL.
Nous avonsmodularisénotre feuillede style XSL en définissantdes modèles nommés (footer en lignes 21–42, header en lignes 44–47 et xrefpanelen lignes 50-76).
En ligne 11, nous déclarons que nous désirons écrire un fichier HTML ; le domaine nominal par défaut sera donc HTML. Ceci nous permet d’introduire les balises HTML sans utiliser de préfixe. Pour traiter correctement les ligatures mdash (—), ndash (–) et oelig (œ) nous choisissons le codage UTF-8.
XML et XSL : un nouveau départ pour le web 73
Le traitement effectif commence avec le modèle pour la racine à la ligne 86. Nous construisonsuntitreglobalenutilisantlabaliseTitlePartdansledocumentsource (ligne89)etintroduisonsunlienversunfichierdestyle CSS (ligne90).
Nous générons le titre pour le corps du document et nous y ajoutons l’auteur et la date du document (lignes 93–95).
Nous effectuons d’abord une boucle for-eachsur les éléments de type div1 (lignes 96–104). À l’intérieur nous appelons d’abord le modèle nommé header (ligne 97), qui génére un numéro de section basé sur les éléments de type div1 déjà rencontrés (ligne 45) puis extrait la valeur de l’élément enfant head de div1 (ligne 46).
Ensuite, nous commençons une liste non-numérotée (ligne 98) qui contient une entrée pour chaque occurrence d’un élément div2 (boucle for-each en lignes 99– 102). Pour un élément de type div2 donné, nous mettons la valeur de la variable poemname(ligne 100)enutilisantla fonctiongenerate-id()qui associeun numéro de référence interne unique au nœud courant. Cette valeur est utilisée à la ligne 101 dansla référence href del’ancredetypea quilielefichier principal (défini par la variable MasterFile en ligne 13) que nous sommes en train d’écrire aux fichiers contenant les poèmes individuels, et dont le nom est construit à partir de cet identificateur unique précédé de la valeur de la variable MasterFile (voir l’attribut select de la ligne 100).
Après avoir traité tous les éléments div1 et div2 nous terminons le fichier principal par un appel au modèle nommé footer (ligne 105). Ce modèle est défini en lignes 21–42 et génère quelques balises HTML avec du texte (lignes 22–23 et 40–41) en y insérant la date (voir ci-dessus pour une discussion de l’utilisation des fonctions d’extension).
Finalement, ligne 108, nous initions la génération des fichiers individuels avec les poèmes en sélectionnant le traitement des éléments de type div2.
Les fichiers avec les poèmes sont générés dans le modèle qui traite le motif div2 (lignes 111–128) et dont le traitement est initié en ligne 118.
Nous commençons (ligne 112) par définir une variable file qui utilisera la même procédure qu’en ligne 100 pour calculer le nom à donner à chaque nœud de type div2 traité. La norme XSLT garantit que chaque nœud dans l’arborescence du document complet aunidentificateur uniquegénéré à l’aidedela fonctiongenerate-id, ainsi nous sommes certains que les noms obtenus en ligne 100 et ici pour nommer les fichiers via la variable file seront identiques.
La ligne 113 crée un document HTML ayant un nom donné par la valeur de la variable file définie en ligne précédente et utilise la codage UTF-8. La possibilité de créer des fichiers étant une extension propre à xt, nous utilisons le domaine nominal xt: défini en ligne 8 pour l’élément xt:document(lignes 113 et 127).
Le reste de la construction des fichiers contenant un poème est assez facile. La ligne 116génère un titrepour l’en-tête HTML. La partiela plus intéressanteest en ligne120, où nous faisons appel au modèle nommé xref. Elle est définie en lignes 49–78. Elle a un paramètre home qui donne le nom de la page principale et sa valeur est définie en ligne 121 en utilisant la valeur de la variable MasterFile.
Le modèle nommé xrefpanel utilise une table pour mettre à la tête de chaque fichier des liens qui permettent à l’utilisateur de naviguer d’un fichier au précédent, au suivant et de remonter au fichier principal. Cette dernière possibilité est facile à traiter puisque le fichier principal est trivial à adresser (ligne 54). Par contre lorsque nous nous trouvons au début de la séquence div2 ou à sa fin les tests en lignes 56 et 65 ne permettent plus de trouver le précédent, respectivement, le suivant. En effet les axes preceding-sibling et following-sibling, qui trouvent des nœuds au même niveau que l’élément courant, ne peuvent sortir de l’élément parent. Il nous faut des tests un peu plus complexes, c’est-à-dire : nous devons sauter d’un élément div1 à un autre pour s’assurer que nous trouvons bien toujours tous les types d’élément précédent ou suivant. C’est ce que nous faisons dans les lignes 60– 61 et 69–70. Par exemple, en ligne 61 nous savons (par le test de la ligne 56) que nous n’avons plus d’élément div2 précédent l’élément courant à l’intérieur de l’élément div1 qui est l’ancêtre de l’élément courant. Donc nous devons d’abord monter d’un niveau pour trouver un élément de type div1 (ancestor::div1). Puis nous choisissons parmi les nœuds de type div1 précèdents le nœud ancêtre le plus proche (preceding-sibling::div1[1]). Pour ce nœud nous sélectionnons le dernier de ses enfants de type div2 (/div2[last()]).C’est ce nœud, s’il existe, qui détermine l’adresse du fichier précédent dans le fichier HTML pour l’élément div2 courant. La même logique (dans la direction opposée following)s’applique pour déterminer si un élément suivant existe au-delà de l’ancêtre div1 de l’élément courant.
Finalement en ligne 77 nous définissons la cible de l’ancre et nous écrivons le titreen sélectionnant la valeur de l’élément head à l’intérieur de div2.
Nous retournons en ligne 123 qui envoie le texte du poème pour traitement par les autres modèles (lignes 130–148). Finalement chaque fichier aura une partie adresse avec la date, etc. générée à l’aide du modèle nommé footer déjà mentionné.
Le résultat de l’application de la feuille de style au fichier source
XML est montré à la figure 12. Nous y montrons les hyperliens présents dans ledocument principal par des flèches. Deplus chacun des sept fichiers avec les poèmes individuels contient des liens vers le poème précédent et suivant et pour remonter au fichier principal. Ces liens sont mis en évidence par des étiquettes Monter, Précédentet Suivant à la première ligne de chaque fichier (sauf aux deux extrémités). Nous avons entré la commande: java .Driver
7. Autres normes W3C basées sur XML
XML est la norme de base qui permet de définir d’autres applications dans plusieurs domaines d’activité. Parmi les plus intéressantes pour nous, signalons:
– XLink [47]: les liens généralisés;
– XPointer[49]: l’adressage généralisé;
– SVG[43]: les graphiques vectoriels ajustables;
– XHTML [44, 45]: un langage HTML modulaire;
– XML Schema[50, 51]: une description des structures et types de données.
Nous allons regarder quelques-uns plus de détails. Il faut savoir toutefois qu’aucun de ces travaux n’est actuellement finalisé et ce qui suit ne correspondra peut-être pas à 100% à la syntaxe qui sera finalement adoptée.
7.1. Modèle XLink pour définir des hyperliens
XLink [47] et XPointer[49] proposent une structure généralisée, efficace et compacte pour représenter des liens internes ou externes à un document. XLink se limite à la définition abstraite des ressources, unités d’information ou de service adressables par un lien, laissant les détails de présentation aux fichiers de styles ou autres mécanismes semblables.
XLink et XPointer se sont inspirés de trois normes existantes:
HTML: définit plusieurs éléments pour gérer les liens et généralise l’utilisation de la notion d’URL (Uniform Resource Locator) qui pointe en majeure partie vers des objets globaux, même si un certain adressage interne est possible (association d’un identificateur à un élément, régions dans des images graphiques);
Hytime: (Hypermedia Time-based Structuring Language) est une application SGML normalisée par l’ISO[37] qui propose un formalisme standardisé pour exprimer des liens entre textes et objets multimedia (images, son, etc.), pour localiser de façon dynamique dans le temps et l’espace les éléments liés, pour accéder aux propriétés de chaque ressource (« ancre » dans la terminologie de HTML) et pour donner un aperçu de la ressource en question (résumé textuel, extrait sonore, image d’un film, etc.);
TEI: (Text Encoding Initiative) est une application SGML développée par plusieurs associations des sciences humaines[4, 33]. Dans le domaine de l’hypertexte il définit une syntaxe formelle pour spécifier la location de données structurées, graphiques et autres types de données, et propose des structures pour créer des liens et des collections de liens à partir de ces ressources.
Un lien exprime une relation entre des ressources. Une ressource peut être n’importe quelle location qui est adressée par le lien. Notons que la nature exacte de la relation entre ces différentes ressources dépend de l’application qui traite le lien ainsi que de l’information sémantique fournie par l’utilisateur.
XLink compte plusieurs types de liens. XPointer, qui est basé sur XPath et s’inspirede l’initiative TEI introduit des méthodes sophistiquées pour localiser les ressources.
Pour permettre aux applications de reconnaître les liens, on définit des éléments et attributs dans le domaine nominal de XLink, par exemple :
En fait, cet élément A correspond à l’ancre HTML. Si nous nous trouvons à l’intérieur du domaine nominal xlink, nous pouvons déclarer un lien similaire par une définition simplifiée:
1
2 title="Liste des pays" show="new" actuate="user">
3 Liste des pays (à jour au 22 octobre 1999)
4
Tout élément peut être transformé en un lien en utilisant l’attribut xlink:type.
7.1.1. Attributs
XLink permet de caractériser les différentes composantes d’un lien à l’aide d’attributs:
href URI identifiant une ressource;
from chaîne de caractères (par exemple un attribut de type ID) identifiant la ressource qui a activé le lien;
to chaîne de caractères (par exemple un attribut de type ID) identifiant la ressource qui est la destinationdu lien; fromet to sont les deux extrémités d’un arc;
show comportement de la ressource pointée; il existe trois options:
new montrer la ressource pointée dans une nouvelle fenêtre en lais-
sant le contexte actuel intact;
parsed intégrer le contenu de la ressource pointée dans le document actuel en l’interprétant comme du XML ;
replace remplacerlecontexteactuel aveclecontenu dela ressourcepointée (c’est ce qui s’utilisele plus souvent sur la toile actuellement);
actuate initialisation du lien; il existe deux options:
user le lien doit être traversé uniquement quand une requête explicite est reçue par l’application (ce comportement est celui de HTML où vous devez cliquer explicitement sur un lien avec la souris pour l’activer);
auto l’application traversera le lien automatiquement quand elle croit que l’utilisateur l’a atteint (par exemple si le pointeur passe par dessus); role attribut sémantique qui décrit à l’aide d’une chaîne de caractères son rôle générique (sa « signification », p.ex. poème); toutes les ressources qui participent à un lien peuvent être caractérisées par leur propre rôle;
title texte décrivant le lien en question.
Cette description permet de mieux comprendre l’exemple du lien simple donné auparavant.
7.1.2. Différents éléments de type link Il existe plusieurs types de liens:
Liens simples
Un lien simple ressemble beaucoup aux éléments A de HTML ou XREF du projet TEI. Un exemple de la définition d’un lien simple et de son utilisation suivent:
| |
href CDATA | #REQUIRED |
role CDATA | #IMPLIED |
title CDATA | #IMPLIED |
show (new|parsed|replace) | "replace" |
actuate (user|auto) | "user" |
>
Pour transformer un élément arbitraire en lien simple on déclare:
xmlns:xlink | CDATA #FIXED "; |
xlink:type | (simple|extended|locator|arc) #FIXED "simple" |
xlink:href | CDATA #REQUIRED |
xlink:role | CDATA #IMPLIED |
xlink:title | CDATA #IMPLIED |
xlink:show | (new|parsed|replace) "replace" |
xlink:actuate (user|auto) "user"
>
Le lien simple introduit une relation entre deux ressources, le texte contenant le lien en question et sa destination. Pour un lien simple la description de la destination du liensetrouve toujours àl’intérieurdudocumentsource:ils’agitd’unlien« in-line » ou interne.
Un exemple d’utilisation serait le suivant:
Pour les curieux il est intéressant de consulter
la liste des pays (à jour au 22 octobre 1999).
Liens étendus
Un lien étendu peut mettre en évidence des relations entre n’importe quel nombre de ressources et, de plus, il peut être spécifié dans un document qui ne coïncide avec aucune des ressources(les liens peuvent être « out-of-line» ou externes). Ceci permet de générer des liens pour des supports non-modifiables comme les CDROM ou de filtrer des liens à la demande.
Voici une définition explicite d’un lien étendu:
role | CDATA | #IMPLIED |
title | CDATA | #IMPLIED |
showdefault | (new|parsed|replace) | #IMPLIED |
actuatedefault | (user|auto) | #IMPLIED > |
Voici une déclaration de lien étendu pour un élément arbitraire:
xmlns:xlink | CDATA #FIXED "; |
xlink:type | (simple|extended|locator|arc) #FIXED "extended" |
xlink:href | CDATA #REQUIRED |
xlink:role | CDATA #IMPLIED |
xlink:title | CDATA #IMPLIED |
xlink:show | (new|parsed|replace) "replace" |
xlink:actuate (user|auto) "user"
>
Voici deux exemples d’utilisation de ces liens étendus. D’abord, une instance explicite d’un lien de ce type:
puis avec un élément déclaré comme un lien étendu:
Éléments de localisation
Un « localisateur » (locator) est contenu dans un lien étendu pour permettre la définition des ressources qui participent au lien. La ressource externe est spécifiée à l’aide de l’attribut href. Plusieurs éléments de localisation peuvent être associés à un lien. Chaque ressource externe peut avoir sa propre sémantique par rapport au lien et cette sémantique (les attributs role et title) est spécifiée dans les éléments de localisation.
La déclaration d’un localisateur explicite est la suivante:
id | ID | #REQUIRED |
href | CDATA | #REQUIRED |
role | CDATA | #IMPLIED |
title | CDATA | #IMPLIED > |
Pour utiliser un élément quelconque comme élément de localisation, on déclare:
xmlns:xlink | CDATA #FIXED "; |
xlink:type | (locator) #FIXED "locator" |
id | ID #REQUIRED |
xlink:href | CDATA #REQUIRED |
xlink:role | CDATA #IMPLIED |
xlink:title | CDATA #IMPLIED |
>
Dans un document, nous pouvons alors écrire:
Plus simplement, un élément de localisation peut être utilisé comme suit:
Mon premier poème.
Éléments de type arc
Un « arc » est contenu dans un lien étendu pour définir comment le traverser. Plusieurs éléments de type arc peuvent être associés à un lien. Les autres attributsde ce type d’élément se comportent comme dans les cas précédents.
La déclaration d’un lien explicite de type arc suit:
from IDREF #REQUIRED to IDREF #REQUIRED >
Si nous voulons transformer un autre élément en lien étendu de type arc nous pouvons écrire:
xmlns:xlink | CDATA #FIXED "; |
xlink:type | (arc) #FIXED "arc" |
xlink:from | IDREF #REQUIRED |
xlink:to | IDREF #REQUIRED |
show | (new|parsed|replace) "replace" |
actuate | (user|auto) "user" > |
Voici deux exemples d’utilisation:
Groupes de liens étendus
Un groupe de liens étendus est un document XML qui peut contenir une série de liens étendus ou d’autres groupes de liens étendus. Cette facilité est intéressante pour accéder à des ressources adressables à l’aide d’une liste de liens stockée dans un autre document.
Dans ce cas, il est souhaitable d’utiliser un élément de type groupe de liens étendus, un lien étendu spécial, pour y enregistrer une liste de liens vers d’autres documents qui, ensembles, forment un groupe de documents liés entre eux. Chaque document de ce type est identifié par un élément de type document de liens étendus, cas spécial d’élément de localisation.
Des exemples de déclaration de groupe de liens étendus dans un document de liens étendus, montrant les attributs possibles liés à xlink sont donnés ci-après. En particulier, la valeur de l’attribut xlink:typedoit être group ou document,respectivement.
Puisqu’un groupe deliens étendus peut rediriger une application vers un autredocument,qui peut àsontour contenir d’autresgroupesdeliensétendus,ilestpossiblede se trouver dans une boucle infinie. Ainsi l’attribut steps de type numérique devrait indiquer combien de niveaux de liens seraient à traiter. L’utilisation de cet attribut fort utile n’est pas obligatoire.
7.2. XPointer ou les pointeurs généralisés
Un localisateur pour une ressource consiste habituellement en une référence URI. Pour adresser un fragment de ressource, on peut utiliser un pointeur généralisé de type XPointer.
Pour un document XML, XPointer travaille sur le même arbre qu’XSL et les expressions XPath sont la base de la syntaxe XPointer, qui sélectionne certaines parties de l’arbre, par exemple en indiquant leur relation structurelle par rapport à certains autres nœuds. Des pointeurs de type XPointer peuvent agir de façon itérative en exprimant des sélections multiples en chaîne, chacune agissant sur la partie de l’arbre sélectionnée au stade précédent.
La sélection se fait à l’aide d’axes et de prédicats (comme avec XPath).
Les identificateurs de fragments XPointer existent sous trois formes: deux courtes et une complète:
– par compatibilité avec HTML, la première forme courte utilise seulement le nom simple d’un élément ;
– la deuxième forme courte localise un élément par navigation par étapes à par-tir de l’élément racine en utilisant une séquence de nombres séparés par des signes « / »;
– la forme complète permet d’adresser n’importe quel fragment d’un documentXML. Elle se base directement sur le langage XPath qui a été étendu pour permettre la modélisationde sélections utilisateurs et pour s’assurer qu’une pointeur XPointer retourne une seule partie contiguë d’un document.
Les extensions à XPath sont énumérées brièvement ci-dessous.
– La spécification de règles pour initialiser le contexte d’évaluation.
– Deux nouveaux axes pour modeler le choix utilisateur.
L’axe range::adresseune partied’undocument entreun débutet une fin, par exemple :
"id(’b37’)/range::child[1],following-sibling[2]" sélectionne la région du document allant du premier au troisième élément enfant de l’élément identifié avec l’ID « b37 »
"range::id(’section3.1’)/p[last()-1],id(’section3.3’)/p[2]" sélectionne tout à partirdel’avantdernier paragraphe (p[last()-1])del’élémentayantl’identificateursection3.1jusqu’audeuxièmeparagraphe (p[2]) de l’élément ayant l’identificateur section3.3.
L’axe string::adresse une partie d’un document à l’aide d’une chaîne de caractères, par exemple si l’élément identifié par l’ID « b37 » contenait la chaîne de caractères « Association GUTenberg » le pointeur XPointer
"id(’b37’)/string::5,’’"
localisera le point précédant la cinquième lettre (« c »). Avec le pointeur XPointer
"string::4,’Association GUTenberg’,15,2"
localisera « Te » dans la troisième occurrence de la chaîne de caractères « Association GUTenberg ». Les balises sont ignorées, c’est-à-dire : si le document contenait la chaîne « AssociationGUTenberg» le pointeur XPointer
"string::1,’ion GUT’,-3,3" localisera « GUT ».
– De nouveaux chemins de localisation.
"/" désigne la ressource complète.
La fonction id() localise l’élément dans la ressource avec un attribut de type id et avec la valeur indiquée. Par exemple:
"id(’b37’)"
La fonction here() permet la localisation du nœud de l’élément qui contient directement un pointeur XPointer (dans le texte ou comme attribut). La fonction origin() permet l’adressage relatif à des liens externes comme ceux définis dans XLink.
– Une nouvelle fonction unique() pour les prédicats. Elle retourne la valeur booléenne « vrai » si la liste courante du nœud contexte contient exactement un nœud.
7.3. SVGou l’adieu àJPEG,GIFetPNG?
SVG[43] (Scalable Vector Graphics ou « graphique vectoriel ajustable») combine les avantages des langages PGML (Precision Graphics Markup Language d’Adobe) et VML (Vector Markup Language de Microsoft) et propose un seul langage « simple » pour inclure des informations graphiques dans les fichiers XML de façon portable.
SVG peut être utilisé dans des fichiers indépendants pour représenter les dessins. Ceux-ci peuvent être créés par des applications spécialisées et inclus dans les pages web par exemple par une référence XPointer. Par ailleurs on peut également inclure directement des fragments SVG dans les sources XML.
Voici un exemple de fichier SVG, qui dessine divers rectangles et ellipses.
1
2
3
4 5 Exemple SVG :
6 rectangles et ellipses
7
8
9
10 style="stroke:lime; stroke-width:6" />
11
12 style="stroke:blue; fill:none; stroke-width:3;
13 stroke-dasharray:10 5;stroke-linejoin:miter" />
14
15
16 17
18
20
21 style="stroke:blue; fill:none; stroke-width:3;
22 stroke-dasharray:6 3;stroke-linejoin:miter" />
23
24
25
26
27 style="stroke:lime; stroke-width:6" />
28
29
La figure 13 montre le résultat de l’interprétation de ces instructions par un programme de visualisation SVG[19].
Il est certain que le langage SVG va jouer un rôle très important dans le monde internet comme format graphique portable.
7.4. XML Schema: au delà de la DTD
Le but principal de XML est l’échange de données d’une base de données à une autre ouentreune basededonnées et uneautrereprésentation propreà une autreapplication, un document électronique étant considéré comme une forme spécifique d’une base de données. La spécification XML Schema devrait faciliter la mise en œuvre de ces échanges.
La DTD informe le destinataire d’un document quels éléments, entités, etc. le document en question peut contenir sous une forme facile à exploiter par un programme informatique. Grâce aux mots-clés et définitions dans la DTD, un programme d’édition peut analyser un document XML pour y repérer certains éléments ou pour indiquer à l’utilisateur si toute l’information marquée comme obligatoire est bien présente.
Les schémas XML vont plus loin que la DTD dont une des limitations majeures est de ne pas être (pour des raisons de compatibilité SGML) sous forme d’un document XML. Aussi, les nombreux outils XML disponibles sur l’internet ne peuvent être utilisés pour analyser, composer ou déveloper les DTD. Néanmoins, se limiter à réécrire l’information présente dans une DTD en XML ne serait qu’une amélioration mineure. Plus important est la possibilité de pouvoir spécifier le type de données qu’un élément peut contenir ainsi que leurs valeurs possibles[51].
La recommendation XML Schema[50]indique également comment structurer l’information pour combiner des données individuelles en entités ou comment combiner lesdonnées venantdeplusieurs sources.Elleproposeuneapproche structurellepour documenter un Schema à l’aide de commentaires structurés, ce qui permettra aux
FIGURE 13 – Quelques formes graphiques simples dessinées avec SVG
programmes informatiques (p.ex. les éditeurs structurels XML) d’assister l’utilisateur en l’informant des caractéristiques d’un type d’élément. Ces commentaires faciliteront la gestion des différentes versions et mises-à-jour d’un schema. Finalement des principes de conformité garantiront que les schémas venant des différents points du globe pourront fonctionner ensemble.
Conclusions
Dans cet article, nous avons d’abord parlé des problèmes liés au langage HTML. Ensuite, nous avons expliqué pourquoi nous pensons que l’introduction de XML permettra la mise en place d’un environnement sur l’internet véritablement global pour le traitement, l’échange et le stockage de l’information électronique.
Nous avons passé en revue les principales composantes du langage XML en nous basant surtout sur des exemples qui ont mis en évidence comment XML « démocratise » l’internet en permettant à chacun de définir son propre langage grâce aux noms d’attributs et d’éléments faciles à comprendre et à mettre en œuvre. Ainsi les internautes chinois, russes ou français pourront-ils saisir leurs documents en se servant de balises dans leur langue maternelle et être sûrs qu’elles seront adaptées au domaine d’application en question (finance, chimie, biologie, commerce électronique, automobile, etc.).
La deuxième partie de l’article a traité du langage XSL pour transformer les documents XML en plusieurs formats. Nous avons montré comment obtenir une sortie LATEX, d’abord en transformant les éléments XML directement en commandes LATEX équivalentes, ou en se servant d’une transformation en objets de formatage XSL, interprétés alors par PassiveTEX, une version spécifique de moteur TEX, ou FOP, générant du PDF directement. Nous avons également abordé le problème de la génération de fichiers HTML et la création d’une toile d’hyperliens reliant les différentes parties entre elles.
Pour ceux qui sont moins intéressés à la présentation de l’information qu’à sa manipulation, nous avons expliqué comment transformer l’information en plusieurs formes plus adaptées aux bases de données.
Nous espérons que, grâce aux exemples détaillés, chacun pourra utiliser ces techniquespour commencer àdévelopper sespropresfeuillesdestyleetainsipleinement profiter des avantages de la familles des langages extensibles.
Dans les dernières pages nous avons brièvement décrit quelques autres langages. Les deux premiers, XLink et XPointer, définissent des liens hypertextes beaucoup plus flexibles que ceux disponibles en HTML. SVG deviendra sans doute très vite le format graphique préféré de l’internet. XML Schema définit le contenu structurel et les types de données pour une famille de documents XML. Toutefois, il est important de souligner que la normalisation de ces langages n’est pas aussi avancée que XSL, CSS ou le DOM (voir à la page 155 l’article de François ROLE et Philippe VERDRET).
Annexes
La section A présente une DTD qui s’inspire de LATEX et qui permet une traduction facilitée de documents saisis d’après cette DTD en LATEX. De façon plus générale, l’utilisationdecette DTD offreuneapproche quasiautomatiquepour sauvegarderdesdocuments LATEX en XML et ainsi pleinement profiter de tous les outils XML disponibles sur l’internet.
Les sections B à E présentent les règles de productions, instructions et fonctions décrites dans les recommandations des domaines nominaux, XPath et XSLT. Ils permettent de connaître relativement facilement la syntaxe de ces éléments mais pour plus dedétails le lecteur doit évidemment se référer aux textes des recommandations en question.
La section F propose une table avec des équivalents français pour certains termes techniques XML.
Pour information et sans commentaires, la section G montre une version de la feuille de style XSL utilisée pour traduire la norme XML en LATEX.
A. LATEX et XML
A.1. Une DTD pour LATEX
Notre intention est de disposer d’une DTD XML qui permette de modéliser relativement facilement des documents initialement balisés en LATEX. Pour limiter la complexité, nous ne proposons pas une DTD qui englobe toutes les fonctions de LATEX, y compris celles du processeur mathématique de TEX. Nous nous bornons à évoquer l’approche à suivre avec un problème de ce type.
Ci-dessous, nous montrons la DTD qui réalise en large partie les commandes et environnements structurels de LATEX en y ajoutant quelques extensions pour mieux tirer profit des possibilités de XML. Par exemple, nous associons à presquetous leséléments unidentificateur(id enligne3),une classe(class enligne 4), un style (style en ligne 5) et un langage (xml:langen ligne 7), le tout encapsulé à l’entité paramètre basic (ligne 8).
Pour modulariser la feuille de style, nous définissons des entités paramètres pour chaque type de commande ou environnement (lignes 10–27). Il faut aussi remarquer que nous permettons l’extension de cette DTD par l’utilisateur par l’inclusion d’entrées ayant le suffixe .new (p.ex. en ligne 10, etc.). En redéfinissant une de ces entités dans le sous-ensemble interne de la DTD, l’utilisateur peut introduire ses propres éléments dans la structure du document. Un exemple de l’utilisation de ce procédé est dans le fichier (voir page A.1) où en ligne 9 nous introduisons un nouvel élément footnote dans l’entité paramètre . Nous devons aussi déclarer l’élément dans la DTD (voir ligne 10). Il faut évidemment faire attention à ce que le modèle de contenu (la structure de la DTD) reste valable. C’est justement dans ce but que les éléments sont considérés par groupes ettraitéspar desentitésdifférentes.Dansnotrecas,l’entitéinlineregroupe des éléments qui peuvent être utilisés à l’intérieur d’un paragraphe (voir la ligne 19 du fichier minilatex.dtdci-dessous). Nous y voyons également comment la partie extensible (l’entité )est introduiteà l’aided’un appel d’entitéparamètre au bout de la déclaration de l’entité paramètre le reste du fichier, nous reconnaissons facilement l’équivalent XML des commandes et environnements LATEX. Nous mentionnons en particulier l’inclusion de graphiques à l’aide du type d’élément includegraphics, où les attributs déclarés en lignes 95–100 correspondent directement aux arguments de la commande \includegraphics de LATEX[14, 23]. Pour l’environnement tabular de LATEX, nous déclarons un élément tabular qui a un modèle de contenu (lignes 104–116) très proche de la syntaxe LATEX.
1
2
3
4 class CDATA #IMPLIED
5 style CDATA #IMPLIED">
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 class CDATA "article">
33
34
35
36
37 38
39
40
41
42
43
44
45
46 47
48 49
50
51
52 |
| (#PCDATA|%inline;|par)*> |
53 |
| %basic;> |
54 |
| (#PCDATA|%inline;|par)*> |
55 |
| %basic;> |
56
57
58
59 |
| ((term*,item*)+)> |
60 |
| %basic;> |
61 |
| ((term*,item*)+)> |
62 |
| %basic;> |
63 |
| ((term*,item*)+)> |
64 |
| %basic;> |
65 |
| (#PCDATA|%inline;)*> |
66 |
| %basic;> |
67 |
| (#PCDATA|%inline;|par|%likepara;)*> |
68 |
| %basic;> |
69
70
71
72
73
74
75
76 77
78 79
80
81
82
83
84 name CDATA #REQUIRED>
85
86
87
88
89 90
91
92
93
94
95 file CDATA #REQUIRED
96 width CDATA #IMPLIED 97 height CDATA #IMPLIED 98 bb CDATA #IMPLIED
99 scale CDATA ".5"
100 angle CDATA #IMPLIED>
101
102
103
104
105
106 preamble CDATA #REQUIRED
107 width CDATA #IMPLIED
108 border CDATA #IMPLIED>
109
110
111
112
113
114 rowspan CDATA "1"
115 colspan CDATA "1"
116 align (left|center|right) "center">
117
118
119
120 xml:space (default|preserve) ’preserve’>
121
122
123 xml:space (default|preserve) ’preserve’>
124
125
126
127
128
129
130
131 132
133
134
135
136 137
138
139
140 |
| "stitle, (par|%likepara;|%floats;)* "> |
141 |
| (#PCDATA|%inline;)*> |
142 |
| %basic;> |
143 |
| (%sect;, (chapter|section|subsection|subsubsection)*)> |
144 |
| %basic;> |
145 |
| (%sect;, section*)> |
146 |
| %basic;> |
147 |
| (%sect;, subsection*)> |
148 |
| %basic;> |
149 |
| (%sect;, subsubsection*)> |
150 |
| %basic;> |
151
152
153
154 155 156
157
158
159
160
161
162
163
164
165
166
167 ;
168 ]]>
169
170
171
172 ;
173 ]]>
174
175
176 ">
177 178
179
Nous avons pris soin de ne pas lier cette DTD directement à un balisage des mathématiques en utilisant le formalisme de TEX, mais nous avons laissé la porte ouverte à un balisage en MathML (lignes 162–168 pour LATEX, 169–173 pour MathML). Le choix entre les deux syntaxes est géré par la valeur des entités paramètres LaTeXmath (défaut INCLUDE, voir ligne 164) et MathML (défaut IGNORE, voir ligne 169). C’est la valeur de ces deux entités qui décide si les sections conditionnelles qu’elles contrôlent (lignes 166–168 pour LaTeXmath et lignes 171–173 pour MathML) seront incluses ou pas.
Nous avons défini deux DTD séparées pour traiter ces cas. Voici un premièr fichier DTD latexmath.dtdpour exprimer les structures mathématiques à la TEX:
1
2 3
4
5
6 |
| (#PCDATA)> |
7 |
| %all;> |
8 |
| (#PCDATA)> |
9 |
| %all;> |
10 |
| (#PCDATA)> |
11 |
| %all;> |
L’approche MathML est encapsulée dans la DTD latexmml.dtdsuivante:
1
2
3
4 5
6
7
8
9
10 number (yes|no) "yes">
11
12
13
14
15
16 17
18 19
20 21
22 23
24
25
26 27
28
29
30
31
32
33
34 35
36 37
38
39
40
41
42
43
44 ;
45 ;
46 ;
47 ;
48 ;
49 ;
50 ;
51 ; 52 ;
53 ;
54 ;
55 ;
56 ;
57 ;
C’est l’utilisateur qui définit s’il veut baliser les parties mathématiques de son document dans l’un ou l’autre de ces deux formalismes en chargeant, au moment de la compilation, la première ou la deuxième DTD.
Regardonsmaintenantcomment nouspouvonsutiliserles DTD introduitesci-dessus. Nous présentons un exemple de document multilingue LATEX (basé en partie sur les exemples de la section 9.2 du The LATEX companion[13]) .
1
2
3
4
5
6
7
8
9 10
11 ]>
12
13
14
The &LaTeX; DTD and multiple languages15 Michel Goossens
16 Partly from an example in The &LaTeX; Companion
17
18 August 4th, 1998
19
20
21
22 The basic principles
23
24 This is an example input file. We start in English to show the
25 principle. You should especially pay attention that we have used
26 slightly different notation for some of the common &LaTeX; constructs,
27 such as the dashes, which come in three sizes: an intra-word dash, a
28 medium dash for number ranges like 1&endash;2, and a punctuation
29 dash&emdash;like this. Text can be emphasized as shown
30 here. An ellipsis is made with &dots; FootnotesThis
31 is a simple footnote.It can also contain par 32 elements. are tricky constructs, since one must be 33 careful not to nest them.
34
35
36 Dealing with special characters
37
38 XML has a different set of reserved characters than &LaTeX;, in
39 particular, when you want to use any of the three characters
40 , ,
41 and ]]>, you should enter them as 42 \&, \<, and 43 \>, respectively.
44
45
46
47 &LaTeX; and mathematical formulae
48
49 &LaTeX; and a fortiori &TeX; are very good at typesetting
50 mathematical formulae, like
51 or 52 x^{2n} + y^{2n} > x’]]> or 53 .
54 Do not forget that for reasons of consistency, if you want to refer to
55 a variable in one of the formulae, such as the symbol
56 x, you must also use math mode in the text.
57
58
59
60
61 Beispiel eines Textes in deutscher Sprache
62
63 Eine EPS Abbildung
64
65 Dieser Abschnitt zeigt, wie man eine PostScript-Abbildung 66 in ein Dokument einbinden kann.
67 Abbildung wurde mit dem Befehl
68
69
70 71 in den Text aufgenommen.
72
73
74
75
Ein EPS Bild76
77
78
79 Beispiel einer Tabelle
80 Die Tabelle auf Seite zeigt eine Tabelle.
82
83
98
99
100
101 Continuation du texte en français
102
103 Traiter les listes
104
105 Les listes sont utilisées fréquemment pour structurer ou mettre
106 en évidence certains éléments d’un document (voir ).
107
108
109 Ceci est le premier élément d’une liste non-ordonnée. Chaque élément 110 de ce type de liste est précédé d’un signe distinctif, comme une 111 puce, un tiret, etc.
112
113 Ce second élément de la même liste contient une liste de 114 description imbriquée.
115
116 XML
117 Meta langage pour définir des classes de documents
118 XLL
119 Langage pour définir des hyperliens entre différentes
120 parties de documents XML
121
122 Nous continuons notre texte à l’intérieur de la première liste.
123
124
125
126
127
128
129 Adobe Inc. PostScript Handbuch (2. Auflage)
130 Addison-Wesley (Deutschland) GmbH, Bonn, 1991.
131
132
133 Michel Goossens. Personnaliser les listes &LaTeX;.
134 Cahiers GUTenberg, 17:32&endash;48, mai 1994.
135
136
137
138
Dans ce fichier source, nous remarquons en particulier qu’implicitement nous utilisons la notation TEX pour les mathématiques (rappelons que c’est le choix par défaut dela ligne164dans la DTD ).Pour lesmathématiques, nous incluons des commandes TEX directement à l’intérieur de sections CDATA (lignes 51–53). Les caractères spéciaux de XML sont aussi saisis à l’aide de sections CDATA(lignes 40–41), tout commelecontenu duverbatimen général, lorsqu’onveut incluredu matériel non-XML dans un fichier XML —par exemple des sources en langues de programmation C, C++, Java, etc., qui utilisent les caractères spéciaux de XML, comme &,
Les différenteslangues sont déclarées à l’aidede l’attributxml:langsur les éléments document (ligne 12 pour l’anglais) et section (ligne 60 pour l’allemand et 100 pour le français), ainsi que sur bibitem (lignes 128, 132). Pour valider un document XML, cet attribut doit être déclaré pour tout élément auquel il peut être appliqué.
Voici une feuille de style XSL minilatex.xslqui traduit ce fichier en LATEX:
1
2
3
4 xmlns:xsl="; 5 xmlns=";>
6
7
8
9
10
11
12
13 \label{
14 }
15 }
16
17
18
19
20 \documentclass[]{
21
22 }
23 \usepackage[dvips]{graphicx}
24 \usepackage[T1]{fontenc}
25 \begin{document}
26
27
28 \end{document}
29
30
31
32
33
34
35
36 \maketitle
37
38
39
40
41 \title{
42
43 }
44
45
46
47 \author{
48
49 }
50
51
52
53
54
55
56
57 \thanks{
58
59 }
60
61
62
63 \thanks{
64
65 }
66
67
68
69 \date{
70
71 }
72
73
74
75
76 \begin{abstract}
77
78
79
80 \end{abstract}
81
82
83
84 \keywords{
85
86 }
87
88
89
90
92
93
94
95
96 \part{
97
98
99 \chapter{
100
101
102 \section{
103
104
105 \subsection{
106
107
108 \subsubsection{
109
110
111 \paragraph{
112
113
114 \subparagraph{
115
116
117 118 \emph{
119
120 }
121
122 123 \textbf{
124
125 }
126
127 128 \textsc{
129
130 }
131
132 133 \textsf{
134
135 }
136
137 138 \textsl{
139
140 }
141
142 143 \texttt{
144
145 }
146
147
148
149 \cite{
150
151 }
152
153
154 \pageref{
155
156 }
157
158
159 \ref{
160
161 }
162
163 164 165 \footnote{
166
167 }
168
169
170
171 \begin{quote} 172
173 \end{quote} 174
175
176
177 \begin{quotation}
178
179 \end{quotation}
180
181
182
183 \begin{verbatim}
184
185 \end{verbatim}
186
187
188
189
190 \begin{description}
191
192
193
194 \end{description}
195
196
197
198
199 \item[
200
201 ]
202
203
204
205
206
207
208 \begin{enumerate}
209
210
211 \end{enumerate}
212
213
214
215
216 \begin{itemize}
217
218
219 \end{itemize}
220
221
222
223
224 \item
225
226
227
228
229 \begin{thebibliography}{99}
230
231
232
233 \end{thebibliography}
234
235
236
237 \bibitem{
238
239 }
240
241
242
243
244 $
245
246 $
247
248
249
250 \begin{displaymath}
251
252
253
254 \end{displaymath}
255
256
257
258
259 \begin{equation}
260
261
262
263 \end{equation}
264
265
266
267
268 \begin{eqnarray}
269
270
271
272 \end{eqnarray}
273
274
275
276
277
278 \par
279
280
281
282
283
284
285 \begin{tabular}{
286 }
287
288
289
290 \end{tabular}
291
292
293
294
295 \\
296
297
298
299 &
300
301
302
303
304
305
306
307 \begin{figure}\centering 308
309
310 \end{figure}
311
312
313
314
315 \begin{table}\centering
316
317
318 \end{table}
319
320
321
322 \caption{
323
324
325
326
327 \includegraphics[
328 width=
329 ,
330 height=
331 ,
332 bb="
333 ,
334 angle=
335 ,
336 scale=
337
338 ]{}
339
340
341
342
Ce fichier de style a une structure assez linéaire et il ne devrait pas y avoir de difficultés particulières à comprendre comment les différents éléments sont traduits en LATEX. Nous mentionnons seulement la façon dont nous traitons les débuts de chapitres ou de sections (lignes 95–115) où nous avons paramétré la génération du titre et d’une commande LATEX \label à l’aide du modèle nommé label, défini en lignes
The LATEX DTD and multiple languages Michel Goossens ? August 4th, 1998 1 The basic principles This is an example input file. We start in English to show the principle. You should especially pay attention that we have used slightly different notation for some of the common LATEX constructs, such as the dashes, which come in three sizes: an intra-word dash, a medium dash for number ranges like 1–2, and a punctuation dash—like this. Text can be emphasized as shown here. An ellipsis is made with Footnotes1 are tricky constructs, since one must be careful not to nest them. 1.1 Dealing with special characters XML has a different set of reserved characters than LATEX, in particular, when you want to use any of the three characters , , and , you should enter them as , , and , respectively. 1.2 LATEX and mathematical formulae E X are very good at typesetting mathematical formulae, like x ? 3. Do not forget that for reasons of consistency, if you want to refer to a variable in one of the formulae, such as the symbol x, you must also use math mode in the text. 2 Beispiel eines Textes in deutscher Sprache 2.1 Eine EPS Abbildung Dieser Abschnitt zeigt, wie man eine PostScript-Abbildung [1] in ein Dokument einbinden kann. Abbildung 1 wurde mit dem Befehl ?Partly from an example in The LATEX Companion1This is a simple footnote. It can also contain elements. 1 | Figure 1: Ein EPS Bild Table 1: Eingabe der deutschen Zusatzzeichen in LATEX ä Ä ö Ö ü Ü SS in den Text aufgenommen. 2.2 Beispiel einer Tabelle Die Tabelle 1 auf Seite 2 zeigt eine Tabelle. 3 Continuation du texte en français 3.1 Traiter les listes Les listes sont utilisées fréquemment pour structurer ou mettre en évidence certains éléments d’un document (voir [2]). • Ceci est le premier élément d’une liste non-ordonnée. Chaque élément de ce type de liste est précédé d’un signe distinctif, comme une puce, un tiret, etc. • Ce second élément de la même liste contient une liste de description imbriquée. XML Meta langage pour définir des classes de documents XLL Langage pour définir des hyperliensentre différentes parties de documents XML Nous continuons notre texte à l’intérieur de la première liste. References [1] Adobe Inc. PostScript Handbuch (2. Auflage) Addison-Wesley (Deutschland) GmbH, Bonn, 1991. [2] Michel Goossens. Personnaliser les listes LATEX. Cahiers GUTenberg, 17:32–48, mai 1994. 2 |
FIGURE 14 – Un document XML balisé avec la DTD
.
11–17. Nous commençons par écrire le titre (élément stitle dans les motifs des lignes 95, 98, 101, etc.) avec l’instruction de la ligne 12, puis nous vérifions si la section (le parent de stitle) a un attribut de type id (test ../@id en ligne 13), auquel cas nous introduisons une commande \label ayant comme clé la valeur de l’attribut en question (partie
La figure 14 montre le résultat après traitement du fichier XML et la feuille de style XSL minilatex.xslavec un processeur XSL et avec LATEX.
B. Définition formelle des domaines nominaux
Cette annexe reprend les règles de production de la spécification des domaines nominaux. Le numéro de section dans la spécification[41] où les règles mentionnées sont introduites est indiqué dans le titre. La notation X renvoie à un numéro de production dans la spécification XML (voir page 191), N renvoie à un numéro de production pour les domaines nominaux.
B.1. Déclarer un domaine nominal (section 2)
[1] NSAttName ::= PrefixedAttNameN2 | DefaultAttNameN3
[2] PrefixedAttName ::= ’xmlns:’ NCNameN
[3] DefaultAttName ::= ’xmlns’
[4] NCName ::= (LetterX84 | ’_’) (NCNameCharN5)* [5] NCNameChar ::= LetterX84 | DigitX88 | ’.’ | ’-’ | ’_’ |
CombiningCharX87 | ExtenderX89
Les productions X4 et X5 de la spécification XML sont remplacées par N5 et N4, respectivement4.
B.2. Définir les noms qualifiés (section 3)
Le double point est utilisé pour séparer le préfixe ([7] Prefix) identifiant le domaine nominal de la partie « locale » ([8] LocalPart) du « nom qualifié » ([8] QNAME).
[6] QName ::= (PrefixN7 ’:’)? LocalPartN8
[7] Prefix ::= NCNameN4
[8] LocalPart ::= NCNameN4
B.3. Utiliser les noms qualifiés (section 4)
Avec l’introduction des domaines nominaux, plusieurs productions XML sont généralisées (à gauche le numéro de la production originale dans la spécificationde XML).
Règles de production pour les types d’élément
[9]X40 STag ::= ’N6 (SX3 AttributeN12)* SX3? ’>’
[10]X42 ETag ::= ’’ QNameN6 SX3? ’>’
[11]X44 EmptyElemTag ::= ’N6 (SX3 AttributN12e)* SX3? ’/>’
Règles de production pour les attributs
[12]X41 Attribute ::= NSAttNameN1 EqX25 AttValueX10 |
QNameN6 EqX25 AttValueX10
Règles de production pour les déclarations
X28 X3 N6
[13] doctypedecl ::= ’rsquo; S QName (SX3 ExternalID?
(’[’ (markupdecl 29 | PEReference )* ’]’ SX3?)? ’>’
[14]X45 elementdecl ::= ’3 QName 6 S 3 contentspecX46
SX3? ’>’
X N X X
[15] 48 cp ::= (QName 6 | choice 49 | seq 50) (’?’|’*’|’+’)?
[16]X51 Mixed ::= ’(’ SX3? ’#PCDATA’ (SX3? ’|’ SX3? QNameN6)*
SX3? ’)*’ | ’(’ SX3? ’#PCDATA’ SX3? ’)’
AttlistDecl ::= ’3 QNameN6 AttDefN18* SX3? ’>’
AttDef ::= SX3 (QNameN6 | NSAttNameN1) SX3 AttTypeX54
SX3 DefaultDeclX60
C. Définition formelle de XPath
Pour permettre de reconstruirela grammaire deXPath, nous reproduisons dans cette section les différentes règles de production de ce langage et listons également les fonctions disponibles. La notation X renvoie à un numéro de production dans la spécification XML (voir page 191), N renvoie à un numéro de production dans la spécification pour les domaines nominaux (voir page 102) et P à un numéro de production dans Xpath.
C.1. Chemins de localisation (section 2)
Un chemin de localisation (location path)
– sélectionne un ensemble de nœuds dans l’arbre source;
– peut spécifier un chemin absolu commençant par / (relatif au nœud racine du document);
– peut spécifier un chemin relatif (ne commençant pas par /) au nœud contexte.
[1] | LocationPath ::= | RelativeLocationPath 3 | AbsoluteLocationPath 2 P |
[2] | AbsoluteLocationPath ::= | ’/’ RelativeLocationPath 3? P P | AbbreviatedAbsoluteLocationPath 10 |
[3] | RelativeLocationPath ::= | P Step 4 | RelativeLocationPath 3 ’/’ StepP4 P P | AbbreviatedRelativeLocationPath 11 |
Un chemin de localisation peut contenir plusieurs expressions récursivement sous forme d’une succession de chemins relatifs, collés ensemble avec le signe /.
P
Pas de localisation (section 2.1)
Les pas de localisation (location step) sont définit comme suit:
[4] | Step | ::= | AxisSpecifier 5 NodeTest 7 Predicate 8* P P | AbbreviatedStep 12 |
[5] | AxisSpecifier | ::= | AxisName 6 ’::’ P P | AbbreviatedAxisSpecifier 13 |
P P
Chaque pas (StepP4) dans la construction d’un chemin de localisation se compose:
– d’un identificateur d’axeT5 : choisir une direction relative; – d’un test sur le nœudT6 : que cherche-t-on?
– dezéroou plus deprédicatsT7 : listed’attributsà utiliser pour sélectionner le(s) nœud(s) en question.
Axes (section 2.2)
[6] | AxisName | ::= | ’ancestor’ | | ’ancestor-or-self’ |
| ’attribute’ | | ’child’ | |||
| ’descendant’ | | ’descendant-or-self’ | |||
| ’following’ | | ’following-sibling’ | |||
| ’namespace’ | | ’parent’ | |||
| ’preceding’ | ’self’ | | ’preceding-sibling’ |
Tests sur les nœuds (section 2.3)
[7] NodeTest ::= NameTestP37
| NodeTypeP38 ’(’ ’)’
| ’processing-instruction’ ’(’ LiteralP29 ’)’
Prédicats (section 2.4)
[8] Predicate ::= ’[’ PredicateExprP9 ’]’
[9] PredicateExpr ::= ExprP14
Syntaxe courte (section 2.5)
[10] AbbreviatedAbsoluteLocationPath ::= ’//’ RelativeLocationPathP3
[11] AbbreviatedRelativeLocationPath ::= RelativeLocationPathP3 ’//’ StepP4
[12] AbbreviatedStep | ::= ’.’ | ’..’ |
[13] AbbreviatedAxisSpecifier | ::= ’@’? |
C.2. Expressions
Expressions de base (section 3.1)
[14] Expr ::= OrExprP21
[15] PrimaryExpr ::= VariableReferenceP36
| ’(’ ExprP14 ’)’
| LiteralP29
| NumberP30
| FunctionCallP16Appels de fonctions (section 3.2)
P35
[16] FunctionCall ::= FuncionName
’(’ ( ArgumentP17 ( ’,’Argument )* )? ’)’
[17] Argument ::= ExprP14
Ensembles de nœuds (section 3.3)
[18] UnionExpr ::= PathExprP18
| UnionExprP17 ’|’ PathExprP18
[19] PathExpr ::= LocationPathP1
| FilterExprP19 | FilterExprP19 ’/’ RelativeLocationPathP3 | FilterExprP19 ’//’ RelativeLocationPathP3
[20] FilterExpr ::= PrimaryExprP14
| FilterExprP17 PredicateP7
Expressions booléennes (section 3.4)
[21] OrExpr | ::= AndExpr 22 | OrExpr 21 ’or’ AndExprP22 P |
[22] AndExpr | P ::= EqualityExpr 23 P | AndExpr 22 ’and’ EqualityExprP23 |
[23] EqualityExpr | P ::= RelationalExpr 24 P | EqualityExpr 23 ’=’ RelationalExprP24 P | EqualityExpr 23 ’!=’ RelationalExprP24 |
[24] RelationalExpr | P ::= AdditiveExpr 25 P | RelationalExpr 24 ’P25 P | RelationalExpr 24 ’>’ AdditiveExprP25 P | RelationalExpr 24 ’P25 P | RelationalExpr 24 ’>=’ AdditiveExprP25 |
P
Expressions numériques (section 3.5)
P26
[25] AdditiveExpr ::= MultiplicativeExpr
| AdditiveExprP25 ’+’ MultiplicativeExprP2
| AdditiveExprP25 ’-’ MultiplicativeExprP26 [26] MultiplicativeExpr ::= UnaryExprP27
| MultiplicativeExprP26 MultiplyOperatorP34
UnaryExprP27
| MultiplicativeExprP26 ’div’ UnaryExprP27
| MultiplicativeExprP26 ’mod’ UnaryExprP27
[27] UnaryExpr ::= UnionExprP18
| ’-’ UnaryExprP27
Expressions de structure lexicale (section 3.7)
[28] ExprToken | ::= ’(’ | ’)’ | ’[’ | ’]’ | ’.’ | ’..’ | ’@’ | ’,’ | ’::’ | NameTest 37 | NodeTypeP38 P P | Operator 32 | FunctionNameP35 P | AxisName 6 | LiteralP29 P | Number 30 | VariableReferenceP36 |
[29] Literal | ::= ’"’ [^"]* ’"’ | "’" [^’]* "’" |
[30] Number | ::= Digits 31 (’.’ DigitsP31?)? P P | ’.’ Digits 31 |
[31] Digits | ::= [0-9]+ |
[32] Operator | ::= OperatorName 33 | MultiplyOperatorP34 P | ’/’ | ’//’ | ’|’ | ’+’ | ’-’ | ’=’ | ’!=’ | ’’ | ’>=’ |
[33] OperatorName | ::= ’and’ | ’or’ | ’mod’ | ’div’ |
[34] MultiplyOperator | ::= ’*’ |
[35] FunctionName | N ::= QName 6 - NodeTypeP38 |
[36] VariableReference ::= ’$’ NCNameN4
[37] NameTest ::= ’*’ | NCNameN4 ’:’ ’*’ | QNameN6
[38] NodeType ::= ’comment’ | ’node’
| ’processing-instruction’ | ’text’
[39] ExprWhitespace ::= SX3
D. Définition formelle de XSLT
La recommandation XSLT utilisele même modèle pour les données et les expressions que XPath, qui a été défini dans la section précédente. La notation P renvoie à un numéro de productionpour la recommandation XPath(voir page 104)et T à un numéro de production dans XSLT.
D.1. Motifs (XSLT section 5.2)
Les motifs de sélection de XSLT sont un sous-ensemble de ceux disponibles avec
XPath. Comme montré ci-dessous, seuls les axes child et attribute peuvent être
directement utilisés. | |
[1] Pattern | ::= LocationPathPattern 2 T | Pattern 1 ’|’ T LocationPathPattern 2 T |
[2] LocationPathPattern | ::= ’/’ RelativePathPattern 4? T | IdKeyPattern 3 ((’/’ | ’//’) T RelativePathPattern 4)? T | ’//’? RelativePathPattern 4 T |
[3] IdKeyPattern | ::= ’id’ ’(’ Literal 29 ’)’ P | ’key’ ’(’ Literal 29 ’,’ P P Literal 29 ’)’ |
[4] RelativePathPattern | ::= StepPattern 5 T | RelativePathPattern 4 ’/’ T StepPattern 5 T | RelativePathPattern 4 ’//’ T StepPattern 5 T |
[5] StepPattern | T ::= ChildOrAttributeAxisSpecifier 6 |
NodeTestP7 PredicateP8*
[6] ChildOrAttributeAxisSpecifier ::= AbbreviatedAxisSpecifierP13
| (’child’ | ’attribute’)
’::’
D.2. Éléments du vocabulaire XSLT par ordre alphabétique
Pour chaque élément nous donnons le titre et le numéro de la section où il est traité dans la recommandation XSLT, ainsi que sa syntaxe, indiquant l’endroit où l’élément peut être utilisé et ce qu’il peut contenir.
xsl:apply-imports Section 5.6 Overriding Template Rules.
xsl:apply-templates Section 5.4 Applying Template Rules.
xsl:attribute Section 7.1.3 Creating Attributes with xsl:attribute.
name = { qname } namespace = { uri-reference }>
xsl:attribute-set Section 7.1.4 Named Attribute Sets.
xsl:call-template Section 6 Named Templates.
xsl:choose Section 9.2 Conditional Processing with xsl:choose.
xsl:comment Section 7.4 Creating Comments.
xsl:copy Section 7.5 Copying.
xsl:copy-of Section 11.3 Using Values of Variables and Parameters with xsl:copy-of.
xsl:decimal-format Section 12.3 Number Formatting.
xsl:element Section 7.1.2 Creating Elements with xsl:element.
name = { qname } namespace = { uri-reference } use-attribute-sets = qnames>
xsl:fallback Section 15 Fallback.
xsl:for-each Section 8. Repetition.
xsl:if | Section 9.1 Conditional Processing with xsl:if.
|
xsl:import | Section 2.6.2 Stylesheet Import. |
xsl:include Section 2.6.1 Stylesheet Inclusion.
xsl:key Section 12.2 Keys.
xsl:message Section 13 Messages.
xsl:namespace-alias Section 7.1.1 Literal Result Elements.
xsl:number Section 7.7 Numbering.
letter-value = { "alphabetic" | "traditional" } grouping-separator = { char } grouping-size = { number } />
xsl:otherwise Section 9.2 Conditional Processing with xsl:choose.
xsl:output Section 16 Output.
method = "xml" | "html" | "text" | qname-but-not-ncname version = nmtoken encoding = string omit-xml-declaration = "yes" | "no" standalone = "yes" | "no" doctype-public = string doctype-system = string cdata-section-elements = qnames indent = "yes" | "no" media-type = string />
xsl:param Section 11 Variables and Parameters.
xsl:preserve-space Section 3.4 Whitespace Stripping.
xsl:processing-instruction Section 7.3 Creating Processing Instructions.
xsl:sort Section 10 Sorting.
xsl:strip-space Section 3.4 Whitespace Stripping.
xsl:stylesheet Section 2.2 Stylesheet Element (comme xsl:transform).
extension-element-prefixes = tokens exclude-result-prefixes = tokens version = number>
xsl:template Section 5.3 Defining Template Rules.
xsl:text Section 7.2 Creating Text.
xsl:transform Section 2.2 Stylesheet Element (alias pour xsl:stylesheet).
extension-element-prefixes = tokens exclude-result-prefixes = tokens version = number>
xsl:value-of Section 7.6.1 Generating Text with xsl:value-of.
xsl:variable Section 11 Variables and Parameters.
xsl:when Section 9.2 Conditional Processing with xsl:choose.
xsl:with-param Section 11.6 Passing Parameters to Templates.
E. Fonctions XPath et XSLT par ordre alphabétique
Pour chaque fonction, nous spécifions son type et la section où elle est traitée dans les recommandations XPath or XSLT.
boolean(object) booléenne (XPath, 4.3 Boolean Functions). ceiling(number) numérique (XPath, 4.4 Number Functions).
concat(string,string,string*) chaîne de caractères (XPath, 4.2 String Functions).
contains(string,string) chaîne de caractères (XPath, 4.2 String Functions). count(node-set) ensemble de nœuds (XPath, 4.1 Node Set Functions). current() ensemble de nœuds
(XSLT, 12.4 Miscellaneous Additional Functions).
document(object, node-set?) ensemble de nœuds
(XSLT, 12.1 Multiple Source Documents).
element-available(string) booléenne (XSLT, 15 Fallback). false() booléenne (XPath, 4.3 Boolean Functions). floor(number) numérique (XPath, 4.4 Number Functions). format-number(number,string,string?)chaîne de caractères (XSLT, 12.3 Number Formatting).
function-available(string) booléenne (XSLT, 15 Fallback).
generate-id(node-set?) ensemble de nœuds
(XSLT, 12.4 Miscellaneous Additional Functions).
id(object) ensemble de nœuds (XPath, 4.1 Node Set Functions).
key(string,object) ensemble de nœuds (XSLT, 12.2 Keys). lang(string) booléenne (XPath, 4.3 Boolean Functions). last() ensemble de nœuds (XPath, 4.1 Node Set Functions). local-name(node-set?) ensemble de nœuds (XPath, 4.1 Node Set Functions).
name(node-set?) ensemble de nœuds (XPath, 4.1 Node Set Functions).
namespace-uri(node-set?) ensemble de nœuds (XPath, 4.1 Node Set Functions).
normalize-space(string?) chaîne de caractères (XPath, 4.2 String Functions). not(boolean) booléenne (XPath, 4.3 Boolean Functions). number(object?) numérique (XPath, 4.4 Number Functions).
position() ensemble de nœuds (XPath, 4.1 Node Set Functions).
round(number) numérique (XPath, 4.4 Number Functions).
starts-with(string,string) chaîne de caractères (XPath, 4.2 String Functions).
string(object?) chaîne de caractères (XPath, 4.2 String Functions). string-length(string?) numérique (XPath, 4.2 String Functions).
substring(string,number,number?) chaîne de caractères (XPath, 4.2 String Functions).
substring-after(string,string) chaîne de caractères (XPath, 4.2 String Functions).
substring-before(string,string) chaîne de caractères (XPath, 4.2 String Functions).
sum(node-set) numérique (XPath, 4.4 Number Functions).
system-property(string) object système identifié comme un nom qualifié (XSLT, 12.4 Miscellaneous Additional Functions).
translate(string,string,string) chaîne de caractères (XPath, 4.2 String Functions).
true() booléenne (XPath, 4.3 Boolean Functions). unparsed-entity-uri(string) chaîne de caractères
(XSLT, 12.4 Miscellaneous Additional Functions).
F. Terminologie bilingue XML
Il n’est pas toujours facile de traduire des termes techniques des spécifications W3C. En particulier, pour les textes de XML, XSL, XLink et XPointer, nous avons quelquefois dûcréer unnéologisme.Heureusement, nous étionsaidéspar lefaitquela norme ISO SGML est une des rares à être traduite en français[38]. En plus les volontaires qui ont contribué à la traduction de la spécification XML (voir page 191)ont augmenté considérablement la liste. Le tableau qui suit contient des termes puisés dans ces deux listes ainsi que quelques nouvelles traductions de termes que nous avons utilisées dans le présent texte. Il est clair que ces dernières n’ont qu’une valeur subjective et que nous adopterons volontiers dans le futur une traduction « officielle » dès qu’elle existera.
TERME ANGLAIS | TRADUCTIONPROPOSÉE |
ampersand | esperluette |
attribute | attribut |
attribute-list declaration | déclaration de liste d’attributs |
attribute specification | spécification d’attribut, stipulation d’attribut |
attribute-value normalization | normalisation de valeur d’attribut |
base character | caractère de base |
big-endian | grand-boutien |
bypassed | outrepassé |
CDATA section | section CDATA |
character | caractère |
character data | données textuelles |
character encoding | codage des caractères |
character reference | appel de caractère |
child element | sous-élément |
choice list of content particles | liste d’options de particules (de contenu) |
combining character | caractère jonctif |
compatibility area | zone de compatibilité |
compatibility decomposition | décomposition de compatibilité |
compatibility formatting tag | balise de formatage de compatibilité |
conditional section | section conditionnelle |
consexte node | nœud contexte |
constraint | contrainte |
construct | construction, production |
content particle | particule de contenu, particule |
cookie | témoin de connexion, mouchard |
declaration | déclaration |
document | document |
document element | élément document |
document type declaration | déclaration de type de document |
document type definition | définition de type de document |
element | élément |
element content | contenu élémentaire |
element-content model | modèle de contenu élémentaire |
empty-element tag | balise d’élément vide |
end-tag | balise de fin, balise fermante |
entity | entité |
entity reference | appel d’entité |
enumerated type | type énuméré |
TERME ANGLAIS | TRADUCTIONPROPOSÉE | |||
escape (to) | masquer | |||
extender | modificateur de lettre | |||
external entity | entité externe | |||
follow set | ensemble des suivants | |||
generic identifier | identificateur générique | |||
internal entity | entité interne | |||
litteral entity value | valeur littérale d’entité | |||
little-endian | petit-boutien | |||
location path | chemin de localisation | |||
locator | localisateur, élément de localisation | |||
markup | balisage | |||
markup declaration | déclaration de balisage | |||
match | correspondre, correspondance | |||
match pattern | motif de correspondance | |||
mixed content | contenu mixte | |||
name | nom | |||
name characters | caractères constitutifs de nom | |||
name start characters | caractères initiaux de nom | |||
name token | unité lexicale nominale, atome nominal | |||
named template | modèle nommé | |||
non-terminal | non-terminal | |||
notation | notation | |||
notation type | type notation | |||
notify | signalé | |||
numeric character reference | appel de caractère numérique | |||
parameter entity | entité paramètre | |||
parsed data | données parsées, données analysables | |||
parsed entity | entité parsée, entité analysable | |||
parsed textual data | données textuelles parsées, données textuelles analysées | |||
pattern | motif | |||
processing instruction | instruction de traitement | |||
prolog | prologue | |||
proper nesting | imbrication stricte | |||
proxy | mandataire | |||
pull | recherche ou extraction individuelle | |||
push | distribution sélective | |||
replacement text | texte de remplacement | |||
root element | élément racine | |||
rule, production, construct | production, règle | |||
selection pattern | motif de sélection | |||
sequence list of content particles | liste de suite de particules [de contenu] | |||
standalone document | document autonome | |||
TERME ANGLAIS | TRADUCTIONPROPOSÉE | |||
standardization | standardisation | |||
start-tag | balise de début, balise ouvrante | |||
set of attributes | jeu d’attributs | |||
set of tokenized types | série de types atomiques | |||
string expressions | expressions contenant des chaînes de caractères | |||
string type | type chaîne [de caractères] | |||
surrogates | substituts | |||
system identifier | identificateur système | |||
text declaration | déclaration de texte | |||
token, tokenized, tokenizer | atome, atomisé, atomiseur | |||
tokenized type | type atomique | |||
trailing blanks | blancs de queue | |||
unparsed entity | entité non-parsée, entité non-analysable | |||
URL | adresse universelle | |||
valid, validity, validation | valide, validité, validation | |||
validating [XML]processor | processeur [XML] validateur | |||
well-formed | bien formé | |||
well-formedness constraint | contrainte de forme | |||
white space | séparateur, du blanc | |||
XML processor | processeur XML | |||
G. Traduire un fichier HTML en LATEX
Cette section présente une feuille de style XSL pour transformer un fichier HTML relativement simple en LATEX. Habituellement, il faut traiter le fichier d’abord avec l’utilitaire tidy[28] pour générer du XHTML (une version XML de HTML). Cette feuille de style traite uniquement les éléments de HTML qui ne sont pas trop orientés vers une présentation visuelle. Pour ceux-là, le plus souvent, il faut compléter ce qui suit par du code ad hoc pour traiter les structures plus complexes (tables, formes, effets coloriés, polices spéciales, etc.).
1
2
3 4 ">
5
6
7 ]>
8
10
11
12
13
14
15
16
17 }
18
19 \label{
20
21 }
22
23
24
25
26
27 \documentclass{article}
28 \usepackage{fromhtml}
29 \usepackage[T1]{fontenc}
30 \begin{document}
31
32
33 \end{document}
34
35
36
37
38 \section*{
39
40
41
42 \subsection*{
43
44
45
46 \subsubsection*{
47
48
49
50 \paragraph{
51
52
53
54 \subparagraph{
55
56
57
58
59
60
61
62
63
64 {\bfseries\itshape
65
66 }
67
68
69
70
71
72 \emph{
73
74 }
75
76
77 \textbf{
78
79 }
80
81
82 \texttt{
83
84 }
85
86
87 {\large
88
89 }
90
91
92 {\small
93
94 }
95
96
97 \begin{center}
98
99 \end{center}
100
101
102
103 \ref{
104
105 }
106
107
108
109 \begin{quote}
110
111 \end{quote}
112
113
114 \begin{verbatim}
115
116 \end{verbatim} 117
118
119
120 \begin{description}
121
122 \end{description}
123
124
125 \item[
126
127 ]
128
129
130
131
132 \par
133
134
135
136 \begin{enumerate}
137
138 \end{enumerate}
139
140
141 \begin{itemize}
142
143 \end{itemize}
144
145
146 \item
147
148
149
150 \item
151
152
153
154
155 \(\sb{
156
157 }\) 158
159
160 \(\sp{
161
162 }\)
163
164
165
166
167
168
169
170
171
172
173 (page \pageref{
174
175 })
176
177
178 (\url{
179
180 })
181
182
183
184
185 \newline
186
187
188 {\ttfamily
189
190 }
191
192
193 194
195
196
197
198
199 200
201 \begin{tabulary}{\textwidth}{
202
203
204
205 R
206
207
208 C
209
210
211 L
212
213 214
215 L}
216
217 \end{tabulary}
218
219
220
221
222 \\\empty
223
224
225
226
227 \TaB
228
229
230
231
232
233
234
235
236
237
238
239 \includegraphics{
240
241 }
242
243
244
245
246
247 248
249
250
251
252
253
254
255
256
257
258
259 \par ******* Élément non reconnu *******
260
261 ****
262
263 \end{flushleft}
264
265
Remerciements
Je tiens à remercier Sebastian RAHTZ pour une collaboration fructueuse, des discussionsstimulanteset pour l’aidetechnique avec quelques figuresrécalcitrantes.David CARLISLE était toujours prêt à répondre à mes questions XSL, même les plus stupides.
Plusieurs personnes ont eu la gentillesse de relire une version préliminaire de cet article: Lisiane BESSON, Bernard GAULLE, Michèle JOUHET, Maurice LAUGIER.
Par ses commentaires enrichissants et ses suggestions constructives Jacques ANDRÉ a considérablement contribué à améliorer le texte du présent article.
Évidemment j’assume,comme auteur, la responsabilitéde toutes les fautes et imprécisions restantes.
Bibliographie
[1] Alis Technologies inc. Liste des noms des caractères ISO 10646-1 (1993).
[2] Jacques ANDRÉ et Michel GOOSSENS. « Codage des caractères et multi-linguisme: de l’Ascii à Unicode et ISO/IEC-10646.» Cahiers GUTenberg, no 20, pages 1–54, mai 1995.
[3] Ronald BOURRET. XML and Databases
[4] Lou BURNARD et C.M. SPERBERG-MCQUEEN.« La TEI simplifiée: une introduction au codage des textes électroniques en vue de leur échange. » Cahiers GUTenberg, no 24, pages 23–152, juin 1996.
[5] James CLARK. xt, an implementation in Java of XSL Transformations.
[6] James CLARK. nsgmls, an SGML System Conforming to ISO Standard 8879. [7] James CLARK. nsgmls, Output Format.
[8] Robin COVER (Oasis). The SGML/XML Web Page (XSL).
[9] Dale DOUGHERTY. The Making of the DocBook DTD. [10] Daniel GLAZMAN. CSS2 Feuilles de styles HTML. Éditions Eyrolles, Paris, 1999.
[11] Charles F. GOLDFARB. The SGML Handbook. Oxford University Press, 1992.
[12] Michel GOOSSENS. « Introduction pratique à SGML. » Cahiers GUTenberg, no 19, pages 27–58, janvier 1995.
[13] Michel GOOSSENS, Frank MITTELBACH et Alexander SAMARIN. The LATEX Companion. Addison-Wesley, Reading, 1995.
[14] Michel GOOSSENS, Sebastian RAHTZ et Frank MITTELBACH. The LATEX Graphics Companion. Addison-Wesley, Reading, 1997.
[15] Michel GOOSSENS et Sebastian RAHTZ. The LATEX Web Companion. Addison-Wesley, Reading, 1999.
[16] Eric van HERWIJNEN. SGML PRATIQUE. International Thomson Publishing France, Paris, 1995.
[17] Ken HOLMAN. Practical Transformation Using XSLT and XPath. [18] IBM alphaWorks. LotusXSL, an XSL processor in Java.
[19] IBM alphaWorks. A prototype Scalable Vector Graphics (SVG) viewer.
[20] IBM alphaWorks. xmlviewer, a Java class for viewing XML documents. [21] IBM alphaWorks. XML4J, XML parser for Java.
[22] The Internet Society. Tim BERNERS-LEE et al. Uniform Resource Identifiers (URI): Generic Syntax.
[23] Leslie Michel LAMPORT. LATEX User’s Guide and Reference Manual, Second Edition. Addison-Wesley, Reading, 1994.
[24] Alain MICHARD. XML Langage et applications. Éditions Eyrolles, Paris, 1999.
[25] Nic MILOSLAV. Introduction to XSL. [26] Mulberry Technologies. XSL-List — Open Forum on XSL. [27] Dave PAWSON. XSL Frequently Asked Questions.
[28] David RAGGETT. Clean up your Web pages with HTML Tidy. [29] Sebastian RAHTZ. Passive TEX.
[30] Sebastian RAHZT et Michel GOOSSENS. PassiveTeX: XML and TEX, doing it together
[31] Sebastian RAHTZ. TEI and XSL.
[32] Gaspar SINAI et Roman CZYBORRA. Yudit Unicode editor.
[33] C.M. SPERBERG-MCQUEEN et Lou BURNARD (rédacteurs).
Guidelines for Electronic Text Encoding and Interchange.
Chicago, Oxford: Text Encoding Initiative, 1994.
[34] James TAUBER. FOP: A Formatting Object to PDF Formatter/Renderer.
[35] THE UNICODE CONSORTIUM. The Unicode Standard, Version 2.0. Addison-Wesley, Reading, 1996.
[36] Norman WALSH (Oasis) The Docbook DTD and stylesheets.
[37] International Organization for Standardization. Hypermedia/Time-based Structuring Language (Hytime). ISO 10744, ISO Geneva, 1992.
[38] Organisation internationale de normalisation. Langage normalisé de balise généralisé (SGML). ISO 8879-1986(F), ISO Genève, 1986.
[39] World Wide Web Consortium, Håkon Wium LIE et Bert BOS (rédacteurs).
Cascading Style Sheets, level 1.
[40] World Wide Web Consortium, Håkon Wium LIE, Bert BOS, Chris LILLEY et Ian JACOBS (rédacteurs). Cascading Style Sheets, level 2.
[41] World Wide Web Consortium. Tim BRAY, Dave HOLLANDER et Andrew LAYMAN (rédacteurs). Namespaces in XML.
[42] World Wide Web Consortium. QL’98 - The Query Languages Workshop.
[43] World Wide Web Consortium. Jon FERRAIOLO (rédacteur). Scalable Vector Graphics (SVG) 1.0 Specification. Working Draft.
[44] World Wide Web Consortium. Murray ALTHEIM et Shane MCCARRON (rédacteurs). XHTML 1.1 - Module-based XHTML.
[45] World Wide Web Consortium. Murray ALTHEIM, Frank BOUMPHREY, Sam DOOLEY, Shane MCCARRON et Ted WUGOFSKI (rédacteurs). Modularization of XHTML.
[46] World Wide Web Consortium. Tim BRAY, Jean PAOLI et C. M. SPERBERG-MCQUEEN (rédacteurs). Extensible Markup Language (XML) 1.0.
[47] World Wide Web Consortium. Steve DEROSE, David ORCHARD et Ben TRAFFORD (rédacteurs). XML Linking Language (XLink). Working Draft.
[48] World Wide Web Consortium, James CLARK et Steve DEROSE (rédacteurs). XML Path Language (XPath), Version 1.0 (W3C Proposed recommendation).
[49] World Wide Web Consortium. Steve DEROSE et Ron DANIEL Jr. (rédacteurs) XML Pointer Language (XPointer). Working Draft.
[50] World Wide Web Consortium. Henry S. THOMPSON, David BEECH, Murray MALONEY et Noah MENDELSOHN (rédacteurs). XML Schema Part 1: Structures.
[51] World Wide Web Consortium. Paul V. BIRON et Ashok MALHOTRA (rédacteurs).
XML Schema Part 2: Datatypes.
[52] World Wide Web Consortium, Stephen DEACH (rédacteur). Extensible Stylesheet Language (XSL), Version 1.0 (W3C Working Draft).
[53] World Wide Web Consortium, James CLARK (rédacteur). XSL Transformations (XSLT), Version 1.0 (W3C Proposed recommendation).
. Une liste plus complète des différences entre SGML et XML se trouve à l’URL
TR/NOTE-sgml-xml et dans l’article de Sarra BEN LAGHA dans ce Cahier, page 127
. Des données de type « caractère » sont celles déjà traitées par le programme d’analyse (en anglais parser)et qui ne contiennentplus d’appelsd’entitésou de balises.Dansle jargon XML celas’appelleparsed character data ou données textuelles analysées et se note #PCDATA.
. Dans la DTD nous definissons (ligne 7) l’entité paramètre i18n contenant xml:lang. Puis l’entité paramètre i18n est incluse, ligne 8, dans l’entité paramètre basic. Celle-ci est associée dans la DTD à pratiquement tous les éléments (voir lignes 53, 55, 58, 60, etc.).
[4] . Les abréviations NC et NS représentent non-colon (sans deux points «: ») et namespace (domaine nominal).
[5] . Cette liste est en grande partie l’œuvre de Patrick ANDRIES et François YERGEAU et se trouve à l’URL .