• Aucun résultat trouvé

Cours Xml pour debutant : les schemas XSD, et les transformations XSLT

N/A
N/A
Protected

Academic year: 2021

Partager "Cours Xml pour debutant : les schemas XSD, et les transformations XSLT"

Copied!
287
0
0

Texte intégral

(1)

Publication web avec XML/XSLT

Bernd Amann et Philippe Rigaux

(2)
(3)

Contents

1 Introduction à XML et XSLT 13

1.1 L’application et ses besoins . . . 14

1.2 XML, format universel . . . 14

1.2.1 Qu’est-ce que XML ? . . . 15

1.2.2 Structuration avec XML . . . 15

1.2.3 Documents XML . . . 18

1.3 Publication de données avec XSLT . . . 21

1.3.1 Site web (HTML) . . . 21

1.3.2 Site WAP (WML) . . . 31

1.3.3 Document papier (PDF) . . . 38

1.4 Échange et intégration de données en XML . . . 42

1.4.1 Exemple : Le Site www.sallesenligne.com . . . . 42

1.4.2 Description de la structure d’un document XML . . . 43

1.4.3 Transformation et échange de données . . . 44

1.4.4 Un moteur de recherche XML/XSLT . . . 45

1.4.5 Intégration dynamique de fragments XML . . . 46

1.5 Comment lire la suite de ce livre ? . . . 51

2 Documents XML : structure et navigation 55 2.1 La syntaxe XML . . . 56

2.1.1 Déclaration XML . . . 57

2.1.2 Déclaration du type de document et des entités . . . 57

2.1.3 Commentaires . . . 58 2.1.4 Instructions de traitement . . . 58 2.1.5 Éléments . . . 59 2.1.6 Attributs . . . 59 2.1.7 Espaces . . . 60 2.1.8 SectionsCDATA . . . 61 2.1.9 Références d’entités . . . 61

2.1.10 Balises, données caractères et valeur textuelle . . . 62

2.2 Le modèle DOM . . . 64

2.2.1 Types de nœuds DOM . . . 64

2.2.2 Interface DOMString . . . . 66

2.2.3 Interfaces NodeList et NamedNodeMap . . . . 66

2.2.4 Interface Node . . . . 66

2.2.5 Interface Document . . . . 71

2.2.6 Interfaces Element et Attr . . . . 72

2.2.7 Interfaces DocumentType, Entity et EntityReference . . . . 74

2.3 Du document sérialisé à l’arbre DOM . . . 74

2.3.1 Construction d’un arbre DOM . . . 76

2.3.2 Traitement des espaces pendant la construction . . . 78

2.3.3 Deux fonctions de navigation . . . 79 3

(4)

2.4 Le langage XPath . . . 81

2.4.1 Représentation XPath d’un document XML . . . 82

2.4.2 Expressions XPath . . . 86

2.4.3 Les axes . . . 91

2.4.4 Les filtres . . . 98

2.4.5 Prédicats . . . 100

2.4.6 Types et opérations XPath . . . 103

2.4.7 Exemples d’expressions XPath . . . 107

3 XSLT 109 3.1 Programmes XSLT . . . 110

3.1.1 Structure d’un programme XSLT . . . 111

3.1.2 Modularité :xsl:importetxsl:include . . . 115

3.1.3 Application d’un programme XSLT . . . 117

3.2 Les règles XSLT . . . 119

3.2.1 Les patterns . . . 119

3.2.2 Règles . . . 122

3.2.3 Déclenchement de règles avecxsl:apply-templates. . . 124

3.2.4 Sélection des règles . . . 126

3.2.5 Appel de règle avecxsl:call-template . . . 131

3.2.6 Paramètres . . . 132

3.3 Instructions de contrôle . . . 134

3.3.1 Tests :xsl:ifetxsl:choose . . . 134

3.3.2 Boucles :xsl:for-each . . . 136

3.3.3 Variables :xsl:variable. . . 138

3.3.4 Tri :xsl:sort . . . 140

3.3.5 Itérations par récursion . . . 141

3.4 Évaluation d’un programme XSLT . . . 146

4 Production de documents XML 153 4.1 Définition de Types de Documents : DTD . . . 154

4.1.1 Pourquoi définir une DTD ? . . . 154

4.1.2 Entités . . . 154 4.1.3 Éléments . . . 156 4.1.4 Attributs . . . 160 4.1.5 DTD et XML Schéma . . . 164 4.2 Site Web: HTML . . . 165 4.2.1 HTML et XHTML . . . 165 4.2.2 DTD XHTML . . . 166

4.2.3 Génération de pages HTML:xsl:output . . . 170

4.2.4 Transformation d’une page XML . . . 171

4.2.5 Création de liens . . . 173

4.2.6 XML/XSLT: une solution du problème des liens cassés . . . 175

4.2.7 Intégration de pages XML . . . 176

4.3 Présentations multimédia: SMIL . . . 177

4.3.1 SMIL par un exemple . . . 177

4.3.2 DTD SMIL . . . 181

4.3.3 Génération de présentations SMIL . . . 187

4.4 Traitement de texte dans XSLT . . . 195

4.4.1 xsl:preserve-spaceetxsl:strip-space . . . 195

4.4.2 Génération de texte :xsl:text . . . 197

4.4.3 Sérialisation du résultat :xsl:output. . . 197

(5)

CONTENTS 5

5 Production de documents papier 199

6 Échange et intégration 201

7 Publication de bases de données 203

7.1 Bases de données et XML . . . 204

7.1.1 Quelques rappels sur les BD relationnelles . . . 204

7.1.2 Documents orientés « texte » et documents orientés « données » . . . 207

7.1.3 Transformation d’une base de données en XML . . . 209

7.1.4 Création de la DTD . . . 215

7.2 Architectures . . . 218

7.2.1 Une classe Java d’exportation XML . . . 218

7.2.2 Architecture Servlet . . . 222

7.2.3 Utilisation des Java Server Pages . . . 225

7.3 XML dynamique . . . 230 7.3.1 XSP . . . 230 7.3.2 XSQL . . . 235 7.4 Perspectives . . . 239 8 Un serveur de publication XML 241 A L’environnement XML/Apache 243 A.1 Le projet XML/Apache . . . 244

A.2 Xalan . . . 244

A.2.1 Préliminaire : le Java Development Kit . . . 245

A.2.2 Installation de Xalan . . . 245

A.2.3 Test d’expressions XPath avec ApplyXPath . . . 245

A.2.4 Effectuer des transformations XSLT avec Xalan . . . 246

A.2.5 Utiliser Xalan en Applet ou en Servlet . . . 247

A.3 Cocoon . . . 247

A.3.1 Tomcat . . . 247

A.3.2 Cocoon . . . 248

A.4 Intégration Apache/Tomcat/Cocoon . . . 249

A.4.1 Compilateur . . . 250

A.4.2 Apache . . . 251

A.4.3 PHP . . . 251

A.4.4 Lien Apache/Tomcat . . . 251

A.4.5 Et Cocoon ? . . . 252

B Référence XPath/XSLT 253 B.1 Éléments XSLT . . . 253

(6)
(7)

Avant-propos

Ce livre traite de la publication de données, dans un environnement web, à partir de documents XML et de programmes (ou « feuilles de styles ») XSLT. Le terme de publication employé ici doit être pris dans un sens très général. Il recouvre toutes les transformations visant à mettre en forme un contenu afin de le rendre accessible via un ou plusieurs médias de communication. Cette définition très souple s’applique bien entendu à la publication web prise dans son acception la plus classique : rendre disponible un contenu au format HTML sur une serveur connecté à l’Internet. Mais elle recouvre également de très nombreux types de publications que nous aurons l’occasion d’aborder dans ce livre : publication WAP pour téléphones mobiles, mise en forme pour une impression papier, présentations interactives multimédia, etc.

Il existe plusieurs approches pour la publication de données. Une première solution est de gérer les données séparément dans un format adapté à chaque type de publication, avec des inconvénients évidents dus à la duplication des informations. Un exemple très concret de ces limitations est donné par le Web, qui est encore essentiellement constitué de pages HTML. Si un contenu est placé dans une telle page, il pourra certes être affiché correctement dans un navigateur, mais il deviendra également impropre à être repris et exploité dans un autre contexte (document papier, système de base de données, ...). Ce qui est vrai pour HTML l’est également, à des degrés divers, pour toute autre représentation.

Il est donc très rapidement devenu évident qu’il était souhaitable de dissocier présentation et contenu. Parmi les très nombreuses raisons justifiant ce principe, on peut citer :

