Transformations XSL Fabrice Rossi 12 mars 2003 Les exercices pr´ esent´ es dans

Transformations XSL Fabrice Rossi 12 mars 2003 Les exercices pr´ esent´ es dans ce document sont construits en partie grˆ ace aux exercices de [5] et [6]. 1 Instructions sp´ ecifiques au CRIO UNIX Au d´ ebut de chaque s´ eance : 1. dans chaque terminal, utilisez tcsh (en tapant tcsh) 2. effectuez les r´ eglages n´ ecessaires au bon fonctionnement des diff´ erents programmes utilis´ es, en tapant source /home/perm/ufrmd/rossi/xml/env.csh On lance une transformation par la commande transform entr´ ee style sortie. Cette transformation est bas´ ee sur le fichier style et s’applique au fichier entr´ ee. Le fichier sortie contient le r´ esultat de la transformation. Il est facultatif : en cas d’absence, le r´ esultat s’affiche directement ` a l’´ ecran. 2 Une premi` ere approche de XSLT 2.1 Introduction XSLT (cf [1]) est un dialecte XML qui permet de d´ ecrire des transformations abitraires ` a r´ ealiser sur des documents XML. L’id´ ee est de permettre de passer facilement d’un dialecte XML ` a un autre format (souvent XML, mais en fait assez libre), par exemple pour traduire un fichier XML en une page HTML. Le langage propos´ e est assez d´ elicat ` a maˆ ıtriser pour diverses raisons : – il est bas´ e sur XPath (cf [2]), un langage ` a la syntaxe non XML qui permet de d´ ecrire des ensembles de nœuds dans un document XML. XPath est tr` es puissant et assez compact, mais aussi assez complexe ; – XSLT est un langage d´ eclaratif : on donne des r` egles de transformation que le moteur se charge d’appliquer, sans qu’on ´ ecrive la s´ equence des op´ erations. Cette fa¸ con de proc´ eder est d´ eroutante pour de nombreux programmeurs; – XSLT est un langage fonctionnel : beaucoup de transformations s’expriment de fa¸ con r´ ecursive, ce qui n’est pas toujours facile ` a appr´ ehender. Comme DOM, XSLT est bas´ e sur une repr´ esentation par arbre du document XML trait´ e. Exactement comme dans DOM, la racine de l’arbre XSLT repr´ esente le document tout entier, alors que la racine XML est le fils principal de la racine XSLT. Notons qu’il est illusoire dans ce tutoriel de vouloir d´ epasser un niveau ´ el´ ementaire. Le lecteur int´ eress´ e par les subtilit´ es pourra se reporter aux deux normes d´ ej` a cit´ ees ([1] et [2]), ainsi qu’` a [3] qui est particuli` erement complet et clair. 2.2 Un programme XSLT Un programme XSLT est constitu´ e d’un ensemble de r` egles de transformation. Chaque r` egle comporte deux parties : 1. un motif (pattern) qui pr´ ecise les nœuds de l’arbre XSLT auxquels la r` egle peut s’appliquer; 2. un mod` ele de r´ esultat (template) qui indique ce que le moteur XSLT doit produire (en g´ en´ eral un fragment de document XML) quand il applique la r` egle. F. Rossi – 12 mars 2003 p. 1 XML XSLT Le fonctionnement d’un programme XSLT est bas´ e sur la notion de nœud courant et de liste de nœuds courants. A l’origine, la liste de nœuds courants est r´ eduite ` a la racine de l’arbre XSLT. Le r´ esultat du programme est celui de la transformation de cette racine. A un moment donn´ e de l’ex´ ecution du programme, on doit calculer le r´ esultat du programme sur une liste de nœuds courants. Par d´ efinition, ce r´ esultat est obtenu en concat´ enant le r´ esultat du programme sur chacun des nœuds de la liste. Enfin, le r´ esultat du programme pour un nœud est obtenu de la fa¸ con suivante : 1. le moteur XSLT cherche dans les r` egles de transformation celle dont le motif s’adapte le mieux au nœud ; 2. le r´ esultat du programme sur le nœud est alors le template associ´ e ` a la r` egle. Pour fixer les id´ ees, commen¸ cons par un exemple basique, fonctionnant ` a partir du fichier XML suivant : liste-personnes.xml 1 <?xml version="1.0" encoding="ISO-8859-1"?> 2 <liste> 3 <personne> 4 <pr´ enom>John</pr´ enom><nom>Doe</nom> 5 </personne> 6 <personne> 7 <pr´ enom>Robert</pr´ enom><nom>Durand</nom> 8 </personne> 9 <personne> 10 <pr´ enom>El´ eanore</pr´ enom><nom>Dupuis</nom> 11 </personne> 12 </liste> On veut produire une version HTML de ce document. La premi` ere ´ etape est bien sˆ ur de cr´ eer l’entˆ ete du document HTML. Pour ce faire, on propose le fichier XSLT suivant : perso2html1.xml 1 <?xml version="1.0" encoding="ISO-8859-1"?> 2 <!-- racine du document, pr´ ecise le sens du pr´ efixe xsl --> 3 <xsl:stylesheet version="1.0" 4 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 5 <!-- format de sortie, ici html --> 6 <xsl:output method="html" 7 doctype-public="-//W3C//DTD HTML 4.0 Transitional//EN" 8 indent="yes"/> 9 <!-- patron pour la racine du document de d´ epart --> 10 <xsl:template match="/"> 11 <html> 12 <head><title>Liste de personnes</title> 13 </head> 14 <body> 15 <h1>Liste de personnes</h1> 16 </body> 17 </html> 18 </xsl:template> 19 </xsl:stylesheet> On constate en lisant les commentaires qu’une r` egle est d´ eclar´ ee grˆ ace ` a l’´ el´ ement template. Le motif est donn´ e par le contenu de l’attribut match. C’est une expression au format XPath. Dans notre exemple, l’expression se r´ eduit ` a / qui correspond ` a l’unique nœud racine (de l’arbre XSLT). Enfin, le mod` ele de r´ esultat est le contenu de l’´ el´ ement template, ici du code HTML. Quand on applique la transformation au fichier XML, on obtient le fichier HTML suivant : liste1.html 1 2 <!DOCTYPE html 3 PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> F. Rossi – 12 mars 2003 p. 2 XML XSLT 4 <html> 5 <head> 6 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 7 8 <title>Liste de personnes</title> 9 </head> 10 <body> 11 <h1>Liste de personnes</h1> 12 </body> 13 </html> 2.3 Les appels r´ ecursifs L’exemple propos´ e dans la section pr´ ec´ edente est tr` es limit´ e car il ne traite que la racine. Pour aller plus loin, il faut pouvoir choisir la liste des nœuds courants, ce qui correspond en XSLT ` a un appel r´ ecursif : l’ins- truction apply-templates utilis´ ee dans un mod` ele de r´ esultat est remplac´ ee par le r´ esultat du programme de transformation appliqu´ e ` a la liste des enfants du nœud courant. Voici un exemple d’utilisation de cette instruction : perso2html2.xml 1 <?xml version="1.0" encoding="ISO-8859-1"?> 2 <xsl:stylesheet version="1.0" 3 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 4 <xsl:output method="html" 5 doctype-public="-//W3C//DTD HTML 4.0 Transitional//EN" 6 indent="yes"/> 7 <xsl:template match="/"> 8 <html> 9 <head><title>Liste de personnes</title> 10 </head> 11 <body> 12 <h1>Liste de personnes</h1> 13 <ul> 14 <!-- appel r´ ecursif --> 15 <xsl:apply-templates/> 16 </ul> 17 </body> 18 </html> 19 </xsl:template> 20 <!-- patron pour un ´ el´ ement personne --> 21 <xsl:template match="personne"> 22 <li><xsl:value-of select="pr´ enom"/> 23 <xsl:text> </xsl:text> 24 <xsl:value-of select="nom"/></li> 25 </xsl:template> 26 </xsl:stylesheet> Le programme propos´ e produit le r´ esultat suivant : liste2.html 1 2 <!DOCTYPE html 3 PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> 4 <html> 5 <head> 6 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 7 8 <title>Liste de personnes</title> F. Rossi – 12 mars 2003 p. 3 XML XSLT 9 </head> 10 <body> 11 <h1>Liste de personnes</h1> 12 <ul> 13 14 <li>John Doe</li> 15 16 <li>Robert Durand</li> 17 18 <li>Eléanore Dupuis</li> 19 20 </ul> 21 </body> 22 </html> Pour comprendre ce qui se passe, il nous faut d’abord expliciter quelques instructions XSLT et XPath utilis´ ees : – value-of est une instruction XSLT qui est remplac´ ee par la traduction en texte de son attribut select qui doit ˆ etre une expression XPath ; – l’expression XPath pr´ enom doit ˆ etre interpr´ et´ ee comme ceci : elle fabrique l’ensemble des nœuds qui sont des ´ el´ ements pr´ enom et qui sont fils du nœud contexte. C’est une abbr´ eviation de ./pr´ enom, car . d´ esigne le nœud contexte alors que / est le symbole XPath qui signifie fils. Le nœud contexte est d´ etermin´ e par les instructions qui englobent l’expression XPath. Dans notre exemple, c’est en fait le nœud courant, mais ce n’est pas toujours le cas ; – l’expression XPath personne correspond ` a l’ensemble des fils du nœud contexte qui sont des ´ el´ ements personne. Nous allons voir comment la r` egle correspond ` a ce motif est choisie par le moteur XSLT ; – enfin, l’instruction text permet d’ins´ erer du texte dans le r´ esultat d’une r` egle, ce qui est tr` es utile pour ins´ erer des espaces blancs. Analysons le fonctionnement du programme : 1. on d´ emarre le programme avec comme nœud courant la racine XSLT : (a) le moteur choisi la r` egle adapt´ ee ` a la racine : c’est ici la premi` ere (b) le r´ esultat est obtenu grˆ ace au mod` ele de r´ esultat 2. comme le mod` ele de r´ esultat contient un apply-templates, on relance le programme avec comme liste de nœuds courants les fils de la racine XSLT, c’est-` a-dire dans notre exemple le nœud liste uploads/s3/ xslt.pdf

  • 29
  • 0
  • 0
Afficher les détails des licences
Licence et utilisation
Gratuit pour un usage personnel Attribution requise
Partager