Vous êtes sur la page 1sur 11

Transformations XSL

Fabrice Rossi 12 mars 2003


Les exercices prsents dans ce document sont construits en partie grce aux exercices de [5] et [6]. e e a

Instructions spciques au CRIO UNIX e


1. dans chaque terminal, utilisez tcsh (en tapant tcsh) 2. eectuez les rglages ncessaires au bon fonctionnement des dirents programmes utiliss, en tapant e e e e source /home/perm/ufrmd/rossi/xml/env.csh

Au dbut de chaque sance : e e

On lance une transformation par la commande transform entre style sortie. Cette transformation e est base sur le chier style et sapplique au chier entre. Le chier sortie contient le rsultat de la e e e transformation. Il est facultatif : en cas dabsence, le rsultat sache directement a lcran. e ` e

2
2.1

Une premi`re approche de XSLT e


Introduction

XSLT (cf [1]) est un dialecte XML qui permet de dcrire des transformations abitraires a raliser sur des e ` e documents XML. Lide est de permettre de passer facilement dun dialecte XML a un autre format (souvent e ` XML, mais en fait assez libre), par exemple pour traduire un chier XML en une page HTML. Le langage propos est assez dlicat a ma e e ` triser pour diverses raisons : il est bas sur XPath (cf [2]), un langage a la syntaxe non XML qui permet de dcrire des ensembles de e ` e nuds dans un document XML. XPath est tr`s puissant et assez compact, mais aussi assez complexe ; e XSLT est un langage dclaratif : on donne des r`gles de transformation que le moteur se charge e e dappliquer, sans quon crive la squence des oprations. Cette faon de procder est droutante pour e e e c e e de nombreux programmeurs ; XSLT est un langage fonctionnel : beaucoup de transformations sexpriment de faon rcursive, ce qui c e nest pas toujours facile a apprhender. ` e Comme DOM, XSLT est bas sur une reprsentation par arbre du document XML trait. Exactement comme e e e dans DOM, la racine de larbre XSLT reprsente le document tout entier, alors que la racine XML est le ls e principal de la racine XSLT. Notons quil est illusoire dans ce tutoriel de vouloir dpasser un niveau lmentaire. Le lecteur intress par e ee e e les subtilits pourra se reporter aux deux normes dj` cites ([1] et [2]), ainsi qu` [3] qui est particuli`rement e ea e a e complet et clair.

2.2

Un programme XSLT

Un programme XSLT est constitu dun ensemble de r`gles de transformation. Chaque r`gle comporte e e e deux parties : 1. un motif (pattern) qui prcise les nuds de larbre XSLT auxquels la r`gle peut sappliquer ; e e 2. un mod`le de rsultat (template) qui indique ce que le moteur XSLT doit produire (en gnral un e e e e fragment de document XML) quand il applique la r`gle. e

F. Rossi 12 mars 2003

p. 1

XML

XSLT

Le fonctionnement dun programme XSLT est bas sur la notion de nud courant et de liste de nuds e courants. A lorigine, la liste de nuds courants est rduite a la racine de larbre XSLT. Le rsultat du e ` e programme est celui de la transformation de cette racine. A un moment donn de lexcution du programme, e e on doit calculer le rsultat du programme sur une liste de nuds courants. Par dnition, ce rsultat est e e e obtenu en concatnant le rsultat du programme sur chacun des nuds de la liste. Enn, le rsultat du e e e programme pour un nud est obtenu de la faon suivante : c 1. le moteur XSLT cherche dans les r`gles de transformation celle dont le motif sadapte le mieux au e nud ; 2. le rsultat du programme sur le nud est alors le template associ a la r`gle. e e` e Pour xer les ides, commenons par un exemple basique, fonctionnant a partir du chier XML suivant : e c ` liste-personnes.xml <?xml version="1.0" encoding="ISO-8859-1"?> <liste> <personne> <prnom>John</prnom><nom>Doe</nom> e e </personne> <personne> <prnom>Robert</prnom><nom>Durand</nom> e e </personne> <personne> <prnom>Elanore</prnom><nom>Dupuis</nom> e e e </personne> </liste> On veut produire une version HTML de ce document. La premi`re tape est bien sr de crer lentte du e e u e e document HTML. Pour ce faire, on propose le chier XSLT suivant : perso2html1.xml <?xml version="1.0" encoding="ISO-8859-1"?> <!-- racine du document, prcise le sens du prfixe xsl --> e e <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <!-- format de sortie, ici html --> <xsl:output method="html" doctype-public="-//W3C//DTD HTML 4.0 Transitional//EN" indent="yes"/> <!-- patron pour la racine du document de dpart --> e <xsl:template match="/"> <html> <head><title>Liste de personnes</title> </head> <body> <h1>Liste de personnes</h1> </body> </html> </xsl:template> </xsl:stylesheet> On constate en lisant les commentaires quune r`gle est dclare grce a llment template. Le motif est e e e a ` ee donn par le contenu de lattribut match. Cest une expression au format XPath. Dans notre exemple, e lexpression se rduit a / qui correspond a lunique nud racine (de larbre XSLT). Enn, le mod`le de e ` ` e rsultat est le contenu de llment template, ici du code HTML. Quand on applique la transformation au e ee chier XML, on obtient le chier HTML suivant : liste1.html
1 2 3