la volonté de réutiliser un même contenu dans différents contextes ;

l’impossibilité de réaliser une application complexe et interactive avec HTML ;

la nécessité de baser la présentation sur une « maquette » définissant une mise en forme applicable à de nombreuses occurrences de contenu (exemple typique des maquettes de quotidiens appliquées à un contenu qui change tous les jours) ;

enfin, la lourdeur d’une gestion de sites web statiques : les webmestres doivent en effet être compé-tents en graphisme, en HTML, en JavaScript, et savoir faire des choix relatifs au système d’information de leur entreprise.

Une solution maintenant largement adoptée est de s’appuyer sur un serveur de données centralisant l’information, et d’écrire pour chaque type de publication une application séparée qui utilise des outils adaptés. Pour reprendre le domaine de la publication web, la plupart des sites s’appuient maintenant sur un système de gestion de bases de données (SGBD), en extraient des informations avec SQL, et produisent une page HTML intégrant ces informations avec un langage comme PHP, ASP ou les Java Server Pages (JSP). La complexité des applications web peut varier du transfert simple de résultats de requêtes SQL et la réservation de billets d’avion avec des mises à jour sur différentes bases de données. Cette solution résout les principaux problèmes évoqués ci-dessus, et notamment rétablit une certaine indépendance entre contenu et présentation. En revanche le simple énoncé des compétences nécessaires montre qu’elles sont plutôt alourdies : ils faut maintenant non seulement maîtriser les langages propres au web, comme HTML et JavaScript, mais également disposer de connaissances de graphiste, de programmeur, de concepteur et administrateur de bases de données.

Un des arguments du présent livre est de montrer que l’utilisation de XML en lieu et place de HTML permet de mettre en place des mécanismes beaucoup plus puissants, et notamment d’obtenir, à partir d’un

(8)

même contenu, à peu près n’importe quel format de sortie (HTML, XML, PDF, WML, LaTeX, ...). Un document XML est beaucoup plus souple, flexible et maniable qu’une base de données dont la mise en œuvre suppose des compétences techniques assez avancées. De plus la mise en forme de l’information à partir d’un document XML est grandement facilitée par l’existence d’un langage spécialisé : XSLT.

XSLT

XSLT (eXtensible Stylesheet Language Transformations) est un langage permettant d’extraire et de restruc-turer des informations présentes dans un document XML. Cette restructuration peut être faite en HTML, si on vise à produire un site au sens classique du terme, mais un programme XSLT peut également fournir, pour tout ou partie des informations, une version imprimable en PDF, voire Word/RTF. On peut également, dynamiquement, adapter la présentation au client qui accède au site, comme l’illustre le cas typique de deux versions, WML et HTML, d’un site web.

La publication avec XSLT va au-delà de la seule mise en forme destinée à une consultation statique. On peut utiliser XSLT dans une optique d’échange et d’intégration de données. Avec XML il est possible en effet de rendre publiques sur le Web, en passant par une transformation XSLT appropriée, des informations qui peuvent être reprises et traitées par d’autres. On peut envisager, par exemple, un système coopératif où il n’y a plus besoin, pour créer un site web, de devoir gérer soi-même la base de données, le serveur, la sécurité, la présentation. Le contenu est fourni à quelqu’un sous forme de documents XML, dans le format qu’il attend, et ce quelqu’un se charge de l’intégration avec d’autres documents et la mise en forme, HTML ou autre. Autre application possible de cette capacité d’échanges de données : l’indexation par un moteur de recherche, dont le rôle est de collecter les informations sur un thème donné, et d’offrir des modes de recherches sophistiqués pour ces informations.

XML rend possible la représentation de l’information dans un format universel, reconnu sur tous les systèmes, et adapté à une répartition sur le Web. En utilisant des feuilles de style XSLT on peut extraire, reformater, et définir la présentation adéquate pour ces informations XML. On résout, en d’autres termes, un problème très courant : comment éviter de dupliquer des informations pour s’adapter soit à une applica-tion donnée, soit au type particulier de publicaapplica-tion/communicaapplica-tion (papier, écran, transparent, email) que l’on souhaite utiliser. Il devient possible d’imaginer un système d’information véritablement réparti sur un réseau, dans lequel les nœuds peuvent s’échanger des informations et se spécialiser chacun dans un type de service particulier.

Objectifs et contenu de ce livre

Le présent livre est principalement destiné à couvrir de manière complète, progressive et détaillée, le lan-gage XSLT et ses applications à la transformation de documents XML. Cet axe principal est complété par la recherche d’une mise en perspective du pourquoi et du comment de telles transformations. Autrement dit nous avons cherché, autant que les limites fixées par la clarté de la présentation le permettaient, à définir un contexte d’utilisation réaliste pour motiver le recours à XSLT et montrer ses apports.

Au cours des différents chapitres, nous envisageons donc différents « cas d’utilisation » de XML. Ce choix nous amène, en pratique, à aller bien plus loin que la simple création de pages HTML, comme le terme de « publication web » pourrait à tort le laisser croire. En particulier nous développons les aspects relatifs aux échanges de données entre deux applications

et , avec des transformations XSLT prenant en entrée un document XML reconnu par l’application



, et produisant en sortie un autre document XML reconnu par l’application . Ces échanges constituent un aspect essentiel du rôle de XML dans des ap-plications réparties, et XSLT, par sa capacité à transformer automatiquement les informations structurées avec XML, y tient une place importante.

Un dernier thème abordé dans ce livre est l’intégration de données au format XML, préalable à une transformation. Le langage XML peut en effet être vu comme un moyen pour unifier dans un format cohérent des informations hétérogènes issues de sources diverses. Nous consacrons en particulier une place importante à la création « à la volée » de documents XML à partir d’une base de données, suivie d’une transformation XSLT. Une telle aproche offre une alternative intéressante à une solution basée sur

(9)

CONTENTS 9 un langage de script intégré aux pages HTML (PHP ou JSP) car elle permet une séparation des points de vues et donc des compétences : celui qui intègre les informations en XML, en utilisant des langages comme Java et SQL, peut être différent de celui qui publie ces informations à destination de différents médias, en s’appuyant sur des connaissances XSLT et – par exemple – HTML. En incluant dans ce livre des développements techniques sur une chaîne de publication complexe allant d’une base de données à un document final au format PDF ou HTML, en passant par une intégration XML, nous pensons proposer un panorama complet de ce que peut être un environnement de publication web construit sur XSLT.

Afin de donner des illustrations concrètes aux concepts évoqués ci-dessus, une partie importante des exemples donnés dans ce livre est consacrée à des applications simplifiées, mais réalistes, de la manipula-tion de documents XML avec XSLT. Nous invitons le lecteur à utiliser nos deux maquettes, disponibles sur le site du livre, et à récuperer, puis modifier le code de ces exemples.

Les exemples

Sauf indication contraire, tous nos exemples sont conformes aux documents normatifs publiés par le World Wide Web Consortium et disponibles sur le site http://www.w3c.org. Il devraient donc fonctionner avec tous les serveurs d’application ou clients web dotés d’un processeur XSLT. Nous utilisons cependant, à titre d’outil de référence, l’environnement Tomcat/Cocoon proposé par la fondation Apache et librement disponible sur le site http://xml.apache.org. Nous proposons dans l’annexe A un guide d’installation et de configuration de ces outils, sous Linux ou Windows, qui vous permettront de tester nos exemples ou d’effectuer vos propres investigations sans investir dans un produit commercial.

Dans les cas où nous devons faire appel à des fonctionnalités non standardisées, nous avons choisi, par souci de cohérence, de faire encore appel aux solutions proposées dans Cocoon, en essayant cependant de mettre en valeur les aspects génériques qui se retrouvent dans la plupart des produits. C’est le cas notamment pour la création dynamique de documents XML à partir d’une base de données pour laquelle nos exemples sont basés sur XSP, une technique d’intégration de code java dans du XML que l’on retrouve dans Cocoon, dans AxKit (www.axkit.org), et qui s’inspire fortement des Java Server Pages.

Vous pouvez récupérer tout le code de nos exemples sur le site du livre, afin de l’utiliser, le consulter ou le modifier pour vos propres besoins.

http://cortes.cnam.fr:8080/XBOOK

Audience et pré-requis

Ce livre est destiné à tous ceux qui s’interrogent sur les applications liées à XML, et plus particulièrement sur la validité d’une aproche basée sur XML pour la mise à disposition de données sur le Web. Nous pensons que ce public recouvre plus spécifiquement les types de lecteur suivants :

