Introduction à XSLT Éric Laporte Institut Gaspard-Monge

Slides:



Advertisements
Présentations similaires
Données structurées et XML
Advertisements

1 3.Langage XSL = XSLT + XSL-FO transformationFormatage.
Transformation de documents XML
DTD Sylvain Salvati
La classe String Attention ce n’est pas un type de base. Il s'agit d'une classe défini dans l’API Java (Dans le package java.lang) String s="aaa"; // s.
Introduction à XSLT Éric Laporte Institut Gaspard-Monge Université Paris-Est Marne-la-Vallée.
1 Cours 5 Introduction aux schémas XML Éric Laporte Institut Gaspard-Monge Université Paris-Est Marne-la-Vallée.
Introduction à XSLT - cours 4
Cours MIAGE Henry Boccon-Gibod 1 XML, langage de structuration documentaire Langage de transformation et langage d'interrogation.
Les espaces de nommage XML par Philippe Poulard 1
XML schema Objectifs Valider un doc. XML pour des contraintes syntaxiques Documenter un type de documents XML caractérisé par des contraintes Encadrer.
Données structurées et XML
XHTML EXtensible HyperText Markup Language. HTML et XML HTML (HyperText Markup Language) et XML (eXtensible Markup Language) sont deux spécifications.
Cours 2 : Transformation de documents XML
le langage les éléments
Les fonctions de XPath et XSLT
Domaines nominaux XSLT
Nicolas Singer Maître de conférence, université Champollion
version Beta Marie Calberg Ninni Louhelainen SLFN7
Tutoriel XSLT F. Sajous ERSS – 01/04/2005.
XML Un format d'échange et un langage de présentation des données associé au HTML.
Manipulation d’XML avec XSL
Les sous-programmes Chapitre n° 5: Objectifs : Activité:
CREATION DE FEUILLE DE STYLE pour structuré le document XML
UNIVERSITE CHOUAIB DOUKKALI Département des mathématiques
Les méthodes en java Une méthode est un regroupement d’instructions ayant pour but de faire un traitement bien précis. Une méthode pour être utilisée.
Xml/xslt : Extensible Stylesheet Language Transformation réalisé par: saÏd NAÏM.
Web Structurel
Introduction à la structuration des documents: les techniques M2: Gestion des connaissances.
XML: Syntaxe XML, DTD et Schémas
Notions sur le XML Réfs : manuel p 149. Introduction Le XML (eXtensible Markup Language) est un standard d'échange de données. Il fait partie comme le.
Xpath XML Path language par Yves Bekkers
XSLT Langage de transformation darbre par Yves Bekkers.
Rappel (très) succint d’éléments techniques (XML, DTD, XSL, PHP)
STAF 2X XSL/FO Glaus & Ruckstuhl Mars © Glaus & Ruckstuhl TECFA Programme du 18 et 19 mars Revision XML Introduction à XSL/FO (intérêts et.
Schémas XML - cours 2 Éric Laporte Institut Gaspard-Monge
PhP-MySQL Pagora 2012/2013 CTD 1 - Presentation de moi ^^
XSLT : trier et mettre en valeur le contenu d’un document XML
Support des connaissances TP2 XSL-T
XML Plan du cours Introduction au fichier XML
Les feuilles de style CSS
Animateur : Med HAIJOUBI
Javascript 1° PARTIE : LES BASES
8 - XML Cours XML.
Le Langage XML Belkhir Abdelkader Laboratoire LSI USTHB
1 Programmation Web II 2 ème année Licence Appliquée IAG Faculté des Sciences Economiques et de Gestion de Nableul Université 7 novembre à Carthage Années.
Le langage XHTML 420-S4W-GG Programmation Web Client
Les outils de base : XPath, XSL, XLink, XForms
XSL eXtensible Stylesheet Language Historique 1999: XSLT 1.0 et XPATH 1.0 : versions supportées par la plupart des outils depuis février 2007 XSLT 2.0.
LE HTML ISN Terminale S Un peu d’histoire …
Le langage XML.
XPath XML Path UP Web Année universitaire
Programmation Web : Introduction à XML
Programmation Web : Schémas XSD Jérôme CUTRONA 19:27:07 Programmation Web
Technologies web et web sémantique TP3 - XML. XML eXtensible Markup Language (langage extensible de balisage) – Caractéristiques: méta-langage = un langage.
Publication et Traitement avec XSL
Copyright © 2005 Yves MARCOUX1 Concepts XML de base Yves MARCOUX EBSI - Université de Montréal.
 Syntaxe du langage PHP
1 Schémas XML - cours 1 Éric Laporte Institut Gaspard-Monge Université Paris-Est Marne-la-Vallée.
MJ. Blin et M. CsernelPoleInfo31 XML et ses environnements Documents XML bien formés Prologue Arbre d'éléments Attributs Commentaires Entités internes.
Introduction à XML Yves Bekkers. Plan Introduction - structurer l’information Les langages à balises - un peu d’histoire XML - concepts de base Outils.
 G. Gardarin Les outils de base: Publication avec XML 1. XPATH 2. XSLT 3. XSLFO 4. XLink, XForms, RSS, … 5. XML et la bureautique.
Soutenance du mémoire de synthèse
Module : Langage XML (21h)
Modélisation des documents: DTD et Schéma
eXtensible Markup Language. Généralités sur le XML.
Introduction à MathML Par Katia Larrivée UQO Le 18 mars 2004.
XML : un métalangage pour la description de documents structurés XML a été défini par le consortium W3 en fonction de 2 objectifs: Compenser les limitations.
XSLT. Les documents XML peuvent avoir dans leur prologue une instruction de traitement xml-stylesheet. Cette instruction de traitement indique au navigateur.
INF2005– Programmation web– A. Obaid Variantes de HTML.
Transcription de la présentation:

Introduction à XSLT Éric Laporte Institut Gaspard-Monge Université Paris-Est Marne-la-Vallée

XML Extensible markup language Langage de balisage extensible Exemple d'utilisation Représenter le contenu d'une base de données, mais en clair (plus encombrant) Exemple : un catalogue de plantes

Contenu d'une base de données <?xml version="1.0" encoding="ISO-8859-1"?> <!-- Edited with XML Spy v4.2 --> <CATALOG> <PLANT> <COMMON>Bloodroot</COMMON> <BOTANICAL>Sanguinaria canadensis</COMMON> <ZONE>4</ZONE> <LIGHT>Mostly Shady</LIGHT> <PRICE unit="euro">2.44</PRICE> <AVAILABILITY>031599</AVAILABILITY> </PLANT> <COMMON>Columbine</COMMON>

Objectifs des cours sur XSLT Manipuler des documents XML Les programmes XSLT sont des documents XML Entrées = obligatoirement des documents XML Sorties = souvent des documents XML Apprendre le langage XSLT Langage de transformation d'arbres Apprendre le langage Xpath Langage d'expressions XML inclus dans XSLT et autres Contrôle des connaissances : TP noté

Logiciels Éditeurs XML, éditeurs de code source Les documents XML sont traités comme du code source Navigateurs Les documents XML sont traités comme des pages web à visualiser (prétraitement automatique) Logiciels spécialisés Pour certains types de documents XML

Syntaxe XML Document "bien formé" = qui respecte la syntaxe XML Plus strict que la syntaxe HTML Logiciels traitant des documents XML : navigateurs, processeurs XSLT.... Plus ou moins stricts sur la syntaxe des documents d'entrée Élément Délimité par une balise ouvrante et une balise fermante <PRICE unit="euro">2.44</PRICE> Ou réduit à une balise "vide" (élément vide) <PRICE unit="euro"/>

XML bien formé : éléments (1/2) Les éléments forment un arbre <jour></jour><mois></mois> : disjoints, OK <mois><jour></jour></mois> : imbriqués, OK <mois><jour></mois></jour> : incorrect Deux éléments sont imbriqués ou disjoints La balise fermante est obligatoire En HTML on peut omettre certaines balises fermantes <br><br><br> Document --> arbre : analyse syntaxique Arbre --> document : sérialisation

XML bien formé : éléments (2/2) L'arbre doit avoir un élément racine unique <?xml version="1.0" encoding= "ISO-8859-1" ?> <LookUpData> <averagingMethodScheme> <tag id = "Unweighted">Unweighted</tag> <tag id = "Weighted">Weighted</tag> </averagingMethodScheme> <businessCenterScheme> <tag id = "Taipei">TWTA</tag> <tag id = "Chicago">USCH</tag> </businessCenterScheme> <currencyScheme> <tag id = "EUR">EUR</tag> <tag id = "GRD">GRD</tag> <tag id = "USD">USD</tag> </currencyScheme> </LookUpData> Ce qu'il y a avant ou après ne doit pas être des éléments

XML bien formé Valeurs d'attributs entre guillemets ou entre apostrophes <PRICE unit="euro"/> <PRICE unit='euro'/> Déspécialiser les caractères " ou ' dans les valeurs d'attributs " " quotation mark ' &apos; apostrophe <OEUVRE ref="Molière, 1668, "L'Avare""/> : non <OEUVRE ref='Molière, 1668, "L'Avare"'/> : non <OEUVRE ref='Molière, 1668, "L&apos;Avare"'/>

Indentation L'indentation facilite la visualisation en arbre <CATALOG> <PLANT> <COMMON>Bloodroot</COMMON> </PLANT> <COMMON>Columbine</COMMON> Un document XML non indenté est illisible L'indentation est obligatoire

XML : autres exemples d'utilisation Équivalent d'une base de données Exemple : catalogue de plantes Document-texte structuré Texte et informations signalétiques, structurelles, liens... Exemple : XHTML Code Langages de programmation, grammaires... Exemple : XSLT Autres CML : description de molécules et de réactions chimiques

Document texte structuré <?xml version="1.0"?> <livre auteur = "Hugo"> <titre>Les Châtiments</titre> <chapitre> <section>Buonaparte </section> <section>Neige</section> </chapitre> … </livre>

Document et arbre <?xml version="1.0"?> <livre auteur = "Hugo"> <titre>Les Châtiments</titre> <chapitre> <section>Buonaparte </section> <section>Neige</section> </chapitre> … </livre> livre chapitre chapitre titre section section Les Châtiments Neige Buonaparte

XHTML : visualisation sur écran Comme HTML mais bien formé et balises en minuscules <?xml version="1.0" encoding= "ISO-8859-1" ?> <!-- saved from url=(0063)http://www.mozart oz.org/mogul/doc/lager/brill-tagger/penn.html --> <html><head><title>Penn Tagset</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"/> <meta content="MSHTML 6.00.2800.1170" name="GENERATOR"/></head> <body text='#000000' vLink='#551a8b' aLink='#b0e0e6' link='#0000ee' bgColor='#ffffff'> <h1>Penn Treebank Tagset </h1> <p>Here are the most important tags. See also:<br/>The Penn Treebank. In <I>Computational Linguistics</I>, volume 19, number 2, pp313-330. </p></body></html>

XSLFO : visualisation sur papier <?xml version="1.0" encoding="utf-8"?> <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"> <fo:layout-master-set> <fo:simple-page-master master-name="first" margin-left="2cm" margin-right="2cm" margin-bottom="0.5cm" margin-top="0.75cm" page-width="21cm" page-height="29.7cm"> <fo:region-body/> </fo:simple-page-master> </fo:layout-master-set> <fo:page-sequence master-reference="first"> <fo:flow flow-name="xsl-region-body" font-size="14pt" line-height="14pt"> (...) </fo:flow> </fo:page-sequence> </fo:root>

Code : XSLT <?xml version="1.0" encoding="ISO-8859-1"?> <!-- elementRacineUnique.xsl --> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.1"> <xsl:output version="1.0" encoding="ISO-8859-1" indent="yes"/> <xsl:template match="/"> <xsl:apply-templates/> </xsl:template> <xsl:template match="/*"> <xsl:copy> </xsl:copy> </xsl:stylesheet>

Programme XSLT produisant du XSLFO <?xml version="1.0"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" version="1.0" > <xsl:output method="xml" indent="yes"/> <xsl:strip-space elements="page content"/> <!-- rule for the whole document: root element is page --> <xsl:template match="page"> <fo:root> <fo:layout-master-set> <!-- Definition of a single master page. It is simple (no headers etc.) --> <fo:simple-page-master master-name="first" margin-left="2cm" margin-right="2cm" margin-bottom="0.5cm" margin-top="0.75cm" page-width="21cm" page-height="29.7cm" > <!-- required element body --> <fo:region-body/> </fo:simple-page-master> </fo:layout-master-set> (...) Mélange de balises XSLT et XSLFO

Document XML appelant un programme XSLT <?xml version="1.0" encoding="iso-8859-1"?> <?xml-stylesheet href="style1.xsl" type="text/xsl"?> <CATALOGUE> <ARTICLE> <REFERENCE>JT3006</REFERENCE> <PRIX UNIT="FFR" TAX="TTC">1874</PRIX> </ARTICLE> … </CATALOGUE>

XSL, XSLT, XSLFO Le projet XSL Extensible stylesheet language = Langage de feuilles de style extensible Le format XSL devait être un format de feuilles de style pour visualisation de documents, comme CSS mais en XML Le projet s'est divisé en deux : XSL transformations Langage de transformation d'arbres XSL formatting objects Langage de visualisation de documents

Code : grammaires en XML Chaque type de document XML a sa syntaxe XHTML, XSLFO, XSLT, CML... et on peut en définir de nouveaux Grammaire Définit la syntaxe d'un type de document Exemple : DTD Grammaire en XML : schéma XML Un document est valide par rapport à une grammaire s'il respecte les contraintes en plus d'être bien formé

Une DTD <!ENTITY % Text "(#PCDATA|i|citation|liste)*"> <!ELEMENT i (#PCDATA|i)*> <!ELEMENT p %Text;> <!ELEMENT liste (entree*)> <!ELEMENT entree %Text;> <!ELEMENT filmographie (resumes, aliases, perso, roles) > <!ELEMENT resumes (resume*)> <!ELEMENT resume %Text;> <!ATTLIST resume filmref ID #REQUIRED realisateur CDATA #REQUIRED img CDATA #IMPLIED pdf CDATA #IMPLIED> <!ELEMENT aliases (alias*)> (...)

Un schéma XML <?xml version="1.0" encoding="ISO-8859-1" ?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:simpleType name="stringtype"> <xs:restriction base="xs:string"/> </xs:simpleType> <xs:complexType name="shiptotype"> <xs:sequence> <xs:element name="name" type="stringtype"/> <xs:element name="address" type="stringtype"/> <xs:element name="city" type="stringtype"/> <xs:element name="country" type="stringtype"/> </xs:sequence> </xs:complexType> (...) <xs:element name="shiporder" type="shipordertype"/> </xs:schema>

DTD ou schéma XML ? DTD Grammaire en SGML (ancien concurrent de XML) Une DTD n'est pas un document XML Compatible avec XML Format très utilisé Schéma XML Grammaire en XML Permet d'engendrer du code Java Jugé compliqué Version simplifiée : Relax NG

Premier programme XSLT (1/4) Objectif Interroger un document équivalent à une base de données et en extraire une information Exemple : quel est le prix de la plante dont le nom est Potentilla ? Entrée : un document XML bien formé Sortie : du texte ou un fichier texte <?xml version="1.0" encoding="ISO-8859-1"?> <!-- interrogation.xsl --> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> <xsl:output method="text"/> <xsl:template match="/"> <xsl:value-of select="/CATALOG/PLANT[BOTANICAL='Potentilla']/PRICE"/> </xsl:template> </xsl:stylesheet>

Premier programme XSLT (2/4) <xsl:template match="/"> : "règle" contenant des instructions qui sont exécutées <xsl:value-of> : trouver un noeud de l'arbre et le copier sous la forme d'un texte sans les balises /CATALOG/PLANT : expression Xpath absolue qui trouve tous les noeuds correspondant aux éléments PLANT <?xml version="1.0" encoding="ISO-8859-1"?> <!-- interrogation.xsl --> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> <xsl:output method="text"/> <xsl:template match="/"> <xsl:value-of select="/CATALOG/PLANT[BOTANICAL='Potentilla']/PRICE"/> </xsl:template> </xsl:stylesheet>

Arbre du document source CATALOG ... PLANT PLANT ... BOTANICAL ZONE LIGHT PRICE Mostly Shady 4 2.44 Sanguinaria canadensis

Premier programme XSLT (3/4) [BOTANICAL='Potentilla'] : "prédicat" Xpath qui sélectionne certains noeuds parmi les précédents Le prédicat est attaché à l'expression PLANT BOTANICAL : expression Xpath relative (évaluée à partir du noeud contexte du prédicat) <?xml version="1.0" encoding="ISO-8859-1"?> <!-- interrogation.xsl --> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> <xsl:output method="text"/> <xsl:template match="/"> <xsl:value-of select="/CATALOG/PLANT[BOTANICAL='Potentilla']/PRICE"/> </xsl:template> </xsl:stylesheet>

Premier programme XSLT (4/4) = : opérateur Xpath qui transforme ses deux opérandes en chaînes de caractères avant de les comparer /PRICE : expression Xpath qui s'applique seulement aux PLANT filtrés (et non aux noeuds BOTANICAL) / : ici, séparateur d'étapes dans l'expression Xpath <?xml version="1.0" encoding="ISO-8859-1"?> <!-- interrogation.xsl --> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> <xsl:output method="text"/> <xsl:template match="/"> <xsl:value-of select="/CATALOG/PLANT[BOTANICAL='Potentilla']/PRICE"/> </xsl:template> </xsl:stylesheet>

Interroger un document XML Méthode générale Faire une règle <xsl:template match="/"> qui contient une instruction <xsl:value-of select="..."/> avec une expression Xpath absolue Si on écrit un prédicat, on peut utiliser des expressions Xpath relatives à l'intérieur L'expression Xpath est entre guillemets car valeur d'attribut <?xml version="1.0" encoding="ISO-8859-1"?> <!-- interrogation.xsl --> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> <xsl:output method="text"/> <xsl:template match="/"> <xsl:value-of select="/CATALOG/PLANT[BOTANICAL='Potentilla']/PRICE"/> </xsl:template> </xsl:stylesheet>

Expressions XPath absolues expression signification /livre/chapitre/section /* l'élément racine //section tous les éléments section //* tous les éléments /livre/chapitre|/livre/table (pas de mise en facteur)

Expressions XPath relatives Si on est dans un prédicat, évaluées par rapport au "noeud contexte" expression signification chapitre éléments chapitre fils du noeud * éléments fils du noeud . le noeud contexte chapitre/section|chapitre/figure (pas de mise en facteur)

Variante 1 : extraire un sous-arbre Remplacer value-of par copy-of <xsl:value-of/> copie sous la forme d'un texte sans les balises <xsl:copy-of/> copie le sous-arbre (sérialisation) Remplacer method=text par method=xml <xsl:output method="text"> déclare que le résultat est un fichier "plat" (sans balises) <xsl:output method="xml"> déclare que le résultat est XML <?xml version="1.0" encoding="ISO-8859-1"?> <!– sous-arbre.xsl --> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> <xsl:output method="xml"/> <xsl:template match="/"> <xsl:copy-of select="/CATALOG/PLANT[BOTANICAL='Potentilla']"/> </xsl:template> </xsl:stylesheet>

Résultat <?xml version="1.0" encoding="UTF-8"?><PLANT> <COMMON>Cinquefoil</COMMON> <BOTANICAL>Potentilla</BOTANICAL> <ZONE>Annual</ZONE> <LIGHT>Shade</LIGHT> <PRICE unit="euro">7.06</PRICE> <AVAILABILITY>052599</AVAILABILITY> </PLANT> Le processeur XSLT a inséré une déclaration XML Le résultat est par défaut un document XML, ou HTML dans certaines conditions

Variante 2 : en deux étapes (1/2) La première règle trouve le noeud PLANT qui correspond au nom "Potentilla" La deuxième règle trouve le noeud PRICE à partir du noeud PLANT <?xml version="1.0" encoding="ISO-8859-1"?> <!– deux-etapes.xsl --> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0"> <xsl:output method="text"/> <xsl:template match="/"> <xsl:apply-templates select="/CATALOG/PLANT[BOTANICAL='Potentilla']"/> </xsl:template> <xsl:template match="/CATALOG/PLANT[BOTANICAL='Potentilla']"> <xsl:value-of select="PRICE"/> </xsl:stylesheet>

Variante 2 : en deux étapes (2/2) Dans la première règle, le "noeud courant" est la racine de l'arbre Dans la deuxième règle, le noeud courant est le noeud PLANT qui correspond au nom "Potentilla" Le value-of contient une expression relative évaluée à partir du noeud courant <xsl:template match="/"> <xsl:apply-templates select="/CATALOG/PLANT[BOTANICAL='Potentilla']"/> </xsl:template> <xsl:template match="/CATALOG/PLANT[BOTANICAL='Potentilla']"> <xsl:value-of select="PRICE"/>

Comment ça marche ? Quand on entre dans une règle <xsl:template match="...">, on change de noeud courant Quand on ressort de la règle, on retrouve le noeud courant précédent (pile à l'exécution) L'appel <xsl apply-templates select="..."/> et la règle <xsl:template match="..."> avec la même expression absolue permettent de changer de règle <xsl:template match="/"> <xsl:apply-templates select="/CATALOG/PLANT[BOTANICAL='Potentilla']"/> </xsl:template> <xsl:template match="/CATALOG/PLANT[BOTANICAL='Potentilla']"> <xsl:value-of select="PRICE"/>

Noeud courant et noeud contexte Noeud contexte : à l'intérieur d'une expression Xpath Change à chaque étape de l'expression Noeud courant : à l'intérieur d'une règle - Change à chaque appel de règle - La fonction Xpath current() donne le noeud courant <xsl:template match="/"> <xsl:apply-templates select="/CATALOG/PLANT[BOTANICAL='Potentilla']"/> </xsl:template> <xsl:template match="/CATALOG/PLANT[BOTANICAL='Potentilla']"> <xsl:value-of select="current()/PRICE"/>

Et si l'expression Xpath trouve plusieurs noeuds ? (1/5) Les expressions Xpath ressemblent aux expressions Unix sur les arborescences de répertoires, mais il y a une différence /livre/chapitre/section Expression Unix : donne au plus 1 répertoire Expression Xpath : peut donner plusieurs noeuds

Et si l'expression Xpath trouve plusieurs noeuds ? (2/5) Avec <xsl:value-of/> : <xsl:template match="/"> <xsl:value-of select="/CATALOG/PLANT/PRICE"/> </xsl:template> L'expression trouve les noeuds PRICE de toutes les plantes Résultat : 2.44 9.37 6.81 9.90 6.44 9.03 4.45 3.99 3.23... <xsl:value-of/> ajoute un espace entre deux noeuds [En XSLT 1, <xsl:value-of/> ne copiait que le premier des noeuds trouvés, ici le prix de la première plante]

Et si l'expression Xpath trouve plusieurs noeuds ? (3/5) Avec <xsl:copy-of/> : <xsl:template match="/"> <CATALOG> <xsl:copy-of select="/CATALOG/PLANT[LIGHT='Sunny']"/> </CATALOG> </xsl:template> On obtient plusieurs éléments PLANT Pour avoir un document XML bien formé, il faut créer un élément racine unique

Et si l'expression Xpath trouve plusieurs noeuds ? (4/5) Les balises et le texte du programme XSLT sont copiés dans le document résultat, sauf certains espaces blancs <xsl:template match="/"> <CATALOG> <xsl:copy-of select="/CATALOG/PLANT[LIGHT='Sunny']"/> </CATALOG> </xsl:template> <?xml version="1.0" encoding="UTF-8"?><CATALOG><PLANT> <COMMON>Black-Eyed Susan</COMMON> <BOTANICAL>Rudbeckia hirta</BOTANICAL> <ZONE>Annual</ZONE> <LIGHT>Sunny</LIGHT>

Et si l'expression Xpath trouve plusieurs noeuds ? (5/5) Avec <xsl:apply-templates/> : <xsl:template match="/"> <xsl:apply-templates select="/CATALOG/PLANT[ZONE='5']"/> </xsl:template> <xsl:template match="/CATALOG/PLANT[ZONE='5']"> <xsl:value-of select="PRICE"/> Quand l'appel <xsl:apply-templates/> trouve plusieurs noeuds, la règle est exécutée une fois pour chaque noeud : "appel par noeud" Résultat : 3.903.20 (prix des deux plantes de la zone 5, sans espace blanc)

Fonctions Xpath sur chaînes de caractères (1/5) Quels sont les prix des plantes dont le nom anglais contient Phlox ? <xsl:value-of select="/CATALOG/PLANT[contains(COMMON,'Phlox')]/PRICE"/> contains(COMMON,'Phlox') renvoie vrai si COMMON contient 'Phlox' contains() convertit COMMON en chaîne de caractères en supprimant les balises, comme <xsl:value-of/> : "valeur textuelle", et non sérialisation

Fonctions Xpath sur chaînes de caractères (2/5) Les prix des plantes dont le prix commence par "2." (entre 2 et 3 euros) "/CATALOG/PLANT[starts-with(PRICE,'2.')]/PRICE" Les plantes dont la disponibilité finit par "98" (disponibles en 1998) "/CATALOG/PLANT[ends-with(AVAILABILITY,'98')]" "/CATALOG/PLANT[substring(AVAILABILITY,5,2)='98']" substring (string, start, length) : les indices commencent à 1

Fonctions Xpath sur chaînes de caractères (3/5) Les plantes dont le nom scientifique commence par le mot Trillium suivi d'un espace "/CATALOG/PLANT[substring-before(BOTANICAL,' ')='Trillium']" Les plantes dont le prix en euros est un nombre entier "/CATALOG/PLANT[substring-after(PRICE,'.')='00']" Les plantes dont le nom anglais dépasse 20 caractères "/CATALOG/PLANT[string-length(COMMON)>20]"

Fonctions Xpath sur chaînes de caractères (4/5) Pour que la comparaison se fasse sur les minuscules [translate(COMMON, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')='anemone']" Pour concaténer plusieurs chaînes <xsl:value-of select="concat('Price: ', PRICE, ' dollars')"/> normalize-space() supprime les espaces blancs au début et à la fin et remplace toute autre séquence blanche par 1 espace <xsl:value-of select="normalize-space(COMMON)"/>

Fonctions XPath sur chaînes de caractères (5/5) http://www.w3.org/TR/xpath-functions/ http://www.w3schools.com/Xpath/xpath_functions.asp substring(string, start, length) string(obj) conversion string-length(str) concat(str1, str2,...) normalize-space(str) translate(str, entrees, sorties) contains(str, partie) starts-with(str, prefixe) substring-after(str, partie) substring-before(str, partie)

On récapitule <xsl:template> définit une règle <xsl:value-of/> copie le texte sans les balises <xsl:output/> déclare si la sortie est XML ou plate <xsl:copy-of/> sérialise un sous-arbre <xsl:apply-templates/> appelle des règles

Application Comprendre la structure d'un document XML existant Observer des exemples dans le document XML Si le document est complexe, utiliser XSLT pour l'interroger Autre méthode possible Étudier une grammaire du document XML (DTD ou schéma XML)

Exemple : toutes les entrées du catalogue ont-elles un prix ? (1/2) On extrait les plantes qui n'ont pas de champ PRICE <xsl:template match="/"> <CATALOG> <xsl:copy-of select="//PLANT[not(PRICE)]"/> </CATALOG> </xsl:template> [PRICE] : sélectionne les noeuds contexte pour lesquels l'expression relative PRICE n'est pas vide [not(PRICE)] : négation

Exemple : toutes les entrées du catalogue ont-elles un prix ? (2/2) Résultat <?xml version="1.0" encoding="UTF-8"?><CATALOG/> <CATALOG/> est vide, donc toutes les plantes ont un prix Conversion d'un ensemble de noeuds en booléen Si l'ensemble est vide, faux, sinon vrai <xsl:template match="/"> <CATALOG> <xsl:copy-of select="//PLANT[not(PRICE)]"/> </CATALOG> </xsl:template>

Variante 1 : compter On compte les plantes qui n'ont pas de champ PRICE <xsl:template match="/"> <xsl:value-of select="count(//PLANT[not(PRICE)])"/> </xsl:template> Résultat : un fichier qui contient le texte "0"

Variante 2 : envoyer un message Pour un résultat aussi court, au lieu d'écrire dans un fichier, on peut envoyer un message sur le terminal <xsl:template match="/"> <xsl:message> <xsl:value-of select="count(//PLANT[not(PRICE)])"/> </xsl:message> </xsl:template> Résultat : le message "0" apparaît sur le terminal

Expressions booléennes Xpath Toutes les plantes du catalogue ont-elles les 6 mêmes champs que la première ? Opérateurs booléens en Xpath : and, or, not() <xsl:template match="/"> <xsl:message> <xsl:value-of select= "count(//PLANT[not( COMMON and BOTANICAL and ZONE and LIGHT and PRICE and AVAILABILITY )])"/> </xsl:message> </xsl:template>

Toutes les entrées ont-elles 6 champs ? Toutes les plantes du catalogue ont-elles les 6 mêmes champs que la première ? <xsl:template match="/"> <xsl:message> <xsl:value-of select="count(//PLANT[count(*) != 6])"/> </xsl:message> </xsl:template> * : expression Xpath relative qui trouve les éléments fils

Les champs ont-ils des éléments fils ? * : expression Xpath relative qui trouve les éléments fils <xsl:template match="/"> <xsl:message> <xsl:value-of select="count(//PLANT/*/*)"/> </xsl:message> </xsl:template> Prédicat qui trouve si un noeud n'est pas une feuille de l'arbre des éléments : [*] Prédicat qui trouve si un noeud est une feuille : [not(*)]