1 2 3 4 5 6 7 8 9 10 11 12

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

F. Rossi 12 mars 2003

p. 2

XML <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>Liste de personnes</title> </head> <body> <h1>Liste de personnes</h1> </body> </html>

XSLT

4 5 6 7 8 9 10 11 12 13

2.3

Les appels rcursifs e

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26

Lexemple propos dans la section prcdente est tr`s limit car il ne traite que la racine. Pour aller plus e e e e e loin, il faut pouvoir choisir la liste des nuds courants, ce qui correspond en XSLT a un appel rcursif : lins` e truction apply-templates utilise dans un mod`le de rsultat est remplace par le rsultat du programme e e e e e de transformation appliqu a la liste des enfants du nud courant. Voici un exemple dutilisation de cette e` instruction : perso2html2.xml <?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" doctype-public="-//W3C//DTD HTML 4.0 Transitional//EN" indent="yes"/> <xsl:template match="/"> <html> <head><title>Liste de personnes</title> </head> <body> <h1>Liste de personnes</h1> <ul> <!-- appel rcursif --> e <xsl:apply-templates/> </ul> </body> </html> </xsl:template> <!-- patron pour un elment personne --> e <xsl:template match="personne"> <li><xsl:value-of select="prnom"/> e <xsl:text> </xsl:text> <xsl:value-of select="nom"/></li> </xsl:template> </xsl:stylesheet> Le programme propos produit le rsultat suivant : e e liste2.html

1 2 3 4 5 6 7 8

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>Liste de personnes</title>

F. Rossi 12 mars 2003

p. 3

XML </head> <body> <h1>Liste de personnes</h1> <ul> <li>John Doe</li> <li>Robert Durand</li> <li>El&eacute;anore Dupuis</li> </ul> </body> </html>

XSLT

9 10 11 12 13 14 15 16 17 18 19 20 21 22