1. les architectes d’applications envisageant d’utiliser XML comme format d’échange de données entre différentes applications où comme support de base de leur système d’information ;

2. les chefs de projet qui doivent intégrer dans la conception de leurs produits un ou plusieurs modules de communications de données via le Web ;

3. les développeurs d’application à qui ce livre donne les indications nécessaires pour produire une présentation uniforme de leur site fondée sur l’utilisation de feuilles de style.

4. enfin toute personne cherchant une présentation pratique et complète des nouvelles méthodologies de publications sur le web.

Nous supposons que le lecteur dispose par ailleurs d’une connaissance minimale des sujets suivants : 1. les bases des applications web, incluant HTML, la gestion de formulaires, quelques notions sur la

(10)

2. les principes des bases de données relationnelles (notamment SQL) ; 3. un peu de programmation Java.

Il existe de très nombreux livres qui traitent des aspects ci-dessus. Nous recommandons par exemple HTML : The Definitive Guide, Java in a Nutshell et (?) tous aux Éditions O’Reilly.

Organisation du livre

Le livre suit une double démarche de présentation des aspects les plus simples, puis, progressivement, les plus complexes du langage XSLT, et d’illustration des mécanismes de ce langage à des cas concrets d’utilisation. Nous avons choisi de commencer par un chapitre introductif en forme d’étude de cas qui pro-pose, sur une application de type « Officiel des spectacles » adaptée au web, une déclinaison des différents thèmes couverts. La lecture préalable de ce chapitre est probablement indispensable, au moins pour les néophytes.

Les chapitres suivants traitent de manière plus systématique du couple XML/XSLT en reprenant de manière approfondie les aspects présentés de manière délibérement intuitive dans le premier chapitre. Le fil conducteur est cette fois une application publiant sous différentes formes les programmes d’organismes de formation (universités, instituts techniques comme le Cnam, etc), mais nous utilisons également parfois des exemples plus abstraits quand il faut privilégier l’explication des mécanismes XSLT.

Dans la quasi-totalité du livre nous essayons d’être indépendant d’un outil ou type d’outil particulier afin de respecter le caractère normalisé de XML/XSLT. Le dernier chapitre propose cependant une étude de cas détaillée montrant, pour un type d’environnement particulier, en l’occurrence la suite Apache/Tomcat/Coocon, la réalisation d’un site web.

Plan détaillé

Une introduction à XML/XSLT. Ce premier chapitre fournit une présentation relativement courte de la problématique d’ensemble abordée par le livre. Il peut se lire indépendamment du reste du livre, et propose des arguments et des exemples simples, ainsi qu’une introduction intuitive des mécanismes qui sont à la base des transformations XSLT.

Les apports de XML/XSLT sont successivement présentés, tous étant, dans les chapitres suivants, repris et développés avec des descriptions techniques approfondies.

Documents XML. Présentation de la syntaxe XML (éléments, attributs, liens, entités..) ;

Bases de XSLT. Le cœur du sujet : à partir d’un ou plusieurs documents décrivant des formations, on explore les principales possibilités de XSLT.

DTD. XSLT peut être vu comme un outil permettant de transformer un document XML représentant un contenu indépendamment de toute application, vers un autre document XML, spécialisé, et dédié à un application particulière (par exemple un navigateur web).

Plusieurs spécialisations sont présentées dans ce chapitre : 1. XHTML ;

2. RSS ; 3. WML ; 4. (?)

(11)

CONTENTS 11

Conventions

Nous utilisons les conventions typographiques suivantes :

La police à chasse constantes’applique à tous les exemples de code, de commande et de programme.

La policeà chasse constante en italiquesest utilisée pour distinguer les paramètres des mot-clé dans la syntaxe des commandes.

Le texte en italiques est utilisé pour les URL, les noms de fichiers, de programmes et de répertoires cités dans le texte (autrement dit, quand ils ne sont pas inclus dans du code). L’italique est également utilisé pour les termes étrangers et pour la mise en valeur de mots ou d’expressions importants. Les commandes UNIX sont précédées de %. Par exemple :

% ls -l

De plus, nous adopterons également des conventions précises pour nommer les fichiers, les variables, les fonctions, les noms de tables, etc. Ces conventions font partie d’une stratégie générale de qualité du développement et seront présentées le moment venu.

Remerciements

(12)
(13)

Chapter 1

Introduction à XML et XSLT

Sommaire

1.1 L’application et ses besoins . . . . 14

1.2 XML, format universel . . . . 14

1.2.1 Qu’est-ce que XML ? . . . 15

1.2.2 Structuration avec XML . . . 15

1.2.3 Documents XML . . . 18

1.3 Publication de données avec XSLT . . . . 21

1.3.1 Site web (HTML) . . . 21

1.3.2 Site WAP (WML) . . . 31

1.3.3 Document papier (PDF) . . . 38

1.4 Échange et intégration de données en XML . . . . 42

1.4.1 Exemple : Le Site www.sallesenligne.com . . . 42

1.4.2 Description de la structure d’un document XML . . . 43

1.4.3 Transformation et échange de données . . . 44

1.4.4 Un moteur de recherche XML/XSLT . . . 45

1.4.5 Intégration dynamique de fragments XML . . . 46

1.5 Comment lire la suite de ce livre ? . . . . 51 Ce chapitre a pour ambition de proposer au lecteur une présentation intuitive des principales caractéris-tiques de XML, ainsi qu’un tour d’horizon de ses apports en terme d’intégration, d’échange et de publi-cation de données. Nous évitons délibérément, à ce stade, toute discussion technique détaillée, l’objectif étant plutôt de dresser un panorama des contextes d’utilisation de XML et de son association avec XSLT, en vue de convaincre le lecteur de l’intérêt de recourir à ces langages.

Nous prenons comme fil conducteur, dans ce chapitre, une application simple qui nous permettra de décliner des exemples d’utilisation de XML. Cette application consiste à fournir, sous les formes les plus variées, les informations relatives aux films à l’affiche en France, comprenant un descriptif de chaque film, et les cinémas, salles et séances où ces films sont projetés. Nous supposons de plus que ces informations sont disponibles en différents points du réseau Internet. Nos exemples montreront comment XML permet d’échanger ces informations, de les intégrer, et enfin de les publier sur les supports les plus divers.

L’accent est mis bien entendu sur l’association de XML avec le langage de transformation XSLT, mais nous discutons également, plus brièvement, des interfaces de programmation, ainsi que des rapports entre XML et les bases de données relationnelles. Nous souhaitons que ce premier chapitre permette, sans inve-stir dans une étude technique approfondie, de dégager clairement la place de XML au sein des nombreux outils, langages et techniques qui constituent un système d’information orienté vers la publication ou les échanges de données sur le Web. Pour tous les aspects qui ne sont, techniquement parlant, qu’esquissés dans cette introduction, nous indiquons finalement le chapitre ou la partie du livre où le lecteur trouvera un développement complet.

(14)

1.1

L’application et ses besoins

Décrivons tout d’abord l’application (simplifiée). L’objectif général consiste, pour un cinéma, à diffuser le plus largement possible l’information relative à ses salles, avec les films qui y sont diffusés et les horaires des séances. Nous prendrons comme exemple principal le cas du cinéma L’Épée de bois qui propose deux films :

Le film Alien, de Ridley Scott, projeté dans la salle 1 avec trois séances dans la journée ; le film Vertigo, d’Alfred Hitchcock, projeté dans la salle 2 avec une seule séance à 22 heures. L’Épée de bois souhaite bien entendu rendre ces informations disponibles sur son site web. Mais il envisage également le cas de cinéphiles munis d’un téléphone mobile, susceptibles de consulter les séances via une application WAP. Enfin le programme des salles doit être affiché à l’entrée du cinéma, distribué dans l’environnement proche (cafés, librairies) sous forme de tracts, et transmis à un magazine d’informations sur les spectacles.

Pour tous ces modes de diffusion, la solution traditionnelle, basée sur des outils adaptés à chaque cas, implique de resaisir l’information, avec des risques d’erreur multipliés et une perte de temps inutile. Par exemple la plaquette serait stockée au format propriétaire d’un traitement de mise en page, chaque site web placerait le contenu dans des fichiers HTML, le magazine conserverait ce même contenu dans une base de données, et ainsi de suite.

Supposons de plus qu’un site, www.sallesenligne.com, propose de référencer toutes les séances de tous les cinémas en France, et offre aux internautes un service de recherche et d’indexation. Bien entendu cela suppose que chaque cinéma lui fournisse, dans un format donné, les informations sur ces propres séances, ce qui implique pour l’Épée de bois un travail supplémentaire de saisie et mise à jour.