Combien y a-t-il d'entrées ? <xsl:template match="/"> <xsl:message> <xsl:value-of select="count(//PLANT)"/> </xsl:message> </xsl:template> Résultat : 36 Tous les noeuds PLANT sont-ils au même niveau ? <xsl:template match="/"> <xsl:message> <xsl:value-of select="count(/CATALOG/PLANT)"/> </xsl:message> </xsl:template> Résultat : 36 aussi donc oui

La racine (1/3) <xsl:value-of select="count(/CATALOG/PLANT)"/> On refait l'expérience avec une expression Xpath relative : <xsl:template match="/"> <xsl:message> <xsl:value-of select="count(PLANT)"/> </xsl:message> </xsl:template> Résultat : 0 ! En fait le noeud courant n'était pas CATALOG

La racine (2/3) À la racine de l'arbre il y a deux noeuds distincts - le noeud racine, qui n'est pas un élément l'élément racine, qui est fils du noeud racine Quand on entre dans la règle, le noeud courant est le noeud racine (/) Les noeuds PLANT ne sont donc pas fils du noeud courant CATALOG ... PLANT PLANT <xsl:template match="/"> <xsl:message> <xsl:value-of select="count(PLANT)"/> </xsl:message> </xsl:template>

La racine (3/3) <xsl:template match="/"> <xsl:message> <xsl:value-of select="count(CATALOG/PLANT)"/> </xsl:message> </xsl:template> Résultat : 36 CATALOG ... PLANT PLANT

