Programme Introduction Documents structurés, XML, Bases de données Documents XML : description et manipulation Description de documents Modélisation XDM Localisation de composants XML -- XPath Transformation de documents XML XSLT Plus tard Typage -- XSchema Interrogation de documents XML -- XQuery 1 Transformer des données XML XSLT Objectifs Description d'une feuille de style Règles Processus de transformation Exemples XSLT : fonctions étendues 2
Bibliographie XSLT : XSL Transformation extensible Stylesheet Langage Transformations http://www.w3.org/tr/xslt Comprendre XSLT Bernd Amann et Philippe Rigaux, paru aux Editions O'Reilly Différents tutoriaux 3 Publication de données avec XSLT Extraire un contenu d un document XML pour le mettre dans un format reconnu par une application de publication particulière Trois versions différentes du document guide un site web, affichant les informations sur le guide, ses itinéraires et ses cotations un site WAP permettant de consulter sur un téléphone mobile les mêmes informations un document PDF donnant l ébauche de ce qui pourrait être un «Officiel des ballades» imprimé 4
Transformer un document? Extraire des fragments d'un document et les assembler différemment dans une structure nouvelle À l'aide d'un langage de requêtes (cf. XQuery) À l'aide de feuilles de style associer à certain type d élément des directives de transformation pour par exemple Conserver tel quel le résultat de cette transformation Indiquer des directives de présentation de leur contenu 5 Exemple (XML HTML) <?xml version="1.0"?> <exemple> <titre>ceci est un titre</titre> <auteur>ceci est un auteur</auteur> </exemple> <html> <head> <title> transformer le document exemple </titre> </head> <body> <h1>ceci est un titre</h1>> <h1>ceci est un auteur</h1> </body> </html> 6
Transformer un document : XSLT Le langage XSLT permet de construire un nouveau document XML à partir d'un document XML existant en le transformant La transformation s'exprime dans une feuille de style Une feuille de style est un document XML qui contient un ensemble de règles (template) Chaque règle décrit une transformation à appliquer à certains composants La feuille de style s applique à un document XML XSLT opère sur l'arbre (ordonné) du document source 7 Une feuille de style très simple Feuille de style vide Attribut version obligatoire xsl est le préfixe correspondant à l espace de noms du langage XSLT L espace de noms permet au processeur XSLT de reconnaitre les «instructions»du langage XSLT <xsl:stylesheet version='1.0' xmlns:xsl='http://www.w3.org/1999/xsl/transform'> <! ICI mettre un ensemble de règles (template) --> </xsl:stylesheet>
<exemple> <titre>ceci est un titre</titre> <auteur>ceci est un auteur</auteur> </exemple> Exemple <html> <head> <title> transformer le document exemple </titre> </head> <body> <h1>ceci est un titre</h1>> <h1>ceci est un auteur</h1> </body> </html> <xsl:stylesheet version = '1.0' xmlns:xsl='http://www.w3.org/1999/xsl/transform'> <xsl:template match="/"> <html> <head> <title> transformer le document exemple</title> </head> <body> <xsl:apply-templates/> </body> </html> <xsl:template match= auteur > <h1> <xsl:value-of select="."/> </h1> <xsl:template match= titre > <h1> <xsl:value-of select="."/> </h1> </xsl:stylesheet> 9 XSLT Une feuille de style contient une suite de règles (xsl:template) L application de la feuille de style consiste à parcourir le document source en partant de la racine pour chaque nœud rencontré dans ce parcours, chercher la règle à appliquer l application d une règle produit un fragment du document résultat Appel de règle = instruction xsl:apply-templates 10
Règles : deux parties Une partie déclaration spécification des nœuds sur lesquels la règle doit s'appliquer à l'aide d'une expression XPath (motif - pattern) les nœuds cibles sont atteints en suivant un chemin conforme à l expression Xpath donné Une partie exécution spécification de la transformation (modèle - template) définition de la forme du résultat à générer sur le flot de sortie quand la règle sera activée à l'aide d'une suite d'instructions qui s'appliquent aux nœuds filtrés en respectant l'ordre dans lequel elles sont données 11 Forme d'une règle <xsl:template match= pattern > transformation Le motif de sélection permet d atteindre les nœuds cibles de la transformation La transformation corps de la règle est décrite avec un mélange de règles et de syntaxe XML à générer sur le flot de sortie L ordre des règles n a pas d importance 12
Extraction de données On insère dans le résultat des fragments du document traité <xsl:value-of select= chemin /> <xsl:value-of select= pattern /> recopie de la valeur de chaque nœud atteint par le chemin XPath (depuis le nœud contexte) On donne un chemin d accès à un nœud à partir du nœud courant <xsl:template match= auteur > <h1> <xsl:value-of select="."/> </h1> 13 Exemple <?xml version="1.0"?> <table> <description>personnel 4ème étage</description> <personne><nom>bond</nom><bureau>u1</bureau></personne> <personne><nom>lupin</nom><bureau>u2</bureau></personne > <personne><nom>templar</nom><bureau>u3</bureau></personne> </table> <xsl:template match="personne"> <LI> <xsl:value-of select="nom"/> - <xsl:value-of select="bureau"/> </LI> <LI>Bond - U1</LI> <LI>Lupin - U2</LI> <LI>Templar - U3</LI> 14
Les patterns On ne peut pas associer n importe quelle expression XPath à l attribut match Certaines expressions seraient trop complexes à évaluer L expression doit toujours désigner un ensemble de nœuds <xsl:template match="1"> NON <xsl:templatematch="preceding::node()[5]"> NON 15 Axes possibles child les nœuds enfants d un élément Attribute les attributs d un élément // les descendants d un élément ou lui-même (descendant-or-self::node()/) 16
Exemple - instruction xsl:apply-templates <xsl:stylesheet version = '1.0' xmlns:xsl='http://www.w3.org/1999/xsl/transform'> <xsl:template match="/"> <html> <head> <title> transformation du document exemple</title> </head> <body> <xsl:apply-templates/> </body> </html> <xsl:template match= auteur > <h1> <xsl:value-of select="."/> </h1> <xsl:template match= titre > <h1> <xsl:value-of select="."/> </h1> </xsl:stylesheet> Applique l ensemble des règles à tous les fils du nœud contexte 17 L instruction xsl:apply-templates Elle a la forme suivante <xsl:apply-templates select= expression /> expression est un chemin XPath qui désigne les nœuds auxquels la règle doit s appliquer Sélection d un ensemble de nœuds constituant le contexte d évaluation la valeur par défaut de select est child::node() Application à tous les fils du nœud contexte si l attribut n apparaît pas apply-templates permet d indiquer l ordre de parcours du document source 18
Processus de transformation Il consiste à instancier des règles le corps de la règle est inséré dans le document résultat les instructions XSLT contenues dans le corps de la règle sont exécutées à leur tour le résultat d une instruction vient remplacer l instruction dans le résultat 19 Processus de transformation Le processeur XSLT analyse l arbre du document opère sur une liste de nœuds Réduite au nœud racine au départ cherche si une règle vérifie le nœud contexte Si oui, application des instructions contenues dans cette règle Instanciation de la transformation sur le flot de sortie S'il y en a une seule règle, elle est appliquée Si non, application des règles par défaut L arbre du document source est parcouru à partir de la racine Les nœuds textes sont recopiés dans l arbre résultat 20
Règles prédéfinies Elles spécifient une transformation par défaut si aucune des règles de la feuille de style n'est applicable Pour les nœuds racine et élément <xsl:template match="* /"> <xsl:apply-templates/> Si le noeud contexte est le nœud document ou un nœud element, continuer sur les fils de ce noeud Pour les nœuds texte et attribut <xsl:template match="text() @*"> <xsl:value-of select="." /> Recopie leur valeur (le texte ou la valeur de l attribut) sur le flot de sortie dans l arbre résultat 21 Processus de transformation Si plusieurs règles sont applicables? La priorité peut être spécifiée explicitement attribut priority Sinon la plus spécifique est choisie 22
Priorité entre règles : exemple <xsl:template match="personne"> <regle><xsl:apply-templates/></regle> <xsl:template match="personne[bureau]"> <Autreregle><xsl:apply-templates/></Autreregle> <?xml version="1.0"?> <table><description>personnel 4ème étage</description> <personne><nom>bond</nom><bureau>u1</bureau></personne> <personne><nom>lupin</nom></personne> <personne><nom>templar</nom><bureau>u3</bureau></personne> </table> Pour <personne> <personne> la première règle s'applique Pour <personne> <bureau> </bureau><personne> Seule la seconde s'applique 23 Priorité entre règles : autre exemple <xsl:template select="para"> <P><xsl:apply-templates</P> <xsl:template select= Para[@type="citation"] > <BLOCKQUOTE> <xsl:apply-templates/> </BLOCKQUOTE> Pour <Para>...</Para> La première règle s'applique Pour <Para type="citation">...</para> Seule la seconde s'applique
Un exemple complet 25 Document XML <?xml version="1.0"?> <bib> <livre> <titre>t1</titre> <auteur>a1</auteur> <auteur>a2</auteur> </livre> <article> <titre>t2</titre> <auteur>a3</auteur> <auteur>a4</auteur> </article> <livre> <titre>t3</titre> <auteur>a5</auteur> <auteur>a6</auteur> <auteur>a7</auteur> </livre> </bib> 26
... de XML vers HTML... <HTML> <HEAD> <TITLE> Entrées bibliographiques</title> </HEAD> <BODY> <TABLE> <TBODY> <TR><TD>t1</TD><TD>a1</TD><TD>a2</TD></TR> <TR><TD>t2</TD><TD>a3</TD><TD>a4</TD></TR> <TR> <TD>t3</TD><TD>a5</TD><TD>a6</TD><TD>a7</TD> </TR> </TBODY> </TABLE> </BODY> </HTML> 27 Feuille XSL : style.xsl (1) <xsl:transform xmlns:xsl="http://www.w3.org/1999/xsl/transform" version="1.0"> <xsl:template match="/"> <HTML> <HEAD><TITLE> Entrées bibliographiques</title> </HEAD> <BODY> <xsl-apply-templates/> </BODY> </xsl:transform> 28
Feuille XSL : style.xsl (2) <xsl:template match="titre"> <TD><xsl:value-of/></TD> <xsl:template match="auteur"> <TD><xsl:value-of/></TD> <xsl:template match="livre article"> <TR><xsl:apply-templates select="titre"/> <xsl:apply-templates select="auteur"/> </TR> <xsl:template match="bib"> <TABLE><TBODY><xsl:apply-templates/></TBODY></TABLE> + règles par défaut (ou les neutraliser) 29 Feuille de style : style.xsl (3) <?xml-stylesheet href= style.xsl type= text/xsl?> À insérer après le prologue dans le document à présenter Si l application sait interpréter cette instruction, la transformation et présentation seront effectives 30
L instruction xsl:apply-templates Sans attributs Attributs select et priority Attribut mode permet de choisir explicitement une des règles parmi celles qui sont candidates un nœud peut être traité plusieurs fois pour générer un résultat différent à chaque fois 31 <xsl:stylesheet xmlns:xsl = "http://www.w3.org/1999/xsl/transform" version = "1.0" > <xsl:output method = "xml" indent = "yes" /> <xsl:template match = "/" > <AAA > <xsl:apply-templates select = "//BBB" /> <xsl:apply-templates select = "//BBB" mode = "xxx" /> <xsl:apply-templates select = "//BBB" mode = "yyy" /> </AAA> <xsl:template match = "BBB" > <OOO > <xsl:value-of select = "." /> </OOO> <xsl:template match = "BBB" mode = "xxx" > <XXX > <xsl:value-of select = "." /> </XXX> <xsl:template match = "BBB" mode = "yyy" > <YYY > <xsl:value-of select = "." /> </YYY> </xsl:stylesheet> 32
exemple <AAA > <BBB>10 </BBB> <BBB>5 </BBB> <BBB>7 </BBB> </AAA> <?xml version="1.0" encoding="utf-8"?> <AAA xmlns:zvon="http://www.zvon.org/"> <OOO>10</OOO> <OOO>5</OOO> <OOO>7</OOO> <XXX>10</XXX> <XXX>5</XXX> <XXX>7</XXX> <YYY>10</YYY> <YYY>5</YYY> <YYY>7</YYY> </AAA> http://www.zvon.org/xxl/xsltreference/output/xslt_template_mode.html 33 Produire plusieurs résultats à partir d un nœud <xsl:stylesheet version = '1.0' xmlns:xsl='http://www.w3.org/1999/xsl/transform'> <xsl:template match="/"> <xsl:apply-templates select="//titre" mode="red"/> <xsl:apply-templates select="//titre" mode="blue"/> <xsl:apply-templates select="//titre"/> <xsl:template match="titre" mode="red"> <div style="color:red"> <xsl:value-of select="name()"/> <xsl:text> id=</xsl:text> <xsl:value-of select="@id"/> </div> <xsl:template match="titre" mode="blue"> <div style="color:blue"> <xsl:value-of select="name()"/> <xsl:text> id=</xsl:text> <xsl:value-of select="@id"/> </div> Modes <xsl:template match="titre"> <div style="color:purple"> <xsl:value-of select="name()"/> <xsl:text> id=</xsl:text> <xsl:value-of select="@id"/> </div> </xsl:stylesheet>
XSLT fonctions étendues Itération et tri Structure conditionnelle Variables Modes Et divers Construction d éléments et d attributs Il est possible de créer des éléments ou des attributs à l'aide de valeurs extraites du document source Deux modes de construction: Instanciation explicite Appel de fonction Méthode mixte Les { } indique qu il s agit d un chemin XPath qui doit être remplacé par sa valeur
Objectif Une solution pour introduire des attributs dans un élément quand : on ne connaît pas la valeur de l attribut on ne connaît ni la valeur ni le nom Même remarque avec les éléments 37 Exemples Instanciation explicite <title num= 1 > <xsl:value-of select= @title > </title> Appel de fonction <xsl:element name= {@title} > <xsl:attribute name= size > <xsl:value-of select= {count(section)} /> </xsl:attribute> </xsl:element> Méthode mixte <title name= {@title} />
Répétition Structure de répétition xsl:for-each parcourir un ensemble de nœuds sélectionnés avec select Les instructions sont appliquées successivement à chaque nœud sélectionné Pas de variable, donc pas d incrémentation Exemple <?xml version="1.0" encoding="utf-8"?> <R> <H1>titre1</H1> <H1>titresect1</H1> <H1>titre2</H1> <H1>titresect2</H1> </R> <?xml version="1.0" encoding="utf-8"?> <Texte> <Chapitre> <Titre>titre1</Titre> <Section> <Titre>titresect1</Titre> </Section> </Chapitre> <Chapitre> <Titre>titre2 </Titre> <Section> <Titre>titresect2</Titre> </Section> </Chapitre> </Texte> <xsl:template match="/"> <R> <xsl:for-each select=".//titre"> <H1> <xsl:apply-templates/> </H1> </xsl:for-each> </R>
Tri xsl:sort Tri des nœuds traités par xsl:for-each ou xsl:applytemplates Un critère de tri est une expression XPath A placer après la balise ouvrante de xsl:for-each ou xsl:apply-templates Par défaut, croissant (attribut order, valeur ascending ou descending) Il peut avoir plusieurs critères qui définissent les différents niveaux de tri Par défaut les nœuds sont triés sur leur position Exemple <?xml version="1.0" encoding="utf-8"?> <Texte> <Chapitre> <Titre>titre1</Titre> <Section> <Titre>titresect1</Titre> </Section> </Chapitre> <Chapitre> <Titre>titre2 </Titre> <Section> <Titre>titresect2</Titre> </Section> </Chapitre> </Texte>
Exemple <xsl:template match="/"> <R> <xsl:for-each select=".//titre"> <xsl:sort select=. /> <H1><xsl:apply-templates/></H1> </xsl:for-each> </R> <?xml version="1.0" encoding="utf-8"?> <R> <H1>titre1</H1> <H1>titre2</H1> <H1>titresect1</H1> <H1>titresect2</H1> </R> Traitement conditionnel xsl:if permet le traitement conditionnel d'un nœud <xsl:template match="list"> <xsl:for-each select="entry"> <xsl:value-of select="."/> <xsl:if test="not(position()=last())"> <xsl:text>, </xsl:text> </xsl:if> </xsl:for-each> <list> <entry type= c >item1</entry> <entry type= b >item2</entry> <entry type= a >item3</entry> <list> Pas de else item1,item2,item3
Copie de nœud Copie du nœud courant <xsl:copy select=. /> Copie de l arbre <xsl:copy-of select=. /> Variables XSLT permet de définir des variables <xsl:variable name= nom >valeur</xsl:variable> Les variables sont visibles dans toute la sous arborescence Un type particulier de variables les paramètres <xsl:param name= X />default</param>
Exemples <xsl:variable name= v1 > ceci est un <mot-cle>contenu</mot-cle> de variable </xsl:variable> <xsl:variable name= v1 select= 12 /> <xsl:variable name= v1 select= /COURS/ENSEIGNANTS /> Arbre temporaire auquel on peut appliquer une expression XPath 47 Templates nommés et Fonctions XSL permet de nommer un template et de l appeler explicitement à n importe quel endroit <xsl:template name = qname > <xsl:call-template name = qname > </xsl:call-template> Cela permet de définir des fonctions On peut passer des paramètres avec xsl:param
Une règle d affichage de nœud <xsl:template name="afficher"> <xsl:value-of select="position()"/> : <xsl:value-of select="."/> <xsl:template match="nom"> <xsl:call-template name="afficher"/> <xsl:template match="text()"> <xsl:call-template name="afficher"/> <xsl:template match="comment()"> <xsl:call-template name="afficher"/> 49 Document exemple <?xml version= 1.0 encoding="iso-8859-1"?> <COURS CODE="TC234"> <SUJET>Publication XSLT</SUJET> <ENSEIGNANTS> <!-- Enseignants responsables --> <NOM>Amann</NOM> <NOM>Rigaux</NOM> </ENSEIGNANTS> <PROGRAMME> <SEANCE ID="1">Documents XML</SEANCE> <SEANCE ID="2">Programmation XSLT</SEANCE> <ANNEE>2003</ANNEE> </PROGRAMME> </COURS>
On applique à ENSEIGNANTS <?xml version="1.0" encoding="iso-8859-1"?> <!-- Application de la règle à ENSEIGNANTS --> 1 : 2 : Enseignant responsable 3 : 4 : Amann 5 : 6 : Rigaux 7 : 51 Définition et déclenchement de règles Une règle est donc définie par l élément xsl:template Deux possibilités : L attribut match est une expression XPath définissant les «cibles» de la règle déclenchement par xsl:apply-templates L attribut name donne un nom à la règle <xsl:template name= TDM > déclenchement par xsl:call-template 52
Passage de paramètres On peut passer des paramètres à xsl:calltemplate ou xsl:apply-templates xsl:param : définition dans la règle des paramètres attendus xsl:with-param : association d un ou plusieurs paramètres à xsl:call-template ou xsl:apply-templates 53 Exemple de paramètres La règle Afficher attend une chaîne <xsl:template name="afficher"> <xsl:param name="texte" <xsl:value-of select="string( inconnu )"/> select="concat(position(), :, $texte)"/> texte est le nom du paramètre select donne la valeur par défaut $texte désigne le paramètre 54
Passage de paramètres Avec l instruction xsl:with-param à placer après xsl:call-template <xsl:template match="nom"> <xsl:call-template name="afficher"> <xsl:with-param name="texte" select="."/> </xsl:call-template> <xsl:template match="comment()"> <xsl:call-template name="afficher"> <xsl:with-param name="texte" select="string( Commentaire )"/> </xsl:call-template> 55 Passage de paramètres <xsl:template name="itemapuce"> <xsl:param name= "format">- </xsl:param> <fo:block> <xsl:value-of select="$puce"/> <xsl:apply-templates/> </fo:block> <xsl:template match="li"> <xsl:call-template name="itemapuce"> <xsl:with-param name="format">* </xsl:with-param> </xsl:call-template> <xsl:template match="dd"> <xsl:call-template name="itemapuce"> <xsl:with-param name="format"># </xsl:with-param> </xsl:call-template>
Inclusion de feuille de style Dans un document XML exprimée dans le document source avec une instruction de traitement Dans un feuille de style (inclusion de règles d une feuille XSLT dans une autre) <!-- Category: top-level-element --> <xsl:include href = uri-reference /> <xsl:import href = uri-reference /> Utilisation de plusieurs feuilles de style Utilisation de deux éléments de haut niveau Différence: la gestion des conflits <xsl:include href = uri-reference /> pas de notion de préséance <xsl:import href = uri-reference /> les règles importées ont une préséance moindre que celles du programme importateur
Utilisation de plusieurs feuilles de style <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/xsl/transform"> <xsl:import href="article.xsl"/> <xsl:import href="bigfont.xsl"/> xsl:import doit être le premier élément de premier niveau du programme Résumé Déclaration d un ensemble de règles s appliquant aux noeuds du document source (instruction xsl:template) Chaque règle produit un fragment du document résultat Parcours d un document, vu comme un arbre, avec des instructions xsl:apply-templates Le processeur choisit la règle s appliquant à chaque noeud sélectionné 60
Bilan Langage de règles Transformer pour Intégration de XPath Instructions Ce n est pas un langage de requêtes Une feuille de style pour un document (ou une classe de document) 61