Enfin on supporsera qu’un dossier complet sur chaque film (acteurs, résumé) est disponible dans une base de données interrogeable sur le web, et que chaque journal tenant une rubrique « cinéma » offre un accès sur le Web aux critiques parues sur les films. Il serait souhaitable que cette information puisse être intégrée au programme pour le rendre encore plus attrayant.

En résumé, la problématique est double : d’une part il faut être en mesure de fournir une même infor-mation – le programme de cinéma – sous les formes les plus variées, d’autre part il faut « récupérer » tout ce qui peut enrichir cette information, et intégrer le tout dans un format cohérent. Nous allons explorer dans la suite de ce chapitre comment XML/XSLT répond à ce double besoin.

1.2

XML, format universel

XML constitue un moyen de rendre un même contenu accessible à plusieurs applications. Considérons le cas des informations propres au cinéma, à savoir son nom, son adresse et la station de métro la plus proche :

L’Epée de bois, 100 rue Mouffetard, métro Censier-Daubenton

Ces quelques informations constituent un contenu susceptible d’apparaître sur de nombreux supports différents : des affiches de film, un magazine des spectacles à Paris, de très nombreux sites web, des plaquettes commerciales, un téléphone portable, etc. Dans un contexte cloisonné où ces différents supports sont produits indépendamment les uns des autres, ce contenu est habituellement dupliqué autant de fois que nécessaire, et associé à un format propre à chaque support.

Dans la mesure où les applications gérant ce contenu ne communiquent pas, cette duplication et cette hétérogénéité des formats, adaptés à chaque type d’exploitation de ce contenu, sont légitimes. Si, en revanche, on se place dans un environnement connecté au réseau et favorisant les échanges d’information, duplication et hétérogénéité deviennent beaucoup moins justifiables. La duplication induit un coût, de transformation ou de stockage, et l’hétérogénéité peut rendre inaccessible ou inexploitable une information pourtant présente.

(15)

1.2. XML, FORMAT UNIVERSEL 15

1.2.1

Qu’est-ce que XML ?

XML est donc d’abord destiné à représenter des contenus indépendamment de toute application. Il s’appuie pour cela sur la combinaison de plusieurs principes simples et généraux pour la représentation et l’échange d’information. Voici une représentation XML de notre cinéma :

Exemple 1 Représentation XML d’un cinéma

<?xml version="1.0" encoding="ISO-8859-1"?><CINEMA><NOM>Epée de Bois </NOM><ADRESSE>100, rue Mouffetard</ADRESSE><METRO>Censier-Daubenton </METRO></CINEMA>

Une information codée en XML est donc simplement représentée sous forme d’une chaîne de carac-tères. Cette chaîne débute obligatoirement par une déclaration XML :

<?xml version="1.0" encoding="ISO-8859-1"?>

qui indique que la chaîne contient des informations codées avec la version 1.0 de XML, et que le jeu de caractères utilisé est conforme à la norme ISO-8859 définie par l’Organisation Internationale de Standard-isation (ISO) pour les langues latines. Cette norme est adaptée à l’usage du français puisqu’elle permet les lettres accentuées commme le ’é’ dans le motEpée.

1.2.2

Structuration avec XML

La représentation sous forme de chaîne de caractères n’exclut pas la structuration de l’information. Par exemple, la chaîne

« L’adresse du cinéma Épée de Bois est 100, rue Mouffetard et se trouve près de la station de métro Censier-Daubenton »

contient la même information que la chaîne XML précédente, mais est difficilement exploitable par un outil informatique car la structure de la phrase est cachée. Cette structure est marquée, en XML, par des balises1encadrées par les symboles  et . Les balises CINEMA , NOM , /NOM , ADRESSE ,  /ADRESSE , METRO , /METRO et /CINEMA décomposent ainsi le contenu en trois parties textuelles :

Epée de Bois;

100, rue Mouffetard; Censier-Daubenton.

On peut constater que les balises forment des parenthèses autour de fragments de la chaîne XML. On trouve dans notre exemple les « parenthèses »  CINEMA . . . /CINEMA ,  NOM . . . /NOM ,  ADRESSE . . . /ADRESSE , METRO . . . /METRO . Dans ces paires de balises, la première est appelé balise ouvrante et la deuxième la balise fermante. Voici la terminologie établie pour désigner les constituants d’une chaîne XML :

une paire de balises ouvrante et fermante et le fragment qu’elles entourent constituent un élément XML ;

le nom de la balise est le type de l’élément ;

le contenu d’un élément XML est obtenu en enlevant les balises qui l’entourent.

(16)

La structuration avec XML permet d’une part de désigner certaines parties du contenu avec des noms d’éléments, et d’autre part de structurer ce contenu en définissant une hiérarchie entre les éléments. Une des principales règles de structuration est en effet que le parenthésage défini par les balises doit être imbriqué : si une balise B est ouverte entre deux balises A et /A définissant un élément, elle doit également être fermée par  /B entre ces deux balises. Cette contrainte introduit une hiérarchie entre les éléments définis par les balises. Par exemple, l’élément ADRESSE 100, rue Mouffetard /ADRESSE est un sous-élément de l’élément défini par la balise  CINEMA . Ce dernier englobe tout le document (sauf la première ligne) et est appelé l’élément racine du document.

On peut noter que le nom des balises, ainsi que l’imbrication de ces balises, sont totalement libres : il n’existe pas en XML de règles prédéfinies. Cela permet à chacun de définir son propre langage pour décrire ses données. L’Épée de bois s’est défini un langage basé sur le vocabulaireCINEMA,NOM,ADRESSEet METRO, et une règle de construction très simple consistant à imbriquer dans  CINEMA les trois autres éléments. Nous parlerons parfois de « dialecte » pour désigner un langage défini avec XML.

La structure hiérarchique d’un contenu XML devient plus explicite si on ajoute des changements de ligne et des espaces dans le document :

Exemple 2 Représentation XML avec indentation

<?xml version="1.0" encoding="ISO-8859-1"?> <CINEMA>

<NOM>Epée de Bois</NOM>

<ADRESSE>100, rue Mouffetard</ADRESSE> <METRO>Censier-Daubenton</METRO>

</CINEMA>

Cette chaîne est considérée comme identique à la première car les caractères blancs et les sauts de ligne entre deux balises ne sont pas pris en compte par un traitement. L’indentation est souvent utilisée pour clar-ifier un contenu XML, sans avoir d’impact sur ce contenu lui-même. En fait, ce que cette pratique suggère, c’est qu’une approche fructueuse pour faciliter la compréhension et le raisonnement sur une information structurée avec XML est de considérer que cette information est un arbre, et pas une chaîne de caractères. La figure 1.1 montre l’arbre correspondant au cinéma « L’Epée de bois ». Il a pour racine un élément  CINEMA donc le contenu est lui-même constitué des trois sous-éléments  NOM ,  ADRESSE et  METRO . Chacun de ces trois sous-éléments a un contenu qui est du texte simple.

CINEMA NOM Épée de bois ADRESSE 100, rue Mouffetard METRO Censier-Daubenton

Figure 1.1: Représentation arborescente d’un contenu XML

Cette représentation, plus abstraite, permet de mettre l’accent sur les deux aspects vraiment essentiels d’un contenu structuré avec des balises XML. En premier lieu elle montre quels sont les noms d’éléments qui décomposent et désignent les différentes parties du contenu. En second lieu elle permet de situer précisément la place de chaque élément au sein de la hiérarchie globale. Il est très important de noter dès maintenant que ces deux aspects sont indissociables : un élément est caractérisé à la fois par son nom et par sa place dans l’arbre XML. Concrètement, cela implique que tout traitement de données XML – par exemple en vue de les mettre en forme pour une publication web – se base sur des outils permettant de

(17)

1.2. XML, FORMAT UNIVERSEL 17 choisir des éléments par leur nom, ou par leur position, ou par les deux dimensions utilisées simultanément. Le principal outil utilisé dans ce livre pour sélectionner des éléments XML est le langage XPath, mais nous donnerons également un aperçu des interfaces de programmation Sax et DOM qui remplissent la même fonction.

Voici un exemple plus général illustrant la structure d’un document. Il développe la description du cinéma « L’Epée de bois ». Ce cinéma a deux salles, chacune représentée par un élément XML de type  SALLE . Pour chaque salle on connaît le titre du film projeté et les horaires des séances. La première salle a également un sous-élément de type  REMARQUE qui est absent pour les deux autres salles. Exemple 3 ExXML1.xml : Un cinéma, avec salles et séances

