XPath et XSLT Exemple - Cedric
Transcription
XPath et XSLT Exemple - Cedric
1 3 Exemple: Document XML Document XML: XPath et XSLT / Valeur C - Module Données et Services sur le Web Bernd Amann FILM 2003/04 TITRE AUTEUR ANNEE RESUME Vertigo Hitchcock 1958 Scotty... Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann 2 4 Sélectionner des fragments XML Il faut souvent pouvoir sélectionner/extraire des fragments (nœuds) XPath. d’un document XML Exemple: Transformation en HTML Fragment HTML qu’on veut obtenir : p XPath est utilisé par h1 i p i 1958 Hitchcock h3 XSLT pour sélectionner des règles de transformation XQuery pour l’interrogation de documents XML Résumé: Scotty... XML Schéma pour définir des clés/références XLink pour créer des liens entre noeuds XML Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann Vertigo Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann 5 7 Exemple : l’arbre DOM... Exemple : Règle de transformation XSLT / Document FILM TITRE AUTEUR ANNEE RESUME Vertigo Hitchcock 1958 Scotty... Element EXEMPLE * i * i p Résumé: * Text Section littérale avec h3 SectionCDATA des ’&’, des ’ ’ des ’ h1 * ’ Text et un text p Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann 6 8 Puis l’arbre XPath... XPath: Le modèle Document - Le langage XPath permet de désigner un ou plusieurs nœuds dans un document XML, à l’aide d’expressions de chemins/d’arbres. XPath est fondé sur une représentation arborescente (DOM) du document XML Objectif : référencer nœuds (éléments, attributs, commentaires, ...) dans un document XML pas Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann Text Section littérale avec des ’&’, des ’ ’ des ’ Un typage simplifié par rapport à celui de DOM d’entités, pas de sections littérales Element EXEMPLE ’ et un texte Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann 9 11 Expressions XPath : Sémantique Étapes XPath Une expression XPath : Une étape a trois types de composants : ... s’évalue en fonction d’un nœud contexte ! #$ " désigne un ou plusieurs chemins dans l’arbre à partir du nœud contexte ] , %' %& [ +*() :: a pour résultat Exemple : L’axe (optionnel) recouvre les deux notions suivantes : – un ensemble de nœuds – un sous-ensemble des nœuds de l’arbre relatif au nœud contexte ; – ou une valeur, numérique, booléenne ou alphanumérique – l’ordre de parcours de ces nœuds Le filtre (obligatoire) définit le type des nœuds/noms des éléments qui seront retenus Le(s) prédicat(s) (optionnels) doivent être satisfaites par les nœuds retenus. Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann 10 12 Expressions XPath : Syntaxe Document XML avec un nœud contexte Document - Un chemin XPath est une suite d’étapes : - [/]étape /étape /.../étape Instruction Java ins1 Deux variantes : Un chemin peut être 3 0$ 1 $ $1 2 0$ . 1 # $ 67 / / Element B 5 54 absolu : Comment CommFin Element A Element B Element C Le nœud contexte est la racine du document. 0$ 3 1 1 $ $1 2 0$ 5 67 54 relatif : () / Le nœud contexte est un nœud dans le document (pas forcément la racine). Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann Attr att1 a1 Element D Element D Text Texte1 Text Texte2 Attr att1 a2 Element D Attr att2 a3 Attr att3 15 Text Texte3 Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann 13 15 parent::A child::D ou D Document - Instruction Java ins1 Nœud contexte Element D Element D Text Texte1 Text Texte2 Attr att1 a2 Instruction Java ins1 Comment CommFin Element A Element B Attr att1 a1 Document - Element D Element C Attr att2 a3 Element B Attr att3 15 Attr att1 a1 Text Texte3 Nœud contexte Element D Element D Text Texte1 Text Texte2 Attr att1 a2 Element D Element C Attr att2 a3 Attr att3 15 Text Texte3 Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann 14 16 attribute::att1 ou @att1 descendant::node() Document - Instruction Java ins1 Document - Comment CommFin Element A Element B Attr att1 a1 Comment CommFin Element A Nœud contexte Element D Element D Text Texte1 Text Texte2 Attr att1 a2 Element D Instruction Java ins1 Element C Attr att2 a3 Attr att3 15 Text Texte3 Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann Element B Attr att1 a1 Comment CommFin Element A Nœud contexte Element D Element D Text Texte1 Text Texte2 Attr att1 a2 Element D Element C Attr att2 a3 Attr att3 15 Text Texte3 Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann 17 19 ancestor::node() following::node() Document - Instruction Java ins1 Comment CommFin Element A Element B Attr att1 a1 Document - Element C Nœud contexte Element D Element D Text Texte1 Text Texte2 Attr att1 a2 Element D Instruction Java ins1 Attr att2 a3 Element B Attr att3 15 Attr att1 a1 Text Texte3 Comment CommFin Element A Element C Nœud contexte Element D Element D Text Texte1 Text Texte2 Attr att1 a2 Element D Attr att2 a3 Attr att3 15 Text Texte3 Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann 18 20 preceding-sibling::node() Autres axes et axe/étape par défaut Document Autres axes: – preceding : les précédents (dans l’ordre du document) Instruction Java ins1 Comment CommFin Element A Element B Nœud contexte – descendant-or-self : les descendants, plus le nœud contexte – ancestor-or-self : les ancêtres, plus le nœud contexte Element C Element D Element D Text Texte1 Text Texte2 Attr att1 a2 Element D Attr att2 a3 Attr att3 15 Attr att1 a1 L’axe par défaut est child : /A correspond à /child::A L’étape par défaut est descendant-or-self::node() : A//B exprime child::A/descendant-or-self::node()/child::B Text Texte3 Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann 21 23 Filtres //@att2 Deux manières de filtrer les nœuds : Document - par leur nom : possible pour les types de nœuds : Element, ProcessingInstruction et Attr (qui ont un nom) Instruction Java ins1 par leur type DOM : Comment CommFin Element A – * : nœuds de type Element ou Attribute Element B – text() : nœuds de type Text Element C Element B – comment() : nœuds de type Comment – processing-instruction() : nœuds de type ProcessingInstruction Attr att1 a1 Exemple : /processing-instruction(), ou /processing-instruction(’java’) Element D Element D Text Texte1 Text Texte2 Attr att1 a2 Element D Attr att2 a3 Attr att3 15 Text Texte3 – node() recouvre tous les types de nœud Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann 22 24 /A/B/D Nom générique : /A/* Document - Instruction Java ins1 Comment CommFin Element A Element B Attr att1 a1 Document - Element B Element D Element D Text Texte1 Text Texte2 Attr att1 a2 Element D Instruction Java ins1 Element C Attr att2 a3 Attr att3 15 Text Texte3 Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann Element B Attr att1 a1 Comment CommFin Element A Element B Element D Element D Text Texte1 Text Texte2 Attr att1 a2 Element D Element C Attr att2 a3 Attr att3 15 Text Texte3 Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann 25 27 /descendant::text() Notation abrégée de parent::node() Document - Instruction Java ins1 Comment CommFin Element A Element B Element B Element C Attr att1 a1 Element D Element D Text Texte1 Text Texte2 Attr att1 a2 Element D Attr att2 a3 La notation abrégée “..” désigne le père du nœud contexte, quel que soit son type. L’expression “..” est équivalent à parent::node() (le filtre node() désigne tous les types de nœuds sauf les attributs). L’expression “.” désigne le nœud contexte lui-même (surtout utile dans les prédicats). Attr att3 15 Text Texte3 Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann 26 28 /comment() Prédicats Document - Instruction Java ins1 Comment CommFin Element A Element B Attr att1 a1 Element D Element B Element D Attr att1 a2 Element D Element C Attr att2 a3 Attr att3 15 Prédicat : expression booléenne constituée d’un ou plusieurs tests, composés avec les connecteurs logiques habituels and et or Test : – toute expression XPath, dont le résultat est convertie en booléen; – une comparaison, un appel de fonction. il faut connaître les règles de conversion Text Texte1 Text Texte2 Text Texte3 Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann 29 31 Pour bien comprendre Contexte d’évaluation Une étape s’évalue en tenant compte d’un contexte constitué de Dans l’expression /A/B[@att1] : On s’intéresse aux nœuds de type B fils de l’élément racine A. Parmi ces nœuds on ne prend que ceux pour lesquels le prédicat [@att1] s’évalue à true un nœud contexte, position initiale du chemin ; ce nœud fait lui-même partie d’un ensemble obtenu par évaluation de l’étape précédente – on connaît la taille de cet ensemble (fonction last()) Cette expression s’évalue avec pour nœud contexte un élément B – on connaît la position du nœud contexte dans cet ensemble (fonction position()) [@att1] vaut true ssi @att1 renvoie un ensemble de nœuds non vide Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann 30 32 Quelques exemples /A/B/descendant::text()[1] Document - /A/B[@att1] : les nœuds /A/B qui ont un attribut @att1 /A/B[@att1=’a1’] : les nœuds /A/B qui ont un attribut @att1 valant ’a1’ Instruction Java ins1 /A/B/descendant::text()[position()=1] : le premier nœud de type Text descendant d’un /A/B. /A/B/descendant::text()[1] : idem Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann Element B Attr att1 a1 Comment CommFin Element A Element B Element D Element D Text Texte1 Text Texte2 Attr att1 a2 Element D Element C Attr att2 a3 Attr att3 15 Text Texte3 Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann 33 35 Les types XPath Conversions de types On peut effectuer des comparaisons, des opérations. Cela implique un typage et des conversions de type. Deux conversions sont toujours possibles. Les types XPath sont : Vers une chaîne de caractères. – utile pour la production de texte en XSLT (balise xsl:value-of) les numériques les chaînes de caractères Vers un booléen – utile pour les tests effectués dans XSLT (xsl:if, xsl:when) les booléens (true et false) enfin les ensembles de nœuds Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann 34 36 Numériques Conversions booléennes Notation décimale habituelle Comparaisons habituelles (<, >, !=) Opérations : +, -, *, div, mod La fonction number () permet de tenter une conversion Si la conversion échoue on obtient NaN (Not a Number ). À éviter... Pour les numériques : 0 ou NaN sont false, tout le reste est true Pour les chaînes : une chaîne vide est false, tout le reste est true Pour les ensembles de nœuds : un ensemble vide est false, tout le reste est true Ex : //node()[number(@att1) mod 2=1] Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann 37 39 Quelques fonctions utiles : Les fonctions XPath et sélection par valeur Test du nombre d’occurrences : CINEMA[count(SEANCE) > 1]: cinémas avec au moins 2 séances concat(chaîne1, chaîne2, ...) pour concaténer des chaînes contains(chaîne1, chaîne2) teste si chaîne1 contient chaîne2 FILM[count(ACTEUR) = 0]: films sans acteur count (expression) renvoie le nombre de nœuds désignés par expression FILM[not(ACTEUR)]: films sans acteur name() renvoie le nom du nœud contexte Sélection par valeur: FILM[not(ACTEUR[NOM=’Willis’])]: films sans Bruce Willis not(expression) : négation FILM[ACTEUR/NOM=’Willis’]: films avec Bruce Willis FILM[ACTEUR[NOM=’Willis’]]: idem Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann 38 40 Prédicats: Axes d’avancements et inverses La position d’un nœud dépend de l’axe choisi: Axes « d’avancement » : Test sur la structure : chemins imbriqués avec connecteurs logiques (qualifiers) child::*[3]: le 3e enfant Prédicats plus complexes child::*[position()=3]: idem child::*[last()]: le dernier enfant descendant::*[last()]: le dernier descendant Axes « inverses » : ACTEUR[NOM and DATENAISSANCE] ou ACTEUR[NOM][DATENAISSANCE]: les acteurs avec un nom et une date de naissance FILM[@TITRE = ’Brazil’ and ACTEUR/NOM = ’De Niro’]: le film Brazil avec l’acteur De Niro FILM[@TITRE = ’Brazil’][ACTEUR/NOM = ’De Niro’]: idem ancestor::*[1]: le premier ancêtre du nœud contexte (dernier dans l’ordre du document). preceding-sibling::*[last()]: le dernier frère qui précède le nœud contexte (premier dans l’ordre du document). Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann 41 43 Sommaire XPath : Résumé Une introduction à XSLT, destinée à comprendre les mécanismes du langage. XPath est un langage pour extraire des noeuds dans un arbre XML : On navigue dans l’arbre grâce à des axes de navigation. Un chemin de navigation est une séquence d’étapes. Dans chaque étape on choisi un axe, un filtre et éventuellement des prédicats. Le résultat d’une étape (d’une séquence d’étapes) est un séquence de noeuds. Règles XSLT Désignation de fragments XML Appels de règles Application : XML - HTML et XML - WML Passage de paramètres Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann 42 44 XSLT, où, quand, comment »>Logbook error: File ’FIGURES/ArchiXSLT’ does not exist! Introduction à XSLT Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann 45 47 Exemple : La fiche du film Gladiator Fonctions d’un programme XSLT Transformation d’arbres XML: La fiche du film peut être publiée en HTML pour Netscape/IE en WML pour le portables WAP en SMIL pour Realplayer dans un moteur de recherche SallesEnLigne.com L’information ? extraction de données génération de texte suppression de contenu (noeuds) déplacer contenu (noeuds) dupliquer contenu (noeuds) trier c’est la même, sous des formes différentes elle est échangée entre plusieurs acteurs Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann 46 48 Qu’est-ce qu’on peut faire avec XSLT? Exemple: Règle de transformation XSLT utilise XPath pour sélectionner la règle à appliquer et les fragments à afficher ou transformer : Transformer un document XML en un ou plusieurs documents XML, HTML, WML, SMIL document papier: PDF (XSL-FO), LaTeX texte simple arbre DOM Processeur XSLT Sérialisation Analyse Document XML arbre résultat Document XSLT Document résultat Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann <xsl:template match="FILM"> <p> <h1> <i> <xsl:value-of select="TITRE"/> </i> </p> <i> <xsl:value-of select="ANNEE"/> </i> <p> <xsl:value-of select="AUTEUR"/> </p> <h3>Résumé: <xsl:value-of select="RESUME"/> </h3> </p> </xsl:template> Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann 49 51 XSLT et XPath Fonctionnalités XSLT Génération d’un arbre XML: / <xsl:template match="FILM"> <body> <p>Un paragraphe</p> </body </xsl:template> FILM TITRE AUTEUR ANNEE RESUME Vertigo Hitchcock 1958 Scotty... Génération d’arbre avec extraction : <xsl:template match="FILM"> <body> <p>Titre: <xsl:value-of select="TITRE"/> </p> </body> </xsl:template> * i * * h1 i p Résumé: * h3 p Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann 50 52 Fonctionnalités XSLT Structure de base : les règles Extraction de données: Génération de texte: Règle = template : élément de base pour produire le résultat <xsl:template match="FILM"> <xsl:value-of select="TITRE"/> </xsl:template> <xsl:template match="FILM"> Ceci est le texte produit par application de cette règle. </xsl:template> Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann une règle s’applique dans le contexte d’un nœud de l’arbre l’application de la règle produit un fragment du résultat. Programme XSLT = ensemble de règles pour construire un résultat Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann 53 Chemins complexes 55 Exemple de boucle: Traduction de Salle Dans une règle, on peut : <xsl:template match="SALLE"> <h2>Salle No <xsl:value-of select="@NO"/></h2> Film: <xsl:value-of select="FILM/TITRE"/> de <xsl:value-of select="FILM/AUTEUR"/> <ol> <xsl:for-each select="SEANCES/SEANCE"> <li><xsl:value-of select="."/></li> </xsl:for-each> </ol> </xsl:template> accéder aux fils, aux descendants, au parent, aux frères, aux neveux, aux attributs, ... du noeud à transformer (XPath). effectuer des tests et des boucles, etc... “appeler” d’autres règles (récursion) Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann 54 56 Exemple: Document XML <?xml version="1.0" encoding="ISO-8859-1"?> <?xml-stylesheet href="Salle.xsl" type="text/xsl"?> <?cocoon-process type="xslt"?> <SALLE NO=’1’ PLACES=’320’> <FILM> <TITRE>Alien</TITRE> <AUTEUR>Ridley Scott</AUTEUR> <ANNEE>1979</ANNEE> <GENRE>Science-fiction</GENRE> <PAYS>Etats Unis</PAYS> <RESUME>Près d’un vaisseau spatial échoué sur une lointaine planète, des Terriens en mission découvrent de bien étranges "oeufs". Ils en ramènent un à bord, ignorant qu’ils viennent d’introduire parmi eux un huitième passager particulièrement féroce et meurtrier. </RESUME> </FILM> <REMARQUE>Réservation conseillée</REMARQUE> <SEANCES> <SEANCE>15:00</SEANCE> <SEANCE>18:00</SEANCE> <SEANCE>21:00</SEANCE> </SEANCES> </SALLE> Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann Le résultat Appliqué à Salle1.xml : <h2>Salle No 1 </h2> Film: Alien de Ridley Scott <ol> <li> 15:00</li> <li> 18:00</li> <li> 21:00</li> </ol> NB : c’est un fragment HTML, à intégrer dans un document complet. Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann 57 Salles et séances 59 Exemple : L’Épée de bois chemin "@NO" Contexte d’application de la règle SALLE chemin "FILM/TITRE" « Cadre » HTML, puis appel de la règle CINEMA NO=2 PLACES=320 chemin SEANCES/SEANCE <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> FILM chemin "REMARQUE" TITRE Alien AUTEUR ANNEE GENRE Scott Science−Fiction 1979 PAYS USA RESUME REMARQUE SEANCES Réservation Près d’un vaisseau spatial... conseillée boucle for−each SEANCE SEANCE 15:00 18:00 SEANCE 21:00 Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann 58 60 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 compléter la création du résultat Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann Règle CINEMA Exploitation de l’élément CINEMA, puis appel à la règle SALLE <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/> <xsl:apply-templates select="SALLE"/> </xsl:template> Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann 61 Vue d’ensemble 63 Le document XML html head title Règle "/" <?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE MOTEUR [ <!ENTITY EpeeDeBois SYSTEM "http://epee-de-bois.fr/EDB.xml"> <!ENTITY CineMarseille SYSTEM "http://cine-marseille.fr/CM.xml"> ]> <MOTEUR> <CINEMA> &EpeeDeBois; </CINEMA> <CINEMA> &CineMarseille; </CINEMA> </MOTEUR> body h1 hr adresse p p i h2 h3 h2 h3 Epée de bois Salle No 1 Film: Alien Salle No 2 Film : Vertigo Règle "CINEMA" Règle "SALLE" Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann 62 64 XSLT avec paramètres 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 <html> <head> <title>Formulaire de Recherche</title> </head> <body bgcolor="white"> <h1>Formulaire de Recherche</h1> <form method=’get’ action=’Moteur.xml’ name=’Form’> Film: <input type=’text’ name=’titre’> <br> Séance: <input type=’text’ NAME=’seance’ > (hh:mm)<br> Ville: <input type=’text’ name=’ville’><br> <input type=’submit’ name=’chercher’ value="Chercher"/> </form> </body> </html> Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann Traitement des paramètres <xsl:param name="titre"/> <xsl:param name="seance"/> <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> Démo : SallesEnLigne.com Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann 65 67 Principaux éléments de premier niveau Programmation XSLT Type d’élément Description xsl:import Import d’un programme XSLT xsl:include Inclusion d’un programme XSLT xsl:output Indique le format de sortie xsl:param Définit un paramètre xsl:template Définit une règle XSLT xsl:variable Définit une variable XSLT Table 1: Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann 66 68 Règles : définition et déclenchement Éléments XSLT (espace de noms XSLT) Une règle est définie par l’élément xsl:template. Deux possibilités de définition (et de déclenchement) : On distingue : L’élement racine d’un programme : <xsl:stylesheet>. Les éléments de premier niveau, fils de <xsl:stylesheet>. L’attribut match est un pattern XPath définissant les « cibles » de la règle Ex : xsl:template match=’FILM’ – Il s’agit essentiellement des règles (template) - déclenchement par xsl:apply-templates select=’...’ Les instructions : on les trouve dans le corps des règles. L’attribut name donne un nom à la règle Ex : xsl:template name=’TDM’ - déclenchement par xsl:call-template name=’...’ Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann 69 71 Sélection des règles par leur pattern Patterns : Axes autorisés Seulement les axes suivants sont autorisés comme pattern de sélection : Soit le pattern de la règle le nœud Soit Problème : étant donné un nœud, comment trouver la règle qui s’applique ? 4 S’il existe quelque part un nœud tel que l’évaluation de partir de contient : la règle s’applique à L’abréviation // de /descendant-or-self::node()/ Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann 70 72 Exemples de patterns Au départ du processus de transformation : est la racine du document 4 dont le pattern est « / » , Il est donc bon (mais pas indispensable) d’avoir une règle avec pattern « / ». en prenant n’importe quel nœud, l’évaluation de « / » est donc la règle s’applique. Il existe une règle Les attributs d’un élément : attribute Cette restriction garantit qu’on peut savoir si une règle doit être déclenchée pour un noeud uniquement en regardant les ancêtres de , ce qui diminue considérablement la compléxité du l’algorithme de séléction. Exemple : la règle pour la racine Le nœud-contexte Les fils d’un élément : child Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann /COURS/ENSEIGNANTS : la règle s’applique à tous les nœuds ENSEIGNANTS fils d’un élément racine COURS //SEANCE[@ID=2] ; ... à tous les nœuds de type SEANCE ayant un attribut ID valant 2 /descendant::FILM[1] : ... au premier élément de type FILM dans le document FILM[1] : ... aux premiers fils de type FILM (il peut y en avoir plusieurs!) /COURS[@CODE="TC234"] : ... aux cours avec le code TC234 Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann 73 75 Règles par défaut Règle par défaut pour les autres types de nœuds Quand aucune règle n’est sélectionnée, XSLT applique des règles par défaut Pour les instructions de traitement et les commentaires, on ne produit rien. Première règle pour les éléments et la racine du document. <xsl:template match="processing-instruction() | comment()"/> <xsl:template match="* | /"> <xsl:apply-templates/> </xsl:template> on demande l’application de règles pour les fils du nœud courant. Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann 74 76 Règle par défaut pour les noeuds texte et les attributs Conséquence Si on se contente des règles par défaut, on obtient la concaténation de nœuds de type Text. Par défaut, on insère dans le document résultat la valeur du nœud Text, ou de l’attribut. <xsl:template match="text() | @*"> <xsl:value-of select="."/> </xsl:template> Programme minimal : 1 2 3 4 5 <?xml version="1.0" encoding="ISO-8859-1"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> </xsl:stylesheet> NB : le programme n’affiche pas les attributs (pourquoi ?) Cela suppose (surtout pour les attributs) d’avoir utilisé un xsl:apply-templates sélectionnant ces nœuds. Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann 77 79 L’instruction xsl:apply-templates Exemple : filtre de certains nœuds Attributs : select, mode et priority. 1 2 3 select doit sélectionner un ensemble de nœuds. Ils constituent le contexte d’évaluation 4 5 6 pour chaque nœud on va chercher la règle à instancier. 7 8 9 10 11 12 13 mode permet de choisir explicitement une des règles parmi celles qui sont candidates priority permet de définir une priorité pour que le processeur choisisse. 14 15 16 17 <?xml version="1.0" encoding="ISO-8859-1"?> <FILM> <TITRE>Vertigo</TITRE> <ANNEE>1958</ANNEE><GENRE>Drame</GENRE> <MES>Alfred Hitchcock</MES> <RESUME>Scottie Ferguson, ancien inspecteur de police, est sujet au vertige depuis qu’il a vu </RESUME> </FILM> <FILM> <TITRE>Alien</TITRE> <ANNEE>1979</ANNEE><GENRE>Science-fiction</GENRE> <MES>Ridley Scott</MES> <RESUME>Près d’un vaisseau spatial échoué sur une lointaine planète, des Terriens en mission </RESUME> </FILM> Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann 78 80 Sélection d’une règle Que faire quand plusieurs règles sont candidates pour un même nœud ? 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. Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann Le programme XSLT Effacer les noeuds de type RESUME : <xsl:template match="RESUME"/> <xsl:template match="@*|node()" priority="-1"> <xsl:copy> <xsl:apply-templates select="@*|node()"/> </xsl:copy> </xsl:template> Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann 81 83 Priorités implicites Exemple : création de liens HTML Intuition : plus c’est « spécifique », plus c’est prioritaire Priorité 0 : les patterns constitués d’une seule étape XPath, avec un nom d’élément ou d’attribut et sans prédicat On peut créer des ancres « internes » à un document. Priorité -0.5 les filtres autres qu’un nom d’élément ou d’attribut ont une priorité égale à -0,5 ( node(), *) On peut ensuite créer un lien vers cette ancre <a name=’Alien’/> <a href=’#Alien’>Lien vers le film Alien</A> Tous les autres ont une priorité de 0.5 (prédicats, plusieurs étapes) Objectif : une règles pour créer les liens, une autre pour créer les ancres. Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann 82 84 Les modes Raison d’être : un même nœud peut être traité plusieurs fois. Exemple : On parcourt tous les chapitres et sections pour produire une table des matières. On les parcourt à nouveau pour publier le contenu. Donc il faut des règles différentes s’appliquant aux même nœuds : on les distingue par le mode. Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann Les deux règles 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 <xsl:template match="FILM" mode="Ancres"> <a href="#{TITRE}"> <xsl:value-of select="TITRE"/> </a> </xsl:template> <xsl:template match="FILM"> <a name="{TITRE}"/> <h1><xsl:value-of select="TITRE"/></h1> <b><xsl:value-of select="TITRE"/>,</b> <xsl:value-of select="GENRE"/> <br/> <b>Réalisateur</b> : <xsl:value-of select="MES"/> </xsl:template> Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann 85 87 Jointures intra-document L’appel des règles Deux types d’éléments : 1 7 8 9 10 11 12 <xsl:template match="FILMS"> <html> <head><title>Liste des films</title></head> <body bgcolor="white"> <xsl:apply-templates select="FILM" mode ="Ancres"/> <xsl:apply-templates select="FILM"/> </body> </html> </xsl:template> 2 3 4 5 6 Résultat FILM avec un attribut @MES (référence vers le metteur en scène) ARTISTE avec un attribut @ARTID (identificateur) <xsl:template match="FILM"> Titre: <xsl:value-of select="TITRE"/> Metteur en scène: <xsl:value-of select="//ARTISTE [@ARTID=current()/@MES]/NOM"/> </li> </xsl:template> Pourquoi on a besoin de la fonction current()? Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann 86 88 Jointures inter-document Résumé : sélection d’une règle Deux documents : un des nœud sélectionnés. On teste le pattern pour savoir si le nœud satisfait la règle. On prend celle qui a la plus grande priorité. Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann On ne prend que les règles avec le même mode que xsl:apply-templates Soit un xsl:apply-templates, et Films.xml : FILM avec un attribut @MES (référence vers le metteur en scène) Artistes.xml : ARTISTE avec un attribut @ARTID (identificateur) <xsl:template match="FILM"> Titre: <xsl:value-of select="TITRE"/> Metteur en scène: <xsl:value-of select="document(’Artistes.xml’)//ARTISTE [@ARTID=current()/@MES]/NOM"/> </li> </xsl:template> Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann 89 Conclusion sur XSLT Un langage totalement 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 Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann 90 Bibliographie sur XSLT 1. Recommendation XSLT sur le site du W3C 2. B. Amann et P. Rigaux, Comprendre XSLT, O’Reilly http://cortes.cnam.fr:8080/XSLT 3. P. Wadler, A formal semantics of patterns in XSLT Valeur C UV 19786 - Bases de données avancées - 2003/04 - B. Amann