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

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

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

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

Introduction à XSLT

Éric Laporte

Institut Gaspard-Monge

Université Paris-Est Marne-la-Vallée

Page 2: 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

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

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><PLANT>

<COMMON>Columbine</COMMON>

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

Objectifs des cours sur XSLT

Manipuler des documents XMLLes programmes XSLT sont des documents XMLEntrées = obligatoirement des documents XMLSorties = souvent des documents XML

Apprendre le langage XSLTLangage de transformation d'arbres

Apprendre le langage XpathLangage d'expressions XML inclus dans XSLT et autres

Contrôle des connaissances : TP noté

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

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

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

Syntaxe XML

Document "bien formé" = qui respecte la syntaxe XMLPlus strict que la syntaxe HTMLLogiciels traitant des documents XML : navigateurs,

processeurs XSLT....Plus ou moins stricts sur la syntaxe des documents d'entrée

ÉlémentDé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"/>

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

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 obligatoireEn HTML on peut omettre certaines balises fermantes<br><br><br>

Document --> arbre : analyse syntaxiqueArbre --> document : sérialisation

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

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

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

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

" &quot; 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"'/>

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

Indentation

L'indentation facilite la visualisation en arbre<CATALOG>

<PLANT><COMMON>Bloodroot</COMMON>

</PLANT><PLANT>

<COMMON>Columbine</COMMON>

Un document XML non indenté est illisible<CATALOG><PLANT><COMMON>Bloodroot</COMMON></PLANT><PLANT><COMMON>Columbine</COMMON>

L'indentation est obligatoire

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

XML : autres exemples d'utilisation

Équivalent d'une base de donnéesExemple : catalogue de plantes

Document-texte structuréTexte et informations signalétiques, structurelles, liens...Exemple : XHTML

CodeLangages de programmation, grammaires... Exemple : XSLT

AutresCML : description de molécules et de réactions chimiques

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

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

Document texte structuré

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

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

section

livre

Buonaparte

chapitre

Neige

chapitre

sectionLes Châtiments

titre

Document et arbre

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

XHTML : visualisation sur écranComme 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>

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

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>

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

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:apply-templates/>

</xsl:copy>

</xsl:template>

</xsl:stylesheet>

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

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 debalises XSLTet XSLFO

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

Document XMLappelant 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> <ARTICLE> … </ARTICLE></CATALOGUE>

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

XSL, XSLT, XSLFO

Le projet XSLExtensible stylesheet language = Langage de feuilles de style

extensibleLe 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'arbresXSL formatting objectsLangage de visualisation de

documents

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

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é

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

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*)>(...)

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

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>

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

DTD ou schéma XML ?

DTDGrammaire en SGML (ancien concurrent de XML)Une DTD n'est pas un document XMLCompatible avec XMLFormat très utilisé

Schéma XMLGrammaire en XMLPermet d'engendrer du code JavaJugé compliquéVersion simplifiée : Relax NG

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

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>

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

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>

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

Arbre du document source

CATALOG

PLANT

ZONEBOTANICAL

Sanguinaria canadensis

4

PLANT ...

LIGHT PRICE

Mostly Shady2.44

...

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

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>

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

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>

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

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>

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

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)

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

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 contextechapitre/section|chapitre/figure

(pas de mise en facteur)

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

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>

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

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 XMLLe résultat est par défaut un document XML, ou HTMLdans certaines conditions

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

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:template></xsl:stylesheet>

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

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"/> </xsl:template>

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

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"/> </xsl:template>

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

Noeud courant et noeud contexte

Noeud contexte : à l'intérieur d'une expression XpathChange à 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"/> </xsl:template>

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

Et si l'expression Xpathtrouve 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

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

Et si l'expression Xpathtrouve 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]

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

Et si l'expression Xpathtrouve 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

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

Et si l'expression Xpathtrouve 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>

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

Et si l'expression Xpathtrouve 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"/></xsl:template>

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)

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

Fonctions Xpath surchaî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

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

Fonctions Xpath surchaî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

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

Fonctions Xpath surchaî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]"

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

Fonctions Xpath surchaî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)"/>

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

Fonctions XPath surchaî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) conversionstring-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)

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

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

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

Application

Comprendre la structure d'un document XML existantObserver des exemples dans le document XMLSi le document est complexe, utiliser XSLT pour l'interroger

Autre méthode possible

Étudier une grammaire du document XML (DTD ou schéma XML)

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

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

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

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>

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

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"

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

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

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

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>

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

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

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

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(*)]

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

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

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

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

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

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 racineQuand on entre dans la règle, le noeud courant est le noeud

racine (/)Les noeuds PLANT ne sontdonc pas fils du noeudcourant

<xsl:template match="/"> <xsl:message> <xsl:value-of select="count(PLANT)"/> </xsl:message></xsl:template>

CATALOG

PLANT PLANT

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

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 ...

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

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> ...

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

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

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

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...

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

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

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

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>

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

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

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

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é