Pour comprendre ce qui se passe, il nous faut dabord expliciter quelques instructions XSLT et XPath utilises : e value-of est une instruction XSLT qui est remplace par la traduction en texte de son attribut select e qui doit tre une expression XPath ; e lexpression XPath prnom doit tre interprte comme ceci : elle fabrique lensemble des nuds qui e e ee sont des lments prnom et qui sont ls du nud contexte. Cest une abbrviation de ./prnom, car ee e e e . dsigne le nud contexte alors que / est le symbole XPath qui signie ls. Le nud contexte est e dtermin par les instructions qui englobent lexpression XPath. Dans notre exemple, cest en fait le e e nud courant, mais ce nest pas toujours le cas ; lexpression XPath personne correspond a lensemble des ls du nud contexte qui sont des lments ` ee personne. Nous allons voir comment la r`gle correspond a ce motif est choisie par le moteur XSLT ; e ` enn, linstruction text permet dinsrer du texte dans le rsultat dune r`gle, ce qui est tr`s utile pour e e e e insrer des espaces blancs. e Analysons le fonctionnement du programme : 1. on dmarre le programme avec comme nud courant la racine XSLT : e (a) le moteur choisi la r`gle adapte a la racine : cest ici la premi`re e e ` e (b) le rsultat est obtenu grce au mod`le de rsultat e a e e 2. comme le mod`le de rsultat contient un apply-templates, on relance le programme avec comme liste e e de nuds courants les ls de la racine XSLT, cest-`-dire dans notre exemple le nud liste : a (a) le moteur cherche une r`gle adapte a liste et nen trouve pas. Il utilise alors la r`gle par dfaut e e ` e e suivante : <xsl:template match="/|*"> <xsl:apply-templates/> </xsl:template> Lexpression XPath utilise (/|*) assure quelle peut tre applique a tout lment dun document e e e ` ee XML, ainsi quau document lui-mme (la racine). e (b) le rsultat est obtenu grce au mod`le de rsultat e a e e 3. pour obtenir le rsultat, on relance le programme avec comme liste de nuds courants les ls de liste, e cest-`-dire les personnes : a (a) le moteur choisi la r`gle adapte : cest la deuxi`me r`gle. En eet, pour chaque nud de la e e e e liste (qui est alors le nud courant), le moteur value lexpression XPath de chaque r`gle avec e e comme nud contexte tour a tour tous les anctres du nud courant. Pour un nud personne, on ` e consid`re le p`re, le nud liste. Avec un tel nud contexte, lexpression personne donne comme e e rsultat la liste des lments personne du document XML. Comme le nud courant appartient e ee a cette liste, on consid`re que le motif est valid et on choisit donc la r`gle. ` e e e (b) le rsultat est obtenu grce au mod`le de rsultat : ici, on arrte la rcursivit car il ny pas de e a e e e e e apply-templates. Lutilisation de value-of personne dobtenir le contenu des lments slecee e tionns par les expressions XPath. e

F. Rossi 12 mars 2003

p. 4

XML

XSLT

On remarque que le chier rsultat contient de nombreux espaces blancs et sauts de lignes. Pour comprendre e ce phnom`ne, il faut noter que nous avons simpli la description du traitement en oubliant le fait que les e e e espaces blancs apparaissent sous forme de nuds dans larbre XSLT. De ce fait, quand on traite les nuds rcursivement, on doit tenir compte des textes blancs. Or, il existe une deuxi`me r`gle par dfaut en XSLT : e e e e <xsl:template match="text()|attribute::*"> <xsl:value-of select="."/> </xsl:template> Lexpression XPath text() slectionne tout les nuds de texte ls du nud contexte, alors que lexpression e attribute::* correspond aux attributs du nud contexte (la barre verticale est une union densembles). Enn, lexpression . correspond au nud contexte lui-mme. Pour viter davoir des blancs intempestifs, e e plusieurs solutions sont envisageables : on peut remplacer la r`gle par dfaut par une r`gle vide : e e e <xsl:template match="text()|attribute::*"> </xsl:template> Comme cette r`gle est vide, on peut la remplacer par : e <xsl:template match="text()|attribute::*"/> on peut choisit explicitement la nouvelle liste de nuds courants, en utilisant lattribut select de apply-templates. Par exemple, on remplace la ligne 15 du programme XSLT par : <xsl:apply-templates select="//personne"/> Lexpression //personne slectionne tout les descendants (au sens large) du nud contexte qui sont e des lments personne (on rappelle que / signie ls direct). On saute ainsi la deuxi`me tape de la ee e e rcursivit et on vite les nuds de texte correspondant a des espaces blancs. e e e ` on peut aussi utiliser linstruction strip-space en insrant par exemple entre les lignes 6 et 7 : e <xsl:strip-space elements="*"/> Cette instruction a pour eet denlever dans larbre XSLT tous les nuds de texte correspondant a ` des espaces blancs. Lattribut element permet de slectionner (par une expression XPath) les lments e ee dans lesquelles cette suppression doit avoir lieu (ici tous). Dans tous les cas, on obtient le chier HTML suivant : liste2-nowhite.html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>Liste de personnes</title> </head> <body> <h1>Liste de personnes</h1> <ul> <li>John Doe</li> <li>Robert Durand</li> <li>El&eacute;anore Dupuis</li> </ul> </body> </html>