<?xml version="1.0" encoding="ISO-8859-1"?> <CINEMA>

<NOM>Epée de bois</NOM>

<ADRESSE>100, rue Mouffetard</ADRESSE> <METRO>Censier-Daubenton</METRO> <SALLE NO=’1’ PLACES=’320’>

<TITRE>Alien</TITRE> <REMARQUE>Reservation conseillée</REMARQUE> <SEANCES> <SEANCE>15:00</SEANCE> <SEANCE>18:00</SEANCE> <SEANCE>21:00</SEANCE> </SEANCES> </SALLE>

<SALLE NO=’2’ PLACES=’120’> <TITRE>Vertigo</TITRE> <SEANCES> <SEANCE>22:00</SEANCE> </SEANCES> </SALLE> </CINEMA>

Cet exemple introduit un nouvel aspect de la représentation d’une information en XML : les attributs. Dans les premiers exemples donnés précédemment, toute l’information concernant un type d’élément était codée dans le contenu des éléments, ou, autrement dit, dans le texte entouré par les balises de l’élément. Ici (exemple 3), le numéro et le nombre de places disponibles pour chaque salle ne font pas partie du contenu de l’élément correspondant, mais sont indiqués au sein des balises même sous forme d’attributsNO et PLACES. La même information aurait pu être codée avec des sous-éléments.

La figure 1.2 montre l’arbre XML. On peut en tirer quelques constatations générales : cet arbre n’est pas équilibré (certaines branches sont plus longues que d’autres) ;

certains types d’éléments se répètent (cas des salles et des séances) et d’autres pas (cas du nom du cinéma) ;

certains types d’éléments apparaîssent régulièrement comme sous-élément d’un autre type d’élément (cas des salles qui sont des sous-éléments des cinémas et des titres qui sont des sous-éléments des salles) ;

les éléments de certains types sont optionnels (cas des remarques).

Nous utiliserons abondamment la représentation arborescente pour soutenir nos explications sur les mécanismes de transformation XSLT. Elle permet de s’affranchir de détails inutiles (comme, par exemple : d’où vient cette chaîne ? comment est-elle indentée ?) et de travailler sur une représentation claire et pertinente du contenu et de sa structuration.

(18)

CINEMA NOM Épée de bois ADRESSE 100, rue Mouffetard METRO Censier Daubenton SALLE NO=1, PLACES=320 TITRE Alien REMARQUE Réservation conseillée SEANCES SEANCE 15:00 SEANCE 18:00 SEANCE 21:00 SALLE NO=2, PLACES=120 TITRE Vertigo SEANCES SEANCE 22:00

Figure 1.2: Arbre d’un document XML complété

1.2.3

Documents XML

Jusqu’à présent nous avons parlé de « chaîne de caractères » sans faire d’hypothèses sur l’origine ou le stockage de cette chaîne : cette dernière peut être placée dans un fichier, mais il peut également s’agir d’un flux (ou message) échangé entre deux applications, ou d’une information engendrée à partir d’une application. Par exemple, la plupart des systèmes de bases de données actuels permettent de générer des documents XML à partir des données stockées.

Dans le cas d’un stockage fichier, l’information codée en XML peut être affichée et modifiée par un outil de traitement de texte standard. Il est ainsi possible de visualiser et modifier un document XML très facilement et sans outil sophistiqué. Pour des raisons de simplicité, c’est la situation que nous envisagerons prioritairement dans ce qui suit.

Le caractère persistant (cas d’un fichier) ou transitoire (cas d’un message) d’une information codée avec XML sont cependant des aspects secondaires tant qu’on ne s’intéresse pas à des problèmes d’architecture sur lesquels nous reviendrons plus tard. Nous utiliserons uniformément dans ce qui suit le terme de docu-ment XML pour désigner un contenu structuré avec des balises XML, et ce quelle que soit la nature physique et la durée d’existence de ce contenu.

La notion de document en XML est un peu plus complète que celle d’un arbre d’éléments. La déclara-tion XML, ainsi que certaines autres informadéclara-tions qui apparaissent avant l’élément racine sont considérées comme parties intégrantes du document. Nous distinguerons donc soigneusement, à partir de maintenant :

l’élément racine, défini par la première balise rencontrée ;

la racine du document qui comprend, outre l’élément racine, un ensemble de déclarations et d’instructions utiles pour l’interprétation du contenu.

Cette distinction, ainsi que la différence entre document XML et fichier, sont illustrés par l’exemple suivant. Imaginons que dans notre application, chaque salle est gérée par un responsable qui doit tenir à

(19)

1.2. XML, FORMAT UNIVERSEL 19 jour les informations. Il existe alors autant de fichiers XML qu’il y a de salles. Le document relatif à la salle 2 est le suivant :

Exemple 4 Salle2.xml : La salle 2, représentée indépendamment

<?xml version="1.0" encoding="ISO-8859-1"?> <SALLE NO=’2’ PLACES=’120’>

<FILM> <TITRE>Vertigo</TITRE> <AUTEUR>Alfred Hitchcock</AUTEUR> <ANNEE>1958</ANNEE> <GENRE>Drame</GENRE> <PAYS>Etats Unis</PAYS>

<RESUME>Scottie Ferguson, ancien inspecteur de police, est sujet au vertige depuis qu’il a vu mourir son collègue. Elster, son ami, le charge de surveiller sa femme, Madeleine, ayant des tendances suicidaires. Amoureux de la jeune femme Scottie ne remarque pas le piège qui se trame autour de lui et dont il va être la victime... </RESUME> </FILM> <SEANCES> <SEANCE>22:00</SEANCE> </SEANCES> </SALLE>

On retrouve les attributs et les éléments SEANCE , et l’élément FILM auquel on a ajouté des informations complémentaires : année de production, metteur en scène, résumé, etc. Le contenu de ce fichier correspond à un document représenté dans la figure 1.3, avec la racine du document notée Salle2.xml:/, puis l’élément racineSALLE.

Salle2.xml:/

<- - Salle 2 du cinéma Epée de Bois - -> NO=’2’ PLACES=’120’SALLE

FILM TITRE Vertigo AUTEUR Hitchcock ANNEE 1958 GENRE Drame PAYS USA RESUME Scotty... SEANCES SEANCE 22:00

(20)

À partir de l’ensemble des documents décrivant les salles, il est possible de reconstituer un document global en assemblant dans un fichier les informations propres au cinéma, et en important les documents relatifs aux salles. On utilise la notion XML d’entité externe qui permet de faire référence à une source de données externe au fichier XML « principal » (appelé entité document), et d’inclure le contenu de cette source.

Voici une nouvelle représentation du document XML pour le cinéma « L’Epée de bois » (figure 1.2). Il s’agit bien du même document (avec un description plus détaillée des films), mais réparti dans trois fichiers ou entités externes :

Exemple 5 Epee.xml : Fichier constituant par assemblage un document sur le cinéma

<?xml version="1.0" encoding="ISO-8859-1"?>

<?xml-stylesheet href="Cinema.xsl" type="text/xsl"?>

<?xml-stylesheet href="CinemaWML.xsl" type="text/xsl" media="wap"?> <?cocoon-process type="xslt"?>

<!DOCTYPE CINEMA [

<!ENTITY salle1 SYSTEM "Salle1.xml"> <!ENTITY salle2 SYSTEM "Salle2.xml"> ]>

<CINEMA>

<NOM>Epée de bois</NOM>

<ADRESSE>100, rue Mouffetard</ADRESSE> <METRO>Censier-Daubenton</METRO>

<!-- Inclusion du fragment XML décrivant la salle 1 --> &salle1;

<!-- Inclusion du fragment XML décrivant la salle 2 --> &salle2;

</CINEMA>

L’entité document Epee.xml contient dans son entête deux définitions d’entité externes vers les fichiers Salle1.xml et Salle2.xml :

<!ENTITY salle1 SYSTEM "Salle1.xml">\\ <!ENTITY salle2 SYSTEM "Salle2.xml">

Les références vers les entité externes dans l’entité document sont représentées par le nom de l’entité correspondante entouré des symboles&et;:

<!-- Inclusion du fragment XML décrivant la salle 1 --> &salle1;

<!-- Inclusion du fragment XML décrivant la salle 2 --> &salle2;

Dans la représentation arborescente du document XML (figure 1.2), toutes les références vers ces en-tités seront remplacées par le contenu des enen-tités Salle1.xml et Salle2.xml.

