Module BD et Sites Web Cours 7 XSLT 1
Plan Instructions XSLT (suite) Chemins complexes Exécution des règles Passage de paramètres Priorités 2
Copie de noeuds Copier des nœuds du document source vers le document résultat : <xsl:copy> copie un seul nœud, sans ses descendants <xsl:copy-of> copie en profondeur, c-à-d copie le nœud et ses descendants, y compris les attributs 3
Branchement conditionnel Instruction <xsl:if > Possède un attribut test dont la valeur est une expression Xpath. L expression est évaluée et renvoie un booléen. Le contenu de l élément <xsl:if> est instancié si l expression est évaluée à true. Instruction <xsl:choose> S utilise avec les éléments <xsl:when> et <xsl:otherwise> 4
Exemple <xsl:stylesheet version 1.0 xmlns:xsl= http://www.w3.org/1999/xsl/transform > <xsl:output method= xml encoding= ISO-8859-1 /> <xsl:template match= FILMS > <xsl:apply-templates select= FILM /> </xsl:template> <xsl:template match= FILM > <xsl:if test= ANNEE < 1970 > <xsl:copy-of select=. /> </xsl:if> </xsl:template> </xsl:stylesheet> 5
Exemple <xsl:template match= FILM > <xsl:choose> <xsl:when test= ANNEE < 1970 > <xsl:value-of select= TITRE /> est ancien </xsl:when> <xsl:when test= ANNEE > 1970 > <xsl:value-of select= TITRE /> est récent </xsl:when> <xsl:otherwise> de quand date <xsl:value-of select= TITRE />? </xsl:otherwise> </xsl:choose> </xsl:template> 6
Boucle Instruction <xsl:for-each> S utilise avec l attribut select L itération s effectue sur l ensemble de nœuds constitué par l expression Xpath de l attribut select. Le contenu de l élément xsl:for-each est instancié successivement pour chaque nœud de l ensemble. 7
Création de nœuds (élément et attribut) XSLT permet de construire des nœuds dans le document résultat: <xsl:attribute name= xx > permet d ajouter un attribut de nom xx à un élément. Le contenu de l élément xsl:attribute définit la valeur de l attribut (c est un corps de règle qui doit envoyer un noeud de type Text.) <xsl:element name= yy > permet d insérer un élément de nom yy dans le document résultat 8
Création de nœuds <xsl:comment> permet de créer des commentaires <xsl:processing-instruction> crée des instructions de traitement <xsl:text> crée un nœud de type text Le contenu de ces éléments est un corps de règle. 9
Chemins complexes Jusqu à présent, on accédait aux fils d un nœud. On peut aussi accéder à tous les descendants accéder aux parents, aux frères, aux neveux, accéder aux attributs effectuer des boucles Le langage d expression de chemins XPath 10
Exemple : Document XML 1 <?xml version= 1.0 encoding= ISO-8959-1?> 2 <?xml-stylesheet href= Salle.xsl type= text/xsl?> 3 <?cocoon-process type= xslt?> 4 <SALLE NO= 1 PLACES= 320 > 5 <FILM> 6 <TITRE>Alien</TITRE> 7 <AUTEUR>Ridley Scott</AUTEUR> 8 <ANNEE>1979</ANNEE> 9 <GENRE>Science-Fiction</GENRE> 10 <PAYS>Etats-Unis</PAYS> 11 <RESUME>près d un vaisseau spatial </RESUME> 12 </FILM> 13 <REMARQUE>réservation conseillée</remarque> 14 <SEANCES> 15 <SEANCE>15:00</SEANCE> 16 <SEANCE>18:00</SEANCE> 17 <SEANCE>21:00</SEANCE> 18 </SEANCES> 19 </SALLE> 11
Exemple: traduction de Salle 1 <xsl:template match= SALLE > 2 <h2>salle No 3 <xsl:value-of select= @NO /></h2> 4 Film: <xsl:value-of select= FILM/TITRE /> 5 de <xsl:value-of select= FILM/AUTEUR /> 6 <ol> <xsl:for-each select= SEANCES/SEANCE > 7 <li><xsl:value-of select=. /></li> 8 </xsl:for-each> 9 </ol> 10 </xsl:template> 12
Le résultat Appliqué au fichier Salle.xml : 1 <h2>salle No1 </h2> 2 Film: Alien 3 De Ridley Scott 4 <ol> 5 <li>15:00</li> 6 <li>18:00</li> 7 <li>21:00</li> 8 </ol> C est un fragment HTML, à intégrer dans un document complet 13
Chemins complexes Descendants : le titre du film est désigné par select= FILM/TITRE Attributs : le numéro de la salle est désigné par select= @NO Boucles : avec xsl:for-each sur l ensemble des séances désignées par select= SEANCES/SEANCE L élément contexte : désigné par le symbole. comme dans select=. 14
Appels de règles En général, on produit un résultat en combinant plusieurs règles : La règle initiale s applique à la racine du document traité ( / ) on produit alors le cadre du document HTML on appelle d autres règles pour la création du résultat 15
Exemple Cadre HTML, puis appel de la règle CINEMA <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> 16
Règle CINEMA Exploitation de l élément CINEMA, puis appel à la règle SALLE 1 <xsl:template match= CINEMA > 2 <h1><i> 3 <xsl:value-of select= NOM /> 4 </i></h1><hr/> 5 <xsl:value-of select= ADRESSE /> 6 <i>métro: </i> 7 <xsl:value-of select= METRO /> 8 <hr/> 9 <xsl:apply-templates select= SALLE /> 10 </xsl:template> 17
Arbre XML à transformer Cinema Nom Adresse Metro Salle Film Seances Titre Auteur Annee Genre Pays Resume Seance 18
Vue d ensemble xsl:template match= / xsl:template match= CINEMA html h1 hr xsl:value-of hr xsl:apply-templates i head body i title xsl:apply-templates xsl:value-of Métro: xsl:value-of xsl:value-of Application de la règle SALLE 19
Exécution des règles La première règle, appliquée à la racine du document XML, produit un «squelette» du document HTML (balises html, head, body), puis lance l exécution de la règle CINEMA (qui s applique aux éléments CINEMA). La deuxième règle (CINEMA) produit les informations globales sur le cinéma (nom, adresse, métro), puis lance l exécution de la règle SALLE La règle SALLE s applique aux éléments SALLE du document XML, et produit un sous-arbre HTML pour chacun de ces éléments. 20
Sélection d une règle Que faire quand plusieurs règles sont candidates pour un même noeud? il existe des priorités implicites qui permettent au processeur de choisir on peut aussi donner explicitement une priorité si le choix est impossible : le processeur s arrête. 21
Règles par défaut Quand aucune règle n est sélectionnée, XSLT applique des règles par défaut : La 1ère s applique à la racine et à tous les éléments. Elle déclenche un appel de règle pour tous les fils du nœud courant (apply-templates sans attribut select équivaut à la sélection de tous les fils du nœud courant) La 2 ème s applique aux nœuds de texte et aux attributs. Elle insère le contenu textuel de ces nœuds dans le document résultat. La 3 ème s applique aux commentaires et aux instructions, et elle ne fait rien. Un programme minimal (sans règle), produira le contenu textuel du document auquel il s applique. 22
Priorité implicite Intuition : plus c est «spécifique», plus c est prioritaire On utilise l attribut priority. Priorité 0 : les patterns constitués d une seule étape XPath, avec un nom d élément ou d attribut et sans prédicat Priorité -0.5 les filtres autres qu un nom d élément ou d attribut ont une priorité égale à -0,5 ( node(), * ) Tous les autres ont une priorité de 0.5 (prédicats, plusieurs étapes) 23
Mode Permet de guider le processeur dans le choix d une règle à appliquer. En l absence d un attribut mode, la règle est concernée par tout les apply-templates (qui n utilisent pas alors leur attribut mode). Sinon, le mode de la règle et le mode de apply-templates doivent coïncider. 24
Algorithme de sélection d une règle Pour un nœud sélectionné par apply-templates, toutes les règles ayant un attribut match sont potentiellement concernées. On restreint cette liste aux règles qui ont le même mode que applytemplates (s il y en a) On teste le pattern de l attribut match pour déterminer si le nœud satisfait la règle S il y a plusieurs règles, on garde celles qui ont la plus grande préséance d importation (ordre d importation) S il y a plusieurs règles, on prend celle qui a la plus grande priorité 25
Exemple 1 <?xml version="1.0" encoding="iso-8859-1"?> 2 <FILM> 3 <TITRE>Vertigo</TITRE> 4 <ANNEE>1958</ANNEE><GENRE>Drame</GENRE> 5 <MES>Alfred Hitchcock</MES> 6 <RESUME>Scottie Ferguson, ancien inspecteur de 7 police, est sujet au vertige depuis qu il a vu 8 </RESUME> 9 </FILM> 10 <FILM> 11 <TITRE>Alien</TITRE> 12 <ANNEE>1979</ANNEE><GENRE>Science-fiction</GENRE> 13 <MES>Ridley Scott</MES> 14 <RESUME>Près d un vaisseau spatial échoué sur 15 une lointaine planète, des Terriens en mission 16 </RESUME> 17 </FILM> 26
Programme XSLT Une règle pour <RESUME > qui ne fait rien... 1 <xsl:template match="/"> 2 <xsl:apply-templates/> 3 </xsl:template> 4 5 <xsl:template match="resume"/> 6 7 <xsl:template match="@ * node()" priority="-1"> 8 <xsl:copy> 9 <xsl:apply-templates select="@ * node()"/> 10 </xsl:copy> 11 </xsl:template>... moins prioritaire que les autres. 27
Résultat Résultat : on obtient tout le document, sauf les nœuds RESUME. 1 <?xml version="1.0" encoding="iso-8859-1"?> 2 <FILM> 3 <TITRE>Vertigo</TITRE> 4 <ANNEE>1958</ANNEE><GENRE>Drame</GENRE> 5 <MES>Alfred Hitchcock</MES> 6 </FILM> 10 <FILM> 11 <TITRE>Alien</TITRE> 12 <ANNEE>1979</ANNEE><GENRE>Science-fiction</GENRE> 13 <MES>Ridley Scott</MES> 14 </FILM> 28
Paramètres L élément xsl:param permet de passer des paramètres aux règles. 1. Indiquer (dans la règle) le nom du paramètre et sa valeur par défaut <xsl:param name=nom select=expression/> Name : nom du paramètre Select (optionnel) : expression XPath qui donne la valeur par défaut (convertie en chaîne de caractères) <xsl:template name="message"> <xsl:param name="texte" select="string(salut)" /> <xsl:value-of select= "$texte" /> </xsl:template> Si l attribut select est absent, la valeur par défaut est le contenu de l élément xsl:param. <xsl:param name="texte">salut</xsl:param> 29
Passage de paramètres Passer des paramètres à une règle : <xsl:with-param name= "texte" select="string(coucou)"/> Cet élément suit un call-template ou un apply-templates <xsl:template match= / > <xsl:call-template name="message"> <xsl:with-param name="texte" select="string(coucou)" /> </xsl:call-template> <xsl:template> 30
Instructions classiques <xsl:apply-templates/> La liste des nœuds à traiter est constituée des nœuds fils du nœud contexte. Appliquer les règles. <xsl:apply-templates select="p"/> La liste des nœuds à traiter est constituée des nœuds atteints par le chemin p depuis le nœud contexte. Appliquer les règles. <xsl:value-of select="p"/> Recopier dans le flot de sortie la valeur-chaîne de chaque nœud atteint par le chemin p depuis le nœud contexte. <xsl:copy-of select="p"/> Recopier dans le flot de sortie le fragment du document à transformer dont la racine est le nœud atteint par le chemin p depuis le nœud contexte. <xsl:text> t </xsl:text> Recopier dans le flot de sortie le texte t. 31
Conclusion XSLT est un langage adapté au traitement de documents XML : Parcours d un document vu comme un arbre Déclenchement de règles sur certains nœuds association de plusieurs programmes à un même document 32
Bibliographie B. Amann et P. Rigaux : Comprendre XSLT, O Reilly, 2002 Recommandations XSLT sur le site du W3C 33
Traitement des paramètres <xsl:param name= titre /> <xsl:param name= séance /> <xsl:param name= ville /> <xsl:template match="moteur"> <xsl:for-each select="cinema"> <xsl:if test=" CINEMA//TITRE = $titre) and CINEMA//HEURE >= $seance) and CINEMA/VILLE = $ville)"> <xsl:apply-templates select="." /><p/> </xsl:if> </xsl:for-each> </xsl:template> 34