2.4

Exercices

Exercice 2.1 Ecrire un programme XSLT qui transforme un document au format de la DTD carnet dadresse de lexercice 2.1 de [5] en une page HTML.

F. Rossi 12 mars 2003

p. 5

XML Exercice 2.2 On reprend la DTD play tudie dans lexercice 2.3 de [6] : e e

XSLT

1. Ecrire un programme XSLT qui produit le plan de la pi`ce sous forme dun chier HTML (en tenant e compte des cas particuliers comme les prologues, etc.). 2. Ecrire un programme XSLT qui produit la liste des personnages de la pi`ce en respectant le regroue pement opr par llment PGROUP et sous la forme dun chier HTML. ee ee 3. Ecrire un programme XSLT qui transforme une pi`ce au format play en un chier HTML (on consere vera donc le maximum dinformations, avec une prsentation correcte). e

3
3.1

Mcanismes avances e e
Rfrences croises ee e

1 2 3 4 5 6 7 8 9 10

La technique classique utilise pour viter la redondance dans un chier XML consiste a ajouter des e e ` attributs de type ID/IDREF(S), comme dans lexemple suivant : DisquesML.dtd <?xml version="1.0" encoding="ISO-8859-1"?> <!ELEMENT disques (groupe*, disque*) > <!ELEMENT groupe (nom,membre+) > <!ATTLIST groupe nom ID #REQUIRED> <!ELEMENT nom (#PCDATA) > <!ELEMENT membre (#PCDATA) > <!ELEMENT disque (interpr`te, titre)> e <!ELEMENT interpr`te EMPTY > e <!ATTLIST interpr`te nom IDREF #REQUIRED> e <!ELEMENT titre (#PCDATA) > On peut donc se demander comment proter des rfrences croises dans un programme XSLT. ee e 3.1.1 Rfrence directe ee

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

Si on souhaite retrouver llment associ a un ID donn, la solution est tr`s simple. En eet, XPath ee e` e e propose une fonction id qui a une cha de caract`res associe llment identi par cette cha ` ne e ee e ne. Voici un exemple dapplication o` on fabrique une liste de disques en rappelant le nom du groupe interpr`te du u e disque : disques1.xml <?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="xml" indent="yes" encoding="ISO-8859-1"/> <xsl:strip-space elements="*"/> <xsl:template match="/"> <liste> <xsl:apply-templates select="//disque"/> </liste> </xsl:template> <xsl:template match="disque"> <disque><xsl:value-of select="titre"/><xsl:text> interprt par </xsl:text> e e <xsl:value-of select="id(interpr`te/@nom)/nom"/></disque> e </xsl:template> </xsl:stylesheet> Appliqu a e`

F. Rossi 12 mars 2003

p. 6

XML disques.xml <?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE disques SYSTEM "DisquesML.dtd"> <disques> <groupe nom="muse"> <nom>MUSE</nom> <membre>Matthew Bellamy</membre> <membre>Dominic Howard</membre> <membre>Chris Wolstenholme</membre> </groupe> <groupe nom="feeder"> <nom>FEEDER</nom> <membre>Grant Nicholas</membre> <membre>Taka Hirose</membre> <membre>Jon Henry Lee</membre> </groupe> <disque> <interpr`te nom="muse"/> e <titre>Showbiz</titre> </disque> <disque> <interpr`te nom="feeder"/> e <titre>Echo Park</titre> </disque> <disque> <interpr`te nom="muse"/> e <titre>Origin of symmetry</titre> </disque> <disque> <interpr`te nom="feeder"/> e <titre>Comfort In Sound</titre> </disque> </disques> le programme produit le rsultat suivant : e
1 2 3 4 5 6 7

XSLT

1 2 3 4 5 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

disques-out1.xml <?xml version="1.0" encoding="ISO-8859-1"?> <liste> <disque>Showbiz interprt par MUSE</disque> e e <disque>Echo Park interprt par FEEDER</disque> e e <disque>Origin of symmetry interprt par MUSE</disque> e e <disque>Comfort In Sound interprt par FEEDER</disque> e e </liste> Toute la subtilit du programme rside dans lexpression XPath id(interpr`te/@nom)/nom. Tout dabord, e e e lutilisation de @ indique quon sintresse a un attribut et donc interpr`te/@nom signie les attributs de e ` e nom nom des lments interpr`te du nud contexte. La cha de caract`res ainsi obtenue est passe a la ee e ne e e ` fonction id qui renvoie llment design par cette cha ee e ne. La n de lexpression slectionne llment nom e ee ls du rsultat de lappel a id. e ` Exercice 3.1 Complter lexemple propos an de produire une sortie en HTML dans laquelle la composition compl`te e e e du groupe est rappele pour chaque disque. On aura intrt a crire une r`gle de transformation spcique e e e `e e e a lachage de la composition dun groupe. `