Nous serons amené dans la suite de ce livre à généraliser considérablement ce premier exemple où un document XML est obtenu par assemblage de plusieurs sources. Ici nous sommes dans un cas simple où les sources sont d’autres fichiers, mais il est possible d’intégrer des composants très divers, incluant des parties « statiques » (par exemple un ou plusieurs fichiers, éventuellement répartis sur l’Internet) et des parties « dynamiques », fragments créés à la volée, par exemple par extraction à partir d’une base de données.

(21)

1.3. PUBLICATION DE DONNÉES AVEC XSLT 21

1.3

Publication de données avec XSLT

Nous allons maintenant montrer comment, à partir d’un document XML proposant un contenu structuré, on obtient avec des transformations XSLT des publications de ce contenu destinées aux supports les plus var-iés. L’idée de base d’un environnement XML/XSLT est de séparer le traitement des données du processus de publication.

le traitement des données consiste à les mettre sous forme de document XML obéissant à une struc-ture arborescente donnée (par exemple la strucstruc-ture cinéma-salle-film illustrée dans ce qui précède) ; la publication des données consiste à extraire un contenu d’un document XML et à le mettre dans for-mat reconnu par une application de publication particulière (par exemple au forfor-mat HTML reconnu par les navigateurs web).

Dans un tel environnement les responsabilités sont clairement partagées. On y distingue ceux qui gèrent les contenus et doivent établir les documents XML, éventuellement à partir de plusieurs sources de données – nous reviendrons sur cet aspect ultérieurement – de ceux qui doivent créer une mise en forme pour tel ou tel support. Nous prenons comme exemple les documents XML de la section précédente, sans avoir besoin de faire d’hypothèses sur l’origine de ces documents. Les transformations XSLT vont permettre d’obtenir trois versions différentes de ce même contenu :

un (petit) site web, affichant les informations sur le cinéma, ses salles et ses séances ; un site WAP permettant de consulter sur un téléphone mobile les mêmes informations ;

enfin un document PDF donnant l’ébauche de ce qui pourrait être un « Officiel des spectacles » imprimé.

1.3.1

Site web (HTML)

HTML est un langage de balisage dédié à l’échange de documents sur le Web sous forme de document hypertextes2dans lesquels certains mots ou groupes mots (les ancres) servent d’accès à d’autres documents

HTML, parfois situés sur d’autres sites web. L’utilisation des ancres permet de « naviguer » sur le Web sans même connaître ses notions de base (le protocole HTTP, le système d’adressage par des URL, etc).

Contrairement à XML, HTML fournit un ensemble fixe de balises auxquelles sont attachées des fonc-tionnalités précises de présentation. L’utilisation des balises HTML est donc avant tout destinée à donner des directives de mise en forme au navigateur qui se charge d’afficher le document. À l’opposé, l’auteur d’un document XML définit son propre vocabulaire de balises, le choix étant guidé par le besoin de décrire au mieux possible la structure et la signification des données.

Nous reviendrons en détail sur le langage HTML, ses différentes versions, et ses rapports avec XML. Ici nous nous contenterons de montrer comment nous pouvons obtenir une version HTML de nos documents XML par transformation XSLT, en commençant par prendre l’exemple très simple de la description d’un film. Voici le document HTML que nous désirons obtenir.

Exemple 6 Vertigo.html : Document HTML pour le film Vertigo :

<html> <head>

<title>Film: Vertigo</title> </head>

<body bgcolor="white">

<img src="Vertigo.gif" height="220" align="left"></img> <h1><i>Vertigo</i></h1> Drame, <i>Etats Unis</i>, 1958

<p> Mis en scène par <b>Alfred Hitchcock</b></p> <h3>Résumé</h3>

Scottie Ferguson, ancien inspecteur de

(22)

police, est sujet au vertige depuis qu’il a vu mourir son collègue. Elster, son ami, le charge de surveiller sa femme, Madeleine, ayant des tendances suicidaires. Amoureux de la jeune femme Scottie ne remarque pas le piège qui se trame autour de lui et dont il va être la victime...

</body> </html>

Il s’agit, une nouvelle fois, d’un arbre dont la racine est l’élément html , avec deux fils :  head et body . Le reste du document est du texte libre, encadré par des balises de mise en forme. Sans entrer pour l’instant dans le détail, on peut :

centrer une partie d’un document en utilisant la balise  center ;

différencier différents niveaux de titre de sections (balises h1 , h2 , . . . , h5 ) ; mettre du texte en italique (balise  i ) ou en gras (balise  b ) ;

créer des paragraphes (balise p ) ;

inclure des images (balise img ) qui sont stockées dans des fichiers externes.

Ce document HTML peut tout à fait être vu comme un document XML, avec une structure imposée (notamment pour la racine de l’arbre et ses deux fils), et des noms de balise fixées par la norme HTML. En fait HTML s’est développé indépendamment de XML et s’avère beaucoup moins rigoureux. Les navi-gateurs acceptent par exemple des documents sans la racine  html , et dans de nombreux cas la balise fermante d’éléments vides est considérée comme optionnelle. Une norme récente, XHTML, reconsidère la définition de HTML comme un « dialecte » XML.

Figure 1.4: Page HTML affiché avec Netscape

La figure 1.4 montre l’affichage de ce document dans le navigateur Netscape. On peut voir que le titre du film apparaît en caractères gras italiques, le pays d’origine en caractères italiques et le nom du réalisateur en caractères gras. De plus le texte entoure une image de l’affiche (version française) du film.

Transformations XSLT

Nous allons utiliser une feuille de style XSLT pour produire automatiquement le document HTML à partir d’un document XML, appelé document source dans ce qui suit. Comme c’est la première fois que nous

(23)

1.3. PUBLICATION DE DONNÉES AVEC XSLT 23 rencontrons ce langage, nous commençons par une brève introduction permettant d’en comprendre les principes de base.

L’application d’une feuille de style XSLT consiste à parcourir les nœuds du document XML, et à appliquer des règles de transformation à ces nœuds. La notion de règle (nommées template) est centrale dans XSLT, et la bonne compréhension des aspects suivants est essentielle.

une règle s’applique toujours dans le contexte de l’un des nœuds du document source ;

l’application de la règle consiste à produire un fragment de document, qui peut combiner du texte et des données extraites du document XML.

Voici un premier exemple de règle de transformation XSLT. Elle consiste à produire une phrase simple chaque fois qu’un élément FILM est rencontré dans le document source.

<xsl:template match="FILM">

Ceci est le texte produit par application de cette règle. </xsl:template>

On constate qu’une règle est un élément XML défini par la balisexsl:template. L’attributmatch="FILM" est le motif de sélection de cette balise et indique à quel(s) type(s) d’éléments du document XML traité

s’applique la règle. La règle ci-dessus s’appliquera donc toujours dans le contexte d’un élément de type FILM. Enfin le contenu de l’élémentxsl:templateest le corps de la règle et définit le texte produit à chaque fois que la règle s’applique.

Un programme XSLT est en général constitué de plusieurs règles dont chacune peut s’appliquer à différents parties d’un document XML. Chaque règle produit un sous-arbre spécifique quand elle rencontre un élément déclencheur, et l’assemblage de ces sous-arbres constitue le résultat de la transformation. Dans le cas le plus simple, on spécifie des règles différentes pour chaque type d’élément d’un document, comme nous l’avons fait ci-dessus pour l’élément FILM du document XML à transformer. Parfois la distinction par le type de l’élément peut être insuffisante et/ou trop imprécise pour choisir les règles et des motifs de sélection plus complexes, que nous présenterons plus tard, s’avèrent nécessaires.

Le corps de la règle indique le texte produit quand un nœud du bon type est rencontré dans le document XML. Dans notre premier exemple, le texte produit est toujours

Ceci est le texte produit par application de cette règle.

et ce quel que soit le contenu de l’élément FILM . En pratique ce genre de règle n’est évidemment pas très intéressante, et on rencontre plus souvent des règles où le texte reprend et réorganise des parties du document XML traité. Rappelons que la règle s’applique dans le contexte d’un nœud : le principe consiste alors à sélectionner, à partir de ce nœud, les parties du document qui vont être produites par la règle.

Prenons l’exemple du document XML représentant le film Vertigo. Quand notre règle s’exécute, le nœud contexte est l’élément racine de l’arbre. On a accès, depuis cette racine, à tous les fils du nœud  FILM , soit les éléments  TITRE ,  AUTEUR ,  ANNEE , etc., mais aussi à d’autres nœuds comme par exemple les nœuds descendants (les fils des fils, etc...) ou les nœuds parents et ancêtres.