On change de document source <?xml version="1.0" encoding="utf-8"?> <iTunes> <Major_Version>1</Major_Version> <Minor_Version>1</Minor_Version> <Application_Version>4.6</Application_Version> <Music_Folder>file://localhost/C:/My%20Music/</Music_Folder> <Library_Persistent_ID>B2BF2C09D305D49C</Library_Persistent_ID> <Tracks> <Track> <Track_ID>37</Track_ID> <Name>American Beauty - Theme</Name> <Artist>Air</Artist> <Album>american beauty soundtrack</Album> <Kind>MPEG audio file</Kind> <Size>3948579</Size> ...

Tous les éléments <Track> sont-ils fils d'un élément <Tracks> ? local-name() et name() : fonctions Xpath qui trouvent le nom du noeud contexte ou du noeud passé en argument <xsl:template match="/"> <xsl:message> <xsl:value-of select="count(//*[local-name()!='Tracks']/Track)"/> </xsl:message> </xsl:template> Réponse : 0, donc : oui, ils sont tous fils d'un Tracks La différence entre local-name() et name() concerne les espaces de noms

Les champs d'un <Track> ont-ils tous du texte ? text() : expression Xpath qui trouve un noeud texte fils du noeud contexte <xsl:message> <xsl:value-of select="count(//Track/*[not(text())])"/> </xsl:message> Réponse : 0, donc : oui, ils ont tous du texte Les noeuds en XML sont typés : éléments, texte, racine...

Par curiosité Taille moyenne d'une piste <xsl:message> <xsl:value-of select="sum(//Track/Size) div count(//Track[Size])"/> </xsl:message> Résultat : 4.667590770114942E6 sum() transforme son argument en ensemble de nombres et calcule la somme div : division idiv : division entière mod : reste

Attributs (1/3) <?xml version="1.0"?> <filmographie> <resumes> <resume filmref="f1" realisateur="Vassili Silovic">[Documentaire]</resume> <resume filmref="f2" realisateur="Chuck Workman">[Documentaire]</resume> <resume filmref="f3" img="03.jpg" pdf="03.pdf" realisateur="Steven Martin">A documentary about the amazing life of Leon Theremin, inventor of the theremin, the electronic musical instrument so beloved of 50s sci-fi movie music. Theremin amazed America with his instrument until his kidnapping by Soviet agents in the mid-30s. Upon his release from a labor camp, he worked on surveillance devices for the KGB. Almost 60 years later, he is brought back to America for a touching reunion with his friends and colleagues.</resume>

Attributs (2/3) Extraire les éléments <resume> qui ont un attribut pdf <resumes> <xsl:copy-of select="//resume[@pdf]"/> </resumes> L'expression Xpath @pdf est convertie du type ensemble de noeuds au type booléen : si vide alors faux, sinon vrai Les attributs sont des noeuds de l'arbre XML L'expression Xpath //resume[@pdf] trouve les éléments <resume>, et non les attributs pdf

Attributs (3/3) Extraire les éléments <citation> dont l'attribut auteur n'est pas Herself <citations> <xsl:copy-of select="//citation[@auteur!='Herself']"/> </citations> L'expression Xpath @auteur est convertie en chaîne de caractères Le document résultat n'est pas indenté