F. Rossi 12 mars 2003

p. 7

XML 3.1.2 Rfrences arri`res ee e

XSLT

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22

La situation se complique quand on souhaite rechercher les rfrences dans lautre sens, cest-`-dire trouver ee a tous les IDREF(S) qui dsignent un ID. Dans notre exemple, il sagit de faire la liste des groupes et pour e chaque groupe la liste des disques. Voici une solution qui introduit de nouvelles constructions intressantes : e disques2.xml <?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="xml" indent="yes" encoding="ISO-8859-1"/> <xsl:strip-space elements="*"/> <xsl:template match="/"> <liste> <xsl:apply-templates select="//groupe"/> </liste> </xsl:template> <xsl:template match="groupe"> <groupe> <xsl:copy-of select="./*"/> <disques> <xsl:variable name="id" select="@nom"/> <xsl:for-each select="//disque[interpr`te/@nom=$id]"> e <xsl:copy-of select="."/> </xsl:for-each> </disques> </groupe> </xsl:template> </xsl:stylesheet> Etudions les nouvelles instructions : linstruction copy-of eectue comme son nom lindique une copie conforme des nuds slectionns e e par son attribut select. Dans sa premi`re utilisation, lexpression XPath ./* slectionne tous les e e descendants du nud contexte (qui est le nud courant), cest-`-dire la description du groupe (cf le a chier de rsultat) ; e linstruction variable dclare une variable. Le concept de variable est tr`s dlicat en XSLT et est e e e a interprt comme une variable dclare final en Java. Lide est quune variable locale (cest-`` ee e e e a dire dclare dans une r`gle comme ici) est en fait constante dans chaque application de la r`gle. En e e e e dautres termes, a chaque fois quon applique la r`gle, la variable prend une valeur quil est impossible ` e de changer pendant la construction du rsultat de la r`gle. Par contre, dans une autre invocation de e e la r`gle, la valeur de la variable pourra tre dirente. Ici cest le cas puisque la valeur de id est le e e e contenu de lattribut nom du nud contexte ; linstruction for-each ressemble a une boucle. En fait, son rsultat est la concatnation des rsul` e e e tats obtenus en interprtant son contenu pour chacun des nuds contenus dans la liste produite par e lexpression XPath de son attribut select. On aurait pu utiliser un appel rcursif ; e lexpression XPath //disque[interpr`te/@nom=$id] est tr`s intressante : e e e la sous-expression entre les crochets est un prdicat. Le rsultat de lexpression globale est en fait e e lensemble des lments disque contenus dans le document XML (` cause de //disque) qui vrient ee a e le prdicat ; e le prdicat lui-mme consiste en la comparaison de lattribut nom du ls interpr`te de llment e e e ee disque considr et du contenu de la variable id (obtenu par $id). Lutilisation de la variable est ee rendu obligatoire par la notion de nud contexte. En eet, quand on value //disque, le nud e contexte est le groupe en cours dtude et donc, tout va bien. Par contre, pour slectionner les e e disques retenus, on value le prdicat pour chaque lment disque avec comme nud contexte e e ee prcisment le disque en cours dtude. Si on ne conserve pas la valeur recherche dans une variable, il e e e e faut trouver un autre moyen dobtenir lancien nud contexte, a savoir le nud courant de la r`gle de ` e transformation. Ecrire //disque[interpr`te/@nom=./@nom] ne donne par un rsultat satisfaisant e e (aucun disque nest slectionn car aucun ne porte dattribut nom !). La seule solution est dutiliser la e e F. Rossi 12 mars 2003 p. 8