Pour sélectionner le contenu d’un élément, on utilise l’élément XSLTxsl:value-ofen indiquant simplement le chemin d’accès à partir du nœud courant. Par exemple le titre du film est obtenu par :

<xsl:value-of select="TITRE"/>

Le fait de préfixer parxsltoutes les balises relevant du langage XSLT permet au processeur de dis-tinguer les éléments qui doivent être simplement inclus dans le résultat, des éléments qui correspondent à des instructions XSLT.

La figure 1.5 montre l’interprétation dexsl:value-of, avec ses deux paramètres déterminants : le contexte d’exécution, qui est ici l’élément  FILM , et le chemin d’accès, en l’occurrence l’élément  TITRE , fils de l’élément-contexte. Il s’agit ici de l’exemple le plus simple – mais aussi le plus courant – où on accède aux descendants directs d’un élément, mais nous verrons que le mode de désignation des éléments à partir d’un nœud contexte est beaucoup plus général.

(24)

FILM TITRE Vertigo AUTEUR Hitchcock ANNEE 1958 GENRE Drame PAYS USA RESUME Scotty... select="TITRE"

Contexte d’application de la règle XSLT

Figure 1.5: Extraction des informations dans une règle XSLT

Nous sommes maintenant en mesure d’enrichir notre première règle pour produire un premier docu-ment HTML sommaire, mais complet.

<xsl:template match="FILM"> <html> <head> <title>Film: <xsl:value-of select="TITRE"/> </title> </head> <body>

Ici je peux mettre d’autres informations sur le film </body>

</html>

</xsl:template>

L’élément  xsl:value-of select="TITRE"/ est remplacé à l’exécution par la valeur de l’élément  TITRE , soitVertigo. Appliquée à Vertigo.xml, cette règle produira donc le résultat suiv-ant : <html> <head> <title>Film: Vertigo </title> </head> <body>

Ici je peux mettre d’autres informations sur le film </body>

</html>

Bien entendu on peut appliquer la même règle à tout document XML ayant la même structure que Vertigo.xml.

Transformation XML - HTML

Notre objectif est donc d’obtenir le document HTML de l’exemple 6 par transformation XSLT du document Vertigo.xml ci-dessous.

(25)

1.3. PUBLICATION DE DONNÉES AVEC XSLT 25

<?xml version="1.0" encoding="ISO-8859-1"?>

<?xml-stylesheet href="Film.xsl" type="text/xsl"?>

<?xml-stylesheet href="FilmWML.xsl" type="text/xsl" media="wap"?> <?cocoon-process type="xslt"?> <FILM> <TITRE>Vertigo</TITRE> <AUTEUR>Alfred Hitchcock</AUTEUR> <ANNEE>1958</ANNEE> <GENRE>Drame</GENRE> <PAYS>Etats Unis</PAYS>

<RESUME>Scottie Ferguson, ancien inspecteur de police, est sujet au vertige depuis qu’il a vu mourir son collègue. Elster, son ami, le charge de surveiller sa femme, Madeleine, ayant des tendances suicidaires. Amoureux de la jeune femme Scottie ne remarque pas le piège qui se trame autour de lui et dont il va être la victime...

</RESUME> </FILM>

De manière générale le résultat est obtenu en insérant dans des balises HTML des extraits du document XML. Tous ces extraits sont facilement accessibles à partir de la racine  FILM , et nous allons donc pouvoir nous contenter d’une seule règle qui va « piocher », à partir de la racine, les différents constituants décrivant le film, et produire les fragments HTML appropriés.

La figure 1.6 illustre ce principe par deux arbres superposés : l’arbre supérieur correspond au document XML qui doit être transformé en HTML; l’arbre inférieur définit la structure de la page HTML à générer (pour une meilleure représentation, la racine de l’arbre est en-bas). Tous les nœuds sauf sept feuilles sont étiquetés par des balises HTML qui définissent la structure du document produit. Les autres noeuds sont de typexsl:value-ofet définissent, pour leur part, la partie dynamique du contenu, obtenue par extraction de certains éléments du document XML. On peut noter que l’élément TITRE est référencé trois fois et que l’ordre des instructions de substitution ne correspond pas à l’ordre des éléments insérés dans le résultat.

La règle de transformation, insérée dans une feuille de style complète, crée un document HTML pour chaque film, autrement dit pour chaque document XML ayant la même structure que Vertigo.xml. Son corps correspond à l’arbre inférieur dans la Figure 1.6.

Exemple 8 Film.xsl : Programme de transformation XSLT correpondant à la Figure 1.6.

<?xml version="1.0" encoding="ISO-8859-1"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="html"/> <xsl:template match="FILM"> <html> <head> <!-- Titre du film -->

<title>Film: <xsl:value-of select="TITRE"/> </title>

</head>

<body bgcolor="white"> <p>

<!-- Insérer une image GIF avec le titre comme nom --> <img SRC="{TITRE}.gif" align="left" height="220"/> <h1>

(26)

FILM TITRE Vertigo AUTEUR Hitchcock ANNEE 1958 GENRE Drame PAYS USA RESUME Scotty... xsl:template match="FILM" html head title Film: xsl:value-of body p img h1 i xsl:value-of xsl:value-of i xsl:value-of xsl:value-of p Mise . . . b xsl:value-of h3 Résumé: xsl:value-of select="TITRE" select="TITRE" select="TITRE" select="GENRE" select="P A YS" select="ANNEE" select="A UTEUR" select="RESUME" Figure 1.6: Transformation XSLT

(27)

1.3. PUBLICATION DE DONNÉES AVEC XSLT 27

<i><xsl:value-of select="TITRE"/></i> </h1>

<!-- Genre, pays, et année du film --> <xsl:value-of select="GENRE"/>,

<i> <xsl:value-of select="PAYS"/></i>, <xsl:value-of select="ANNEE"/>

</p> <p>

<!-- Auteur du film -->

Mis en scène par <b><xsl:value-of select="AUTEUR"/></b> <!-- Résumé du film --> <h3>Résumé</h3> <xsl:value-of select="RESUME"/> </p> </body> </html> </xsl:template> </xsl:stylesheet>

Un programme XSL comme celui présenté ci-dessus est un document XML interprété par un processeur XSLT : on peut vérifier que c’est un arbre constitué d’une imbrication de balises ouvrantes et fermantes. Il doit obéir à certaines règles de structuration et de nommage des balises. En particulier toutes les balises propres à XSLT doivent être préfixées parxsl:avec que le processeur puisse les distinguer des balises à insérer dans le résultat. Ce préfixe définit un espace de nom qui caractérise les balises XSLT.

L’élément racine du document XSLT Film.xsl est de typexsl:stylesheetet contient deux sous-éléments de typexsl:outputetxsl:template. L’élément xsl:outputinforme le processeur XSLT que le document généré est un document HTML conforme à la version 4.0 et utilisant le codage “iso-8859-1”.

Chemins complexes

Nous prenons maintenant l’exemple de la production du document HTML décrivant une salle de cinéma pour illustrer la capacité de XSLT à spécifier des chemins d’accès complexes pour extraire des informations d’un document XML.

Dans le document HTML montrant un film, tous les nœuds TITRE , AUTEUR et autres auxquels on accédait était les fils (au sens de : descendants directs) de l’élément  FILM tenant lieu de contexte de la règle. Le cas d’un document décrivant une salle de cinéma présente une structure plus riche. La figure 1.7 montre la salle 1 de notre cinéma. Si on prend comme contexte d’une règle de transformation le nœud SALLE , on constate que :

certaines informations (le numéro de la salle, le nombre de places) sont représentées comme des attributs ;

le nœud a trois fils :  FILM , REMARQUE et SEANCES ;

les informations décrivant le film sont des petits-fils de  SALLE :  TITRE et AUTEUR en sont séparés par  FILM ;

l’élément SEANCE est petit-fils de SALLE , et peut de plus être répété un nombre quelconque de fois ;

enfin l’élément  REMARQUE est optionnel : il apparaît pour la salle 1, mais pas pour la salle 2 (voir figure 1.3, page 19).

Ces nouvelles particularités rendent plus complexe l’accès aux informations permettant de créer un document HTML à partir d’un nœud de typeSALLE. Gardons pour l’instant le principe de n’utiliser qu’une

(28)

15:00 18:00 21:00 Réservation conseillée vaisseau spatial... PLACES=320 chemin "FILM/TITRE" "REMARQUE" chemin chemin SEANCES/SEANCE boucle for-each chemin "@NO"

Contexte d’application de la règle

AUTEUR ANNEE GENRE PAYS RESUME

FILM

SALLE

SEANCES

SEANCE SEANCE SEANCE

REMARQUE

USA

Alien Scott Science-Fiction 1979 Près d’un

TITRE

NO=2

Figure 1.7: Le document XML pour la première salle

seule règle faisant appel à desxsl:value-of. Les parties du document Salle1.xml sont alors désignées par des chemins qui prennent tous leur origine du nœud  Salle . Voici quelques exemples, illustrés dans la figure 1.7.

l’attribut d’un élément est désigné par la concaténation du symbole ’@’ et du nom de l’attribut ; donc le numéro de la salle est désigné parselect="@NO";

le descendant d’un élément est désigné en donnant les nœuds successifs rencontrés à chaque niveau de la branche menant à l’élément ; donc le titre du film est désigné parselect="FILM/TITRE"; pour parcourir toutes les occurrences d’un même type d’élément, on peut effectuer une boucle xsl:for-eachsur l’ensemble des séances désignées parselect="SEANCES/SEANCE"; enfin l’élément contexte lui-même est désigné par le symbole ’.’, comme dansselect=".". Voici la règle produisant une présentation HTML et récupérant les informations en exprimant les chemins présentés ci-dessus.

<xsl:template match="SALLE">

<!-- Extraction d’attribut : no de salle et places --> <h2>Salle No <xsl:value-of select="@NO"/></h2>

<h3>Capacité: <xsl:value-of select="@PLACES"/> places</h3>

<!-- Description du film: tous les chemins commencent par FILM/ --> <h3>Film: <a href="{FILM/TITRE}XML.html">

<b> <xsl:value-of select="FILM/TITRE"/> </b></a></h3>

de <b> <xsl:value-of select="FILM/AUTEUR"/> </b><br/><i> <xsl:value-of select="FILM/PAYS"/></i>,

<xsl:value-of select="FILM/ANNEE"/>

<!-- Boucles sur toutes les séances --> <h3>Séances</h3>

<ol>

(29)

1.3. PUBLICATION DE DONNÉES AVEC XSLT 29

<li> <xsl:value-of select="."/></li> </xsl:for-each>

</ol>

<xsl:for-each select="REMARQUE">

<font color="red"><xsl:value-of select="."/></font> </xsl:for-each>

</xsl:template>

L’instructionxsl:for-eachpermet de créer une boucle pour ajouter toutes les séances et remar-ques dans le résultat. La transformation définie par le contenu d’un élément  xsl:for-each ne s’applique pas à l’élément qui est en cours de transformation (la salle), mais aux éléments sélectionnés par l’attributselect(les séances). Ainsi, l’instruction  xsl:value-of select="."/ dans la première boucle sera remplacé par le contenu de chaque séance retrouvée.

Appel de règle

Il reste à ajouter les balises  html , head et body pour obtenir un document HTML complet. Jusqu’à présent nous nous sommes volontairement limités à des exemples de productions basés sur une seule règle. En pratique on est le plus souvent amené à définir plusieurs règles dans un programme XSLT, et à déclencher des appels de règles à partir d’autres règles.

La règle initiale s’applique en général à la racine du document XML, désignée par ’/’. Elle génère un document HTML complet avec un élément racine html et deux sous-éléments head et title . Cette règle est la première règle appliquée par le processeur XSLT pendant la transformation d’un docu-ment XML.

<xsl:template match="/"> <html>

<head><title>Salle: <xsl:value-of select="SALLE/@NO"/></title></head> <body bgcolor="white">

<xsl:apply-templates select="SALLE"/> </body>

</html>

</xsl:template>

L’élément body ne contient qu’un seul sous-élément qui est une instruction XSLT de type xsl:apply-templates. Le processeur XSLT remplace cet élément par le résultat de la transformation qu’il dé-clenche. Autrement dit on va appliquer aux éléments SALLE fils de la racine ’/’ du document la règle spécifique à ce type d’élément, et insérer entre les balises  body et  /body le fragment HTML produit.

L’intérprétation du mécanisme d’appel de règles est donné dans la figure 1.8. La partie supérieure montre l’arbre XML, et la partie inférieure les deux règles du programme XSLT.

La première règle (en bas à gauche) s’applique à l’élément racine, ’/’. Elle produit successivement un élément html , racine de l’arbre résultat, puis deux fils, head et body .

Au sein de l’élément  body se trouve une instruction d’application d’une règle aux éléments fils de l’élément courant qui sont de typeSALLE. Le processeur XSLT cherche donc si un tel élément existe : c’est le cas et la deuxième règle (en bas à droite) est donc déclenchée. Elle produit des fragments HTML qui viennent s’insérer dans l’élément  body .

La figure 1.9 montre le résultat obtenu alors, tel qu’il s’affiche avec Netscape. Réutilisation de règles

Passons maintenant à un dernier stade pour compléter cette introduction à XSLT. Nous voulons produire la page HTML récapitulant tout le programme proposé par L’Épée de bois. La figure 1.10 montre le résultat obtenu3. Il apparaît clairement que la présentation de chaque salle est identique à celle qui était obtenue

(30)

TITRE AUTEUR ANNEE GENRE PAYS RESUME SEANCES FILM SALLE SEANCE <xsl:template match="SALLE">

Vertigo Hitchcock 1958 1958 USA Scotty... 22:00

Transfromation de <SALLE>

select="SALLE"

<xsl:template match="/">

... ...

Transfroamtion du document (racine)

PLACES="120" html xsl:value-of xsl:value-of h3 h2 xsl:apply-templates body head /

"Salle No" "Capacité:" "places" NO="2"

Figure 1.8: Appel de règles à partir d’autres règles

par application de la règle destinée à présenter une salle individuelle.

Pour créer la présentation d’un cinéma, nous allons donc reprendre la règle existante de traitement des éléments SALLE, et déclencher son application. On utilise pour cela un élément xsl:apply-template. Voici tout d’abord la règle s’appliquant à l’élément racine du document XML.

<xsl:template match="/"> <html>

<head><title>Programme de <xsl:value-of select="CINEMA/NOM"/> </title> </head> <body bgcolor="white"> <xsl:apply-templates select="CINEMA"/> </body> </html> </xsl:template>

La seconde règle d’applique dans le contexte d’un élément  CINEMA . Elle extrait des informa-tions relatives au cinéma, et propage la production de code HTML par un nouvel appel à xsl:apply-templates.

<xsl:template match="CINEMA">

<h1><i> <xsl:value-of select="NOM"/> </i> </h1><hr/> <xsl:value-of select="ADRESSE"/>, <i>Métro: </i> <xsl:value-of select="METRO"/> <hr/>

Figure

Figure 1.2: Arbre d’un document XML complété
Figure 1.4: Page HTML affiché avec Netscape
Figure 1.8: Appel de règles à partir d’autres règles par application de la règle destinée à présenter une salle individuelle.
Figure 1.9: Copie écran du résultat de la transformation de Salle1.xml
+7

Références

Documents relatifs

PSOA RuleML’s extended “psoa atoms” (e.g., allowing dependent slots and explicit tuples) lead to extensions of Deliberation PSOA RuleML/XML Version 1.03 (relative to De-

Indicateurs de performance : IP C15.1 : Les phénomènes dangereux et les situations dangereuses liés au bien, à son environnement et à l'activité de maintenance

2008/420 - Désignation d'un représentant de la Ville de Lyon au sein du Comité Local d'Information et de Concertation auprès des sociétés Arkéma, Bluestar Silicone, Huntsman,

Les statuts de l’institut – Faculté de droit prévoient – Article 5 – que le Conseil de la Faculté comprend 40 membres dont 6 représentants des Collectivité Territoriales et

Voyons une illustration du fonctionnement des cônes avec une illusion d’optique colorée Explication : après avoir fixée les zones colorées vertes les cônes capteurs de lumière

Dans ce travail, nous présentons la formulation théorique et la validation numérique d'un nouvel élément fini de coque isoparamètrique DMQS (Discrete Mindlin Quadratic for Shell),

Example 3-1:XSD définition pour une simple recette de cuisine 9 B.Solution 2: Donner un namespace au code du schéma 10 Example 3-2:XSD définition pour une simple recette 10..

Introduction Pr´ esentation XSLT Comment transformer XML avec XSLT Programme XSLT.. Transformation de documents XML