XML

XSLT

1 2 3 4 5 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 33 34 35

fonction XPath current, en crivant //disque[interpr`te/@nom=current()/@nom]. Cette solution e e fonctionne parfaitement mais est moins gnrale que lutilisation dune variable car elle remplace e e seulement la mmorisation du noeud courant. e On obtient le rsultat suivant : e disques-out2.xml <?xml version="1.0" encoding="ISO-8859-1"?> <liste> <groupe> <nom>MUSE</nom> <membre>Matthew Bellamy</membre> <membre>Dominic Howard</membre> <membre>Chris Wolstenholme</membre> <disques> <disque> <interpr`te nom="muse"/> e <titre>Showbiz</titre> </disque> <disque> <interpr`te nom="muse"/> e <titre>Origin of symmetry</titre> </disque> </disques> </groupe> <groupe> <nom>FEEDER</nom> <membre>Grant Nicholas</membre> <membre>Taka Hirose</membre> <membre>Jon Henry Lee</membre> <disques> <disque> <interpr`te nom="feeder"/> e <titre>Echo Park</titre> </disque> <disque> <interpr`te nom="feeder"/> e <titre>Comfort In Sound</titre> </disque> </disques> </groupe> </liste> Exercice 3.2 Modier lexemple propos an de produire une sortie en HTML. e Exercice 3.3 On reprend lexercice 3.1 de [5], en particulier la premi`re version de la DTD base sur les ID/IDREFS. e e Ecrire un programme XSLT qui transforme un chier de structure dentreprise en une page HTML donnant pour chaque employ la liste de ses subordonns (identis par leur nom et prnom) ainsi que son suprieur. e e e e e On pourra utiliser linstruction if dont le contenu nest pris en compte que si lexpression XPath contenue dans son attribut test a pour valeur true. Cest en particulier le cas quand une expression produit une liste de nuds non vide. 3.1.3 Linstruction key

Lutilisation de linstruction key de XSLT permet daller encore plus loin, en particulier en autorisant lquivalent de plusieurs espaces de noms pour les ID/IDREFS, en permettant de se passer de DTD, de e placer les rfrences dans un lment plutt quun attribut, etc. Voici un exemple dutilisation : ee ee o F. Rossi 12 mars 2003 p. 9

XML disques3.xml <?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="xml" indent="yes" encoding="ISO-8859-1"/> <xsl:strip-space elements="*"/> <xsl:key name="groupe2disque" match="disque" use="interpr`te/@nom"/> e <xsl:template match="/"> <liste> <xsl:apply-templates select="//groupe"/> </liste> </xsl:template> <xsl:template match="groupe"> <groupe> <xsl:copy-of select="./*"/> <disques> <xsl:for-each select="key(groupe2disque,@nom)"> <xsl:copy-of select="."/> </xsl:for-each> </disques> </groupe> </xsl:template> </xsl:stylesheet> On remarque deux dirences avec la version prcdente du programme : e e e

XSLT

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22

1. linstruction key est utilise ligne 6 : elle demande au programme de construire une table dassociation e nomme groupe2disque entre les lments disques et les cha e ee nes de caract`res prcise par lexpression e e e XPath interpr`te/@nom interprte avec comme noeud contexte le disque tudi. La grosse dirence e ee e e e avec un ID XML est quune cha peut dsigner plusieurs lments ; ne e ee 2. lexpression XPath de la ligne 16 utilise la fonction key. Cette fonction va chercher dans la table groupe2disque les noeuds associs a la cha @nom. e ` ne Cette nouvelle version du programme donne exactement les mmes rsultats que lancienne. e e Exercice 3.4 Modier la DTD propose au dbut de la section pour supprimer les ID/IDREF et autoriser un contenu e e de type texte pour llment interpr`te. Ecrire un programme XSLT qui donne la liste des groupes avec ee e pour chaque groupe la liste des disques en utilisant comme mcanisme de rfrence le contenu des lments e ee ee interp`tre (ct disque) et celui des lments nom (ct groupe). e oe ee oe

3.2

Attributs

1 2 3 4 5 6 7 8 9 10

Jusque a prsent, nous avons prudemment vit des situations dans lesquelles nous aurions eu a produire ` e e e ` des attributs dans le chier rsultat. Supposons quon souhaite par exemple passer de la liste de personnes e propose a la section 2.2 a un format XML dans lequel le nom et le prnom du contact sont contenus dans e ` ` e des attributs. On propose le programme XSLT suivant : perso2attrib.xml <?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="xml" indent="yes" encoding="ISO-8859-1"/> <xsl:strip-space elements="*"/> <xsl:template match="/"> <liste> <xsl:apply-templates select="//personne"/> </liste> </xsl:template>

F. Rossi 12 mars 2003

p. 10

XML <xsl:template match="personne"> <personne prnom="{prnom}" nom="{nom}"/> e e </xsl:template> </xsl:stylesheet> En appliquant ce programme, on obtient :
1 2 3 4 5 6

XSLT

11 12 13 14

liste3.xml <?xml version="1.0" encoding="ISO-8859-1"?> <liste> <personne prnom="John" nom="Doe"/> e <personne prnom="Robert" nom="Durand"/> e <personne prnom="Elanore" nom="Dupuis"/> e e </liste> Toute lastuce vient de lutilisation des accolades. Quand le mod`le de rsultat dune r`gle de transformation e e e contient un lment dont un attribut contient des accolades, le texte dlimit par ces accolades est interprt ee e e ee comme une expression XPath dont le rsultat est traduit en texte. e Exercice 3.5 On reprend la DTD XBel simplie propose dans lexercice 3.2 de [4]. Ecrire un programme XSLT qui e e traduit un chier XBEL en une page HTML contenant la liste des signets. Chaque signet sera li a lURL e` correspondante. De plus, on remplacera chaque alias par sa cible.

Rfrences ee
[1] James Clark, editor. XSL Transformations (XSLT) Version 1.0. W3C Recommendation. W3C, 16 November 1999. http://www.w3.org/TR/xslt. [2] James Clark and Steve DeRose, editors. XML Path Language (XPath) Version 1.0. W3C Recommendation. W3C, 16 November 1999. http://www.w3.org/TR/xpath. [3] Philippe Drix. XSLT fondamental. Eyrolles, 2002. [4] Fabrice Rossi. Document object model. Recueil dexercices, Universit Paris-IX Dauphine, 2002. e http://apiacoa.org/teaching/xml/exercices/dom.pdf. [5] Fabrice Rossi. Dtd et schmas. e Recueil dexercices, Universit Paris-IX Dauphine, 2002. e http://apiacoa.org/teaching/xml/exercices/dtd-et-schemas.pdf. [6] Fabrice Rossi. Simple api for xml. Recueil dexercices, Universit Paris-IX Dauphine, 2002. e http://apiacoa.org/teaching/xml/exercices/sax.pdf.

F. Rossi 12 mars 2003

p. 11

Vous aimerez peut-être aussi