XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents...

122
XSLT : XML Stylesheet Language Transformation & XPath : langage d’adressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse de documents XML

Transcript of XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents...

Page 1: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

XSLT : XML Stylesheet Language Transformation

& XPath : langage d’adressage de parties de documents XML

Une introduction à XSLT & Xpath pour l'analyse de documents XML

Page 2: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

2

Cours XML –M2-CCI / Y.Laborde

2 XSLT : mise en pratique

Page 3: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

Feuille de style et transformation

(3) Processeur XSLT

(1) Feuille de styleXSLT (+Xpath)

(2) DocumentXML

(4) Document transforméXML / HTML / texte / ...

Page 4: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

4

Cours XML –M2-CCI / Y.Laborde

4Un exemple : la fiche de description du film Vertigo

<?xml version="1.0" encoding="ISO-8859-1"?>

<FILM>

<TITRE>Vertigo</TITRE>

<IMAGE>Vertigo.gif</IMAGE>

<AUTEUR>Alfred Hitchcock</AUTEUR>

<ANNEE>1958</ANNEE>

<GENRE>Drame</GENRE>

<PAYS>Etats Unis</PAYS>

<RESUME>Scottie Ferguson, ancien inspecteur de police, est sujet au vertige depuis qu'il a vu mourir son collègue. Elster, son ami, le charge de surveiller sa femme, Madeleine, ayant des tendances suicidaires. Amoureux de la jeune femme Scottie ne remarque pas le piège qui se trame autour de lui et dont il va être la victime...

</RESUME>

</FILM>

Page 5: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

5

Cours XML –M2-CCI / Y.Laborde

5Un exemple de transformation HTML de la fiche de description du film Vertigo

Version HTML dudocument Vertigo.xml(affiché par Netscape)

<html> <head><meta http-equiv="Content-Type" content="text/html; charset=utf-8 »><title>Film: Vertigo</title </head> <body bgcolor="white »><p><img SRC="Vertigo.gif" align="left" height="220"> <h1><i>Vertigo</i></h1>Drame, <i>Etats Unis</i>, 1958</p><p>Mis en sc&egrave;ne par <b>Alfred Hitchcock</b><h3>R&eacute;sum&eacute;</h3>Scottie Ferguson, ancien inspecteur de police, est sujet au vertige depuis qu’il a vu mourir son coll&egrave;gue. Elster, son ami, le charge de surveiller sa femme, Madeleine, ayant des tendances suicidaires. Amoureux de la jeune femme Scottie ne remarque pas le pi&egrave;ge qui se trame autour de lui et dont il va &ecirc;tre la victime...</p></body></html>

Une mise en forme a été appliquéeau cours de la transformation dudocument par un processeur XSLT.

Les balises XML ont disparu auprofit de balises HTML.

Document HTML produit

Page 6: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

6

Cours XML –M2-CCI / Y.Laborde

6Un exemple de transformation EXCEL de la fiche de description du film Vertigo

Version EXCEL dudocument Alien.xml

La transformation du document a produit un document EXCEL.

Les balises XML ont disparu auprofit de celles propres à EXCEL

(non montrées ici).

Titre Auteur Année Pays Genre Résumé

Alien Ridley Scott

1979 USA Science-fiction

Près d’un vaisseau spatial échoué sur une lointaine planète, des Terriens en mission découvrent de bien étranges "oeufs". .

Page 7: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

7

Cours XML –M2-CCI / Y.Laborde

7 Principe de la transformation XSLT

Page 8: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

8

Cours XML –M2-CCI / Y.Laborde

8 Transformation en un document HTML

root

AAA BBB

TextTextCCC

DocumentXML

source

TransformationDocument

HTMLproduit

Processeur XSLT

Feuille de style XSLT :

règles de la transformation

Arbre XML source Arbre HTML résultant

Pour produire un document HTML : on doit transformer l'arbre XML en un arbre HTML

html

head body

……

Page 9: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

9

Cours XML –M2-CCI / Y.Laborde

9Exemples d’utilisation

Mettre en forme les information d'un document XML Connaissant à l'avance la structure logique du document

Composer des sous-documents Créer une version sans les <RESUME> ou sans les <PRIX>…

Quantifier Nombre de projection d'un <FILM> dans le mois...

Convertir dans un format spécifique XML vers XML, Hyperbase, Unitexte, sans balise... ou vers des

formats de lecture : (x)html, pdf, Word, Excel, Open Office, LaTex...

Maintenir et enrichir un document Possibilité d’ajouter de l’information (ex: images, prix moyens...)

Page 10: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

10

Cours XML –M2-CCI / Y.Laborde

10 Intérêt du couple XML/XSLT

AVANTAGES :On ne maintient pas différentes versions du

document pour les différents formats de sortie ou les différents sous-documents => maintenance

On peut appliquer les mêmes feuilles de style à plusieurs documents => simplicité

On se concentre soit sur les données du document soit sur ses représentation => modularité

Page 11: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

11

Cours XML –M2-CCI / Y.Laborde

11Objectif du diaporama

Page 12: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

Introduction aux principes généraux par

l'approche procédurale

Page 13: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

13

Cours XML –M2-CCI / Y.Laborde

13

<?xml version="1.0"?><xsl:stylesheet version="1.0"

xmlns:xsl="http://www.w3.org/1999/XSL/Transform"><xsl:output encoding= "UTF-8" method="html" />

<xsl:template match="/"><html>

<META HTTP-EQUIV="Content-Type" CONTENT="text/html; CHARSET=UTF-8" />

<body> <xsl:value-of

select="."> </body></html>

</xsl:template>

</xsl:stylesheet>

Une première feuille de styleCette feuille de style récupère tout le texte d’un document XML

Page 14: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

14

Cours XML –M2-CCI / Y.Laborde

14Explications

<html><META HTTP-EQUIV="Content-Type" CONTENT="text/html; CHARSET=UTF-8">

<body> Vertigo Vertigo.gif Alfred Hitchcock 1958 Drame Etats Unis Scottie Ferguson, ancien inspecteur de police, est sujet au vertige depuis qu'il a vu mourir son collègue. Elster, son ami, le charge de surveiller sa femme, Madeleine, ayant des tendances suicidaires. Amoureux de la jeune femme Scottie ne remarque pas le piège qui se trame autour de lui et dont il va être la victime... </body></html>

• Le processeur lit la feuille, imprime ce qui est littéral (le texte ou les balises non préfixés par « xsl: ») et évalue/exécute les instructions préfixées par « xsl: »

• Ici les balises ajoutées sont en HTML : à partir du document on génère une page HTML. Le résultat de la transformation peut ainsi être affiché par un navigateur.

Appliquée au document Vertigo.XML, cette feuille de style donne :

Page 15: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

15

Cours XML –M2-CCI / Y.Laborde

15Pour résumer

Une feuille de style est un document XML L'élément racine est xsl:stylesheet avec deux

attributs obligatoires (version et xmlns:xsl)

D'autres instructions peuvent apparaître, comme xsl:template ou xsl:value-of

Tout ce qui est préfixé par « xsl:» est une instruction XSLT, qui est exécutée par le processeur et remplacée par son résultat.

Tout ce qui n'est pas "préfixé" est reproduit littéralement

Page 16: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

16

Cours XML –M2-CCI / Y.Laborde

16 Prenons un exemple plus complet :<?xml version="1.0" encoding="UTF-8"?>

<CINEMA>

<NOM>Epée de bois</NOM>

<ADRESSE>100, rue Mouffetard</ADRESSE>

<METRO>Censier-Daubenton</METRO>

<SALLE NO='1' PLACES='320'>

<TITRE>Alien</TITRE>

<REMARQUE>Réservation conseillée</REMARQUE>

<SEANCES>

<SEANCE>15:00</SEANCE>

<SEANCE>18:00</SEANCE>

<SEANCE>21:00</SEANCE>

</SEANCES>

</SALLE>

<SALLE NO='2' PLACES='120'>

<TITRE>Vertigo</TITRE>

<SEANCES>

<SEANCE>22:00</SEANCE>

</SEANCES>

</SALLE>

</CINEMA>

Page 17: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

17

Cours XML –M2-CCI / Y.Laborde

17Extraire le texte contenu dans une balise

Page 18: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

18

Cours XML –M2-CCI / Y.Laborde

18L'instruction xsl:value-of

Remplacer cette instruction par le texte

du premier élément… … trouvé à cet endroit

Page 19: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

19

Cours XML –M2-CCI / Y.Laborde

19

L’arbre est toujours parcouru de haut en bas et de gauche à droite (i.e. dans l’ordre physique de déclaration des entités

, , , ...)① ② ③ ④ .

Page 20: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

20

Cours XML –M2-CCI / Y.Laborde

20 XPath

Page 21: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

21

Cours XML –M2-CCI / Y.Laborde

21xsl:value-of convertit le nœud en texte

en supprimant les éventuelles balises incluses

<p>du texte et <hi style="italics">d'autres</hi> éléments</p>

<xsl:value-of select="p" />

Soit le document XML :

L'expression XPath retourne tous les « nœud » <p>,

XSLT prend le premier et le convertit en texte y compris ses fils :

Du texte et d'autres éléments

Soit l'instruction XSLT …

Page 22: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

22

Cours XML –M2-CCI / Y.Laborde

22xsl:for-each

<xsl:for-each select= "...expression Xpath...">

...traitement une à une les nœuds trouvés...

</xsl:for-each>

Page 23: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

23

Cours XML –M2-CCI / Y.Laborde

23

<p><i>15:00</i></p><p><i>18:00</i></p><p><i>21:00</i></p><p><i>22:00</i></p>

xsl:for-each

Page 24: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

24

Cours XML –M2-CCI / Y.Laborde

24xsl:for-each

Page 25: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

25

Cours XML –M2-CCI / Y.Laborde

25xsl:for-each

Page 26: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

26

Cours XML –M2-CCI / Y.Laborde

26<?xml version="1.0"?><xsl:stylesheet version="1.0"

xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/"> <html><body> <p>Nom du cinéma: <xsl:value-of select = "//NOM"/> </p>

<xsl:for-each select="//SALLE"> <p>Film à l’affiche : <xsl:value-of select= "./TITRE"/>

</p> <p>Première séance : <xsl:value-of select= "./SEANCES/SEANCE"/>

</p> </xsl:for-each>

</body> </html> </xsl:template>

</xsl:stylesheet>

xsl:for-each

Page 27: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

27

Cours XML –M2-CCI / Y.Laborde

27 Le nœud contexte

Page 28: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

28

Cours XML –M2-CCI / Y.Laborde

28 Imbrications de xsl:for-each

On ne sait pas combien il y aura de titres de niveau 1, de niveau 2, etc.

Il faut traiter tous les titres de niveaux 1, puis dans chaque niveau 1, traiter les niveaux 2, etc.

On devra donc imbriquer des boucles xsl:for-each

Page 29: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

29

Cours XML –M2-CCI / Y.Laborde

29 Une table des matières (1)

Le livre a comme racine <BOOK> et son titre général du livre est donné dans une balise fille <TITLE>.

Les chapitres du livre sont des balises <chap> possédant un attribut level indiquant leur niveau hiérarchique et ayant alors un élément fils <title> dont le texte est le titre.

Par ailleurs, les niveaux sont imbriquées les uns dans les autres.

<BOOK> <TITLE>LES LANGAGES XML</TITLE> <chap level="1"> <title>Le langage XML</title> ... <chap level="2"> <title>Les balises XML</title> ... </chap> <chap level="2"> <title>Les attributs XML</title> ... </chap> </chap> <chap level="1"> <title>Le langage XSLT</title> ... </chap> <chap level="2"> <title>L'nstruction template</title> ... </chap> <chap level="2"> <title>L'instruction value-of</title> ... </chap> </chap> ...</BOOK>

Page 30: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

30

Cours XML –M2-CCI / Y.Laborde

30

select="chap[@level = '1']"

select="chap[@level='1']/title"

Sélectionne les éléments title directement en dessous de chap dont l’attribut level vaut '1’

Prédicats pour les attributs des nœuds

Page 31: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

31

Cours XML –M2-CCI / Y.Laborde

31Une table des matières simple (2)

<xsl:for-each select="/BOOK"> <p>Titre : <xsl:value-of select= "./TITLE"/></p>

<xsl:for-each select="./chap[@level = '1']"> <h1><xsl:value-of select="./title"/></h1> <xsl:for-each select="./chap[@level = '2']"> <h2><xsl:value-of select="./title"/></h2> <xsl:for-each select="./chap[@level = '3']"> <h3><xsl:value-of select="./title"/></h3> </xsl:for-each> </xsl:for-each> </xsl:for-each>

<hr/> </xsl:for-each>

L’expression Xpath commence par « . » : chap est recherché parmi les enfants des nœuds contextes trouvés (ici, un BOOK)

Par rapport au nouveau contexte chap, on désigne les enfants title.

Idem pour toutes les autres.

Page 32: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

32

Cours XML –M2-CCI / Y.Laborde

32Classer avec xsl:sort

Les éléments sont extraits avec for-each ; mais avant d’être traités un à un, ils sont classés par xsl:sort – ici par ordre alphanumérique («ascending») – en fonction du contenu du select de sort.Ici les films sont donc classés par leurs titres.

Page 33: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

33

Cours XML –M2-CCI / Y.Laborde

33 xsl:sort (syntaxe)

Page 34: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

34

Cours XML –M2-CCI / Y.Laborde

34Ajouter un index : xsl:number

A. 15:00 , B. 18:00 , C. 21:00 , D. 22:00

Les positions sont traduites d'après le format de l’instruction number

Page 35: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

35

Cours XML –M2-CCI / Y.Laborde

35xsl:output

Indication du jeu de caractères de la sortie : encoding='...'

Indication du type de sortie (text, xml, html...) : method='...'

Page 36: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

Un peu plus sur XPath

XPath permet d’écrire des « chemins XML » mais également d’utiliser des fonctions

et des opérateurs.

Page 37: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

37

Cours XML –M2-CCI / Y.Laborde

37 XPath : les « chemins » en quatre points

XPath permet de pointer sur des éléments de l'arborescence du document.

Une expression XPath est constituée (1) d'étapes (steps), séparées par des slashs, « / »

Chaque étape contient (2) un nœud asserté (node test) qui sert à spécifier le nœud par : le nom d’un élément, d’un attribut, d’un espace de nom ou « * » (tous les types de nœuds : élts, attr, esp.noms).

Optionnellement l’expression peut avoir (3) des prédicats (à droite de chaque node test) et (4) des axes (à gauche de chaque node test)

L'expression retourne un sac de nœuds (node set) : les nœuds qui correspondent au dernier nœud asserté – si elle en trouve.

"/CINEMA/SALLE[NO="1"]/SEANCES"

Axe implicite .../.../.../Etapes/.../... [Prédicat]*

Page 38: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

38

Cours XML –M2-CCI / Y.Laborde

38(1) les étapes

Page 39: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

39

Cours XML –M2-CCI / Y.Laborde

39Quelques cas...

//SEANCE est-il identique à //SEANCES/SEANCE ?

Note : "//..." part de la racine : //p : tous les p du document, à toute profondeur depuis la racine .//p : tous les p sous le nœud contexte

Différences entre : //BBB/p

Tous les p du document directement en dessous de tous les BBB //BBB//p

Tous les p du document en dessous de tous les BBBAvec //BBB//p, chaque p est sélectionné une fois dans le sac de nœuds résultant, même si plusieurs BBB sont imbriqués et font différents chemins valides vers le même p :

il n’y a jamais de doublon dans un sac de nœuds.

Page 40: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

40

Cours XML –M2-CCI / Y.Laborde

40(2) : les node tests (ou tests de nœuds)

Chaque étape comprend un node test Le nœud cherché peut être une balise, un attribut (@nom)

ou un nœud texte text()(qui renvoie le texte des nœuds sans celui de leurs fils)

Existent également des valeurs génériques : *(tout type de

nœud : élts, esp.noms), @*(tout attribut) , node()(tout nœud : texte, commentaires…)

Le point "." indique le contexte actuel Le double point ".." permet de remonter d'un niveau

dans l'arborescence.

Page 41: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

41

Cours XML –M2-CCI / Y.Laborde

41Exemples

//p/@id : retourne la valeur de l’attribut id, tandis que//p[@id]: retourne tous les nœuds p qui ont un attribut id

Ne pas confondre un nœud texte et le texte contenu : /BOOK/text/front : retourne tous les nœuds front directement enfants de text ;

avec value-of retourne la valeur (le texte) du premier nœud front, sans les balises imbriquées

/BOOK/text/front/text() : retourne le texte de tous les nœuds front directement enfants du noeud text ; avec value-of retourne la valeur (le texte) du premier nœud front

/BOOK/text/front/@id/text()Ne retourne rien ! Il n'y a pas de nœud texte descendant d'un attribut. (@id retourne la « valeur » de l’attribut)

/SALLE/node() : retourne tous les types de nœuds fils de SALLE (éléments, commentaires...)

Page 42: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

42

Cours XML –M2-CCI / Y.Laborde

42(3) : les prédicats

Chaque étape peut comprendre un ou plusieurs prédicat, qui est une expression XPath entre crochets placée après le node test. //chap[@title='1']sélectionne les chap dont l'attribut title vaut '1’ //p[@id][@name]retourne tous les nœuds p ayant les attributs id et name //*[@*='bbb'] retourne tous les nœuds ayant un attribut valant 'bbb'

Le prédicat permet de filtrer les nœuds en ajoutant des conditions. L’expression dans le prédicat a deux valeurs : vraie ou fausse. L’expression est convertie si besoin en valeur booléenne :

=> est faux : un sac de nœud vide, le nombre zéro ou la chaîne vide,=> est vrai : tout le reste. Dans le premier exemple, l’expression retourne déjà une valeur booléenne grâce à

l’opérateur « = » //p[name] : sélectionne tous les p contenant un élément enfant name. p est le

contexte de l’expression Xpath name. //*[@NO]: retourne tous les nœuds ayant un attribut NO //p[../liste] : retourne tous les p fils directs de liste

Page 43: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

43

Cours XML –M2-CCI / Y.Laborde

43Fonctions XPath utiles

Les conditions sur la position d’un nœud sont souvent utilisées dans les prédicats.

Les fonctions last() et position() renvoie respectivement le numéro cardinal du dernier nœud d’un sac de nœuds et le numéro cardinal du nœud courant. Note : last() et position() s’écrivent toujours avec les

parenthèses et sans argument. Plutôt que [position() = 1], pour demander les nœuds

qui sont le premier enfant de leur père, on peut utiliser une notation courte : [1].

Page 44: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

44

Cours XML –M2-CCI / Y.Laborde

44Exemples

<xsl:for-each select="/hi[@rend = ‘italics’]"><!-- tous les tags hi avec un attribut rend égal à ‘italics’ -->

</xsl:for-each>

<xsl:for-each select="/p[name/@id]"><!-- tous les p ayant un enfant name qui a un attribut id -->

</xsl:for-each>

<xsl:for-each select="/text/p [not(position()=last())]"><!– tous les p qui ne sont pas les derniers parmi les p de parent text -->

</xsl:for-each>

<xsl:for-each select="/text/p[position() != last())]"><!– idem que précédemment <=> autre notation -->

</xsl:for-each>

<xsl:for-each select="/text/p[position() &gt;= 1]"><!-- tous les p sauf le premier -->

</xsl:for-each>

Page 45: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

Elementtext

Elementp

Elementp

Elementp

Elementp

Text Text TextElement

name

Text

id='p5'

n='8'

<xsl:value-of select="text/p[3]"/><xsl:value-of select="text/p[name]"/><xsl:value-of select="text/p/name"/><xsl:value-of select="text[p/name]/p[3]"/><xsl:value-of select="text/p[name/@n]"/><xsl:value-of select="text/p[not(text())]"/><xsl:value-of select="text/p[last()]"/><xsl:value-of select="text/p[not(position() = last())]"/>

Page 46: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

46

Cours XML –M2-CCI / Y.Laborde

46(4) : les axes

Dans la forme abrégée de la syntaxe XPath utilisée jusqu'ici, les node test sont cherchés parmi les enfants avec /, ou parmi les descendants avec //.

Il est donc impossible avec cette notation d'indiquer un chemin qui remonte vers les autres directions : ancêtres, parents, ou frères du nœud contexte.

C’est ce que permettent les axes.

Page 47: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

47

Cours XML –M2-CCI / Y.Laborde

47XML, une histoire de famille

Document/

Prologue<?xml version=“1.0”?>

Element ROOTcorpus

Elementtext

Elementp

Elementp

Elementp

Text

Text

Text TextElement

name

Text

Frères précédents

Parent

Enfants

Descendants

Ascendants

Frères suivants

Elementp

Page 48: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

48

Cours XML –M2-CCI / Y.Laborde

48 Document/

Prologue<?xml version=“1.0”?>

Element ROOTFitnessCenter

ElementMember

ElementName

ElementPhone

ElementFavoriteColor

TextJeff

Text555-4321

Textlightgrey

ElementName

TextJeff

Frères précédents

Ascendants

Frères suivants

Parent

Enfants

Descendants

XML, une histoire de famille

ElementPhone

Page 49: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

49

Cours XML –M2-CCI / Y.Laborde

49Noter les axes

On peut désigner à chaque étape d'autres directions que l’axe parent/enfant grâce à une « notation longue » :le note test est précédé du nom de l'axe suivi de "::"

Exemple select="./ancestor::div"

Select="./ancestor::SALLE/TITRE

following-sibling::node() | preceding-sibling::node()

Recherche tous les div parmi les ascendants

Sélectionne tous les nœuds descendant du même père respectivement à droite et à gauche

Remonte aux SALLE ascendant, puis descend à son enfant direct TITRE

En anglais : « sibling » signifie « enfant de même parent »

Page 50: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

50

Cours XML –M2-CCI / Y.Laborde

50Document

/

PI<?xml version=“1.0”?>

Element ROOTFitnessCenter

ElementMember

ElementName

ElementPhone

ElementPhone

ElementFavoriteColor

TextJeff

Text555-1234

Text555-4321

Textlightgrey

ancêtre

Frêre précédent Frêres suivants

ancestor::* sélectionne tous les ancêtres, c-à-d : - Member - FitnessCenter

preceding-sibling::* sélectionne tous les frères à gauche, c-à-d : - Name

following-sibling::* sélectionne tous les frères à droite, c-à-d : - Phone - FavoriteColor

Page 51: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

51

Cours XML –M2-CCI / Y.Laborde

51Document

/

PI<?xml version=“1.0”?>

Element ROOTFitnessCenter

ElementMember

ElementName

ElementPhone

ElementPhone

ElementFavoriteColor

TextJeff

Text555-1234

Text555-4321

Textlightgrey

descendants

À partir de FitnessCenter, descendant::* ou //* sélectionne tous les descendants, c-à-d : - Member - Name - Phone, etc.

Page 52: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

52

Cours XML –M2-CCI / Y.Laborde

52Liste des axes

ancestor: sélectionne tous les ancêtres ancestor-or-self: sélectionne le nœud courant et tous ses ancêtres attribute: sélectionne tous les attributs child: sélectionne tous les enfants (descendants directs) descendant: sélectionne tous les descendants descendant-or-self: sélectionne le nœud courant plus tous ses descendants following: sélectionne tout ce qui suit le nœud courant dans le document following-sibling: sélectionne tous les frères à droite namespace: sélectionne tous les namespaces ouverts parent: sélectionne le parent preceding: sélectionne tout ce qui précède le nœud courant dans le document preceding-sibling: sélectionne tous les frères à gauche self: sélectionne le nœud courant

Page 53: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

53

Cours XML –M2-CCI / Y.Laborde

53Abréviations utiles

L'axe « child:: » est l'axe par défaut  « @ » abrège l'axe « attribute:: » « // » abrège l’axe « descendant-or-

self:: » « .  » abrège « self:: » « ..  » abrège l'axe « parent:: » « / » abrège la racine

Page 54: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

54

Cours XML –M2-CCI / Y.Laborde

54Principaux opérateurs

Opérateurs arithmétiques +, -, *, div, mod Note : une balise XML peut contenir un tiret, il faut donc

encadrer “-” d’espace.

Operateurs booléens : not, and, or Operateurs relationnels : <, >, =, <=, >=, !=, | (ou), & (et) < et > doivent être notés &lt; et &gt; pour satisfaire aux

contraintes XML

< > = <= >= !=&lt; &gt; = &lt;= &gt;= !=

Pour exprimer :Noter :

Page 55: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

55

Cours XML –M2-CCI / Y.Laborde

55Rappel XML :ordre des éléments et valeur des attributs

On ne peut pas accéder aux attributs par leur numéro d'ordre : ils sont accessibles seulement par leur nom, leur ordre n'est pas signifiant.

impossibles : @titre[1] ou //*[@titre[1]] Ainsi, dans la conception d'un document XML, il ne faut pas

confier d'information à l'ordre des attributs. Les éléments correspondent un peu aux structures de données

informatiques dites "tableaux" et les attributs aux tableaux associatifs ou "hashes"

Page 56: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

Expression de conditionsOpération sur les chaînes

Page 57: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

57

Cours XML –M2-CCI / Y.Laborde

57 xsl:if

<xsl:if test="//SEANCE"><p>Il existe au moins une séance de programmée !</p>

</xsl:if>

Permet de filtrer ou de choisir entre différentes possibilités.

Si l’expression XPath de @test renvoie une valeur non nulle ou vraie, alors le contenu de xsl:if est exécuté.

Page 58: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

58

Cours XML –M2-CCI / Y.Laborde

58 Exemples de xsl:if

<xsl:for-each select="name"> <xsl:if test="@type='person'"> <xsl:value-of select='.'> </xsl:if></xsl:for-each>

<xsl:for-each select="name[@type='person']"> <xsl:value-of select='.'></xsl:for-each>

Remarquez qu’en fait, c’est équivalent à :

Page 59: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

59

Cours XML –M2-CCI / Y.Laborde

59 Dans le contexte de xsl:if,XPath retourne une valeur booléenne

Une expression XPath peut être utilisée avec xsl:if pour voir si elle retourne vrai ou faux : elle retourne vrai si elle retourne :

- un sac de nœuds non vide- une valeur numérique différente de 0- une valeur booléenne vraie- une chaîne de caractères non vide

elle retourne faux dans les cas contraires

Page 60: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

60

Cours XML –M2-CCI / Y.Laborde

60 xsl:choose

<xsl:choose> <xsl:when test='expression XPath'> [action] </xsl:when> <xsl:when test='expression XPath'> [action] </xsl:when> <xsl:otherwise> [action] </xsl:otherwise></xsl:choose>

Page 61: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

61

Cours XML –M2-CCI / Y.Laborde

61 Extraire une sous-chaîne

Dans un nœud texte, on peut extraire une sous chaîne.ex. Extraire l’année seule dans "février-2009" 

Utiliser la fonction XPath "substring-after()" qui prend deux arguments : La chaîne source La chaîne à partir de laquelle sélectionner le texte (pattern).

<xsl:if test="docDate"> <xsl:text> (année: </xsl:text> <xsl:value-of select= "substring-after(docDate, '-')" /> <xsl:text>)</xsl:text> <xsl:if>

Page 62: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

62

Cours XML –M2-CCI / Y.Laborde

62 Extraire une sous-chaîne

février-2010 substring-after(docDate, ‘-’)

2010

docDate

XPath dans ce cas retourne une chaîne, et non plus un « sac de nœuds ».

En attendant XSLT 2.0 et les expressions régulières, les fonctions chaînes de XPath paraissent rudimentaires :

Page 63: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

63

Cours XML –M2-CCI / Y.Laborde

63 Fonctions sur des chaînes

Page 64: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

64

Cours XML –M2-CCI / Y.Laborde

64

Par exemple, on veut récupérer les éléments en italique ayant la valeur IT dans l'attribut @rend.

Mais @rend peut également contenir "IT BO" ou "BO IT" pour marquer italique + gras, etc.

On ne les extraira pas avec :select="//*[@rend = 'IT']", qui recherchera les @rend avec comme valeur exacte IT.

contains permet ici de récupérer tous les italiques :

select="//*[contains(@rend, 'IT')]"

Tester la présence d’une sous-chaîne

Page 65: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

65

Cours XML –M2-CCI / Y.Laborde

65

Ces fonctions ne sont utiles que sur des contenus très normalisés.

XSLT n’est pas adapté au traitement de chaînes de caractères.

Il est impossible par exemple de s’en servir pour extraire les phrases d'un texte en se basant sur la ponctuation.

XSL et le traitement des chaînes

Page 66: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

Quantifier

Page 67: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

67

Cours XML –M2-CCI / Y.Laborde

67 count(), la fonction magique

Cette fonction XPath permet de retourner le nombre de nœuds trouvés dans l’expression XPath entre parenthèses

Permet de dénombrer tout phénomène exprimé en XML

<xsl:value-of select="count(//p[@type = 'intro'])"/>

<xsl:value-of select="count(//*[@lang = 'en'])"/>

<xsl:value-of select="count(//div/p[1]/*[@ana= 'exemple'])"/>

Page 68: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

68

Cours XML –M2-CCI / Y.Laborde

68Utiliser des variables

Jusqu’à présent on a systématiquement mis le résultat d’une expression XPath dans xsl:value-of, qui affiche directement le résultat.

Mais si l’on veut stocker et manipuler la valeur, pour afficher par exemple un pourcentage plutôt que le chiffre brut ?

Page 69: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

69

Cours XML –M2-CCI / Y.Laborde

69xsl:variable

hello world

helloNom de la variable :

Valeur de la variable :

Page 70: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

70

Cours XML –M2-CCI / Y.Laborde

70Stocker une valeur calculée

Définition de 3 variables :<xsl:variable name="nbrChap"

select="count(//chap)" /><xsl:variable name="nbrChap1"

select="count(//chap[@title='1'])" /><xsl:variable name="nbrChap2"

select="count(//chap[@title='2'])" />Calcul du pourcentage de chapitres de niveau 1 :<xsl:value-of

select="($nbrChap1 * 100) div $nbrChap" />Calcul du pourcentage de chapitres de niveau 2 :<xsl:value-of

select="($nbrChap2 * 100) div $nbrChap" />

• Évite de recalculer plusieurs fois count(//chap)• Code plus rapide et plus modulaire (raffinement)

Page 71: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

71

Cours XML –M2-CCI / Y.Laborde

71 Portée des variables

Une variable reste utilisable dans tout l’élément dans lequel elle a été déclarée dans la feuille de style et dans les sous-éléments de celui-ci. Une fois sortie de cet élément, elle est détruite Une variable déclarée directement comme enfant de xsl:stylesheet peut être utilisée dans toute la feuille de style.

Une variable déclarée dans un élément (xsl:template, xsl:if, etc.) ne peut être utilisée que dans cet élément et ses sous-éléments.

Page 72: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

72

Cours XML –M2-CCI / Y.Laborde

72 Quelques fonctions arithmétiques

Page 73: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

73

Cours XML –M2-CCI / Y.Laborde

73 Utiliser un template pour calculer les pourcentages

Problème : on répète n fois la même opération pour calculer des pourcentages

Solution : factoriser cette opérationXSLT permet de créer une sous-routine

(un template) qui retourne une valeur en fonction d'arguments

Page 74: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

74

Cours XML –M2-CCI / Y.Laborde

74

Appel du template

xsl:with-param permet de transmettre les arguments

xsl:param permet de nommer les arguments reçus

Définition du template

Déf. des 3 variables comme précédemment

Page 75: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

75

Cours XML –M2-CCI / Y.Laborde

75 L'intérêt d'une approche "procédurale"

Nous avons vu une façon d'utiliser XSLT où l'on sait où chercher l'information à extraire.

Cette démarche est adaptée pour les cas où l'on fait une extraction de faible volume dans des endroits précis de la structure.

Mais…

Page 76: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

L'approche par templates

Page 77: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

77

Cours XML –M2-CCI / Y.Laborde

77 L'intérêt d'une approche par templates

Si l'on veut – plutôt qu'extraire un élément – recopier la totalité du document sauf un élément ?

Ou si l'on veut extraire un grand nombre d'éléments ?

XML a une structure non limitée : il faudrait un nombre irréaliste de for-each et if

Il est plus économique dans ce cas d'indiquer ce que l'on veut enlever ou modifier que ce que l'on veut extraire.

Page 78: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

78

Cours XML –M2-CCI / Y.Laborde

78

Plutôt que de décrire des opérations, on dessine un nouvel arbre en indiquant seulement les points à modifier de l'arbre existant.

Page 79: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

79

Cours XML –M2-CCI / Y.Laborde

79 Retour en arrière

Toutes les feuilles de style commençaient par <xsl:template match="/">

Cet élément xsl:template sert à regrouper des actions à faire à un "moment" précis

Ce moment est désigné dans l'attribut @match@match attend une expression XPath, ici "/"

indique la racine du document.Un template avec match="/" est exécuté en

premier, puisque la racine est la première chose que cherche le processeur.

Page 80: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

80

Cours XML –M2-CCI / Y.Laborde

80Comment utiliser les templates ?

Il suffit de prévoir pour l’élément que l’on veut traiter un élément template avec un @match qui lui correspond. @match peut correspondre à tout nœud : élément, attribut (avec @), texte (avec text()) ou commentaire (avec comment()).

Exemple : un template qui s’appliquera à chaque élément <SALLE> dans le document :

<xsl:template match= "SALLE">...

<xsl:template>

Page 81: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

81

Cours XML –M2-CCI / Y.Laborde

81Exemple : mettre un titre HTML à chaque texte

Cette nouvelle règle permet de relancer l’analyse et donc de la continuer comme le traitement du document...

Page 82: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

82

Cours XML –M2-CCI / Y.Laborde

82 xsl:apply-templates

Dans l'exemple précédent,apply-templates sert à relancer l'analyse (la recherche d'un template avec un attribut match qui correspond) dans la sous-arborescence (les

descendants) du nœud traité par le template

Si on ne met pas apply-templates le processeur est « éteint », il abandonne tout ce qui est en deçà (i.e. la sous-arborescence) !

Page 83: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

83

Cours XML –M2-CCI / Y.Laborde

83 Que fait le processeur ?

Après avoir construit une représentation du document, le processeur rentre dans l'arborescence.

Il cherche dans la feuille de style un template qui correspond à sa première position, qui est "/"

S'il n'en trouve pas, il passe aux descendants et recommence.

S’il trouve un nœud texte, il imprime son contenu.

Page 84: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

84

Cours XML –M2-CCI / Y.Laborde

84 Document/

PI<?xml version=“1.0”?>

Elementcorpus

Elementtext

Elementp

Elementp

Elementp

Elementp

Text

Text

Text TextElement

name

Text

Le processeur parcours les éléments dans un ordre prévisible et leurs attributs dans un ordre non prévisible.

Page 85: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

85

Cours XML –M2-CCI / Y.Laborde

85

Tant que parmi les descendants le processeur ne trouve pas de templates à appliquer, il continue à descendre dans l’ordre enfant / frère, en imprimant les nœuds texte.

Elementp

Elementp

Text

Elementname

Si un template avec match="p" est défini, le processeur l’applique, sinon il descend au nœud texte, l’imprime, et remonte au p suivant

Idem : s’il n’existe pas de template pour name, passe aux nœuds enfants

Que fait le processeur ? (suite)

Page 86: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

86

Cours XML –M2-CCI / Y.Laborde

86

Elementp

Elementp

Text

Elementname

<xsl:template match="p"> <p><xsl:apply-templates /></p></xsl:template>

Ce template est exécuté à chaque p rencontré.

Une balise p est ouverte, l’analyse reprend dans la sous-arborescence (d’autres templates peuvent être exécutés), puis le p est fermé

<xsl:template match="name"> M. ***</xsl:template>

Toutes les balises name et leurs contenus sont remplacés par « M. *** ».

Que fait le processeur ? (suite)

Page 87: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

87

Cours XML –M2-CCI / Y.Laborde

87 L’enchâssement

Dans un template, l’ instructions, xsl:apply-templates a un effet spécial : elle relance la recherche de templates parmi les enfants. Quand le processeur a fini de traiter les descendants, il reprend et

termine l’exécution du template d'où il est parti du fait de l'instruction apply-templates

Sinon, il ne rentre pas dans la sous-arborescence. Avec les xsl:apply-template les templates sont donc

"enchâssés" autant de fois que nécessaire pendant l'exécution.

xsl:template permet de traiter les éléments inclus, contrairement à value-of

Page 88: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

88

Cours XML –M2-CCI / Y.Laborde

88 L'enchâssement (2)

<?xml version="1.0"?><xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:template match="/">

<html><body> <xsl:apply-templates />

</body> </html> </xsl:template>

<xsl:template match="p"> <item><xsl:value-of select="." /> </item> </xsl:template>

</xsl:stylesheet>

1. Ligne imprimée en tout premier

2. Passe à la descendance, alors que le template n'est pas fini. Imprime le texte contenu dans les éléments sauf p qui est traité explicitement

3. Tous les p sont traitésmais pas leurs descendants car le processeur n'a pas été relancé avec xsl:apply-templates !

4. Quand la descendance est traitée, "remonte" de "templates appelant" en "templates appelant" et fini chacun. Cette ligne est donc imprimée en tout dernier

Page 89: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

89

Cours XML –M2-CCI / Y.Laborde

89Utilisation dexsl:apply-templates

On peut mettre plusieurs xsl:apply-templates dans le même template.o C’est le cas lorsque l’on ne veut pas parcourir tout le document mais

seulement certaines parties.o C’est aussi le cas lorsque l’on veut procéder à l’analyse selon un ordre

particulier ou que l’on veut traiter les attributs après les descendants.o Etc.

<xsl:template match="/"><html><body>

<h1>1. les salles</h1><xsl:apply-templates select="//SALLE"><h1>2. les numéros de salles</h1><xsl:apply-templates select="//SALLE/@NO">

</body></html></xsl:template>

Page 90: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

90

Cours XML –M2-CCI / Y.Laborde

90apply-templates : utiliser @select

<xsl:template match="/"><liste_seances><xsl:text> Cinéma:

<xsl:value-of select="//NOM" /> &#x0A;</xsl:text> <xsl:apply-templates select="//SALLE"/></liste_seances>

</xsl:template>

<xsl:template match="SALLE"> <item>Salle <xsl:value-of select="./@NO" />&nbsp;:&nbsp; <xsl:for-each select=".//SEANCE" /> <horaire><xsl:value-of select=".//SEANCE" /> </horaire> </xsl:for-each/> </item> </xsl:template>

Ici on passe directement aux <SALLE>

Ici on devrait également utiliser xsl:apply-templates plutôt que for-each (qui reste une approche procédurale) !!!

Page 91: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

91

Cours XML –M2-CCI / Y.Laborde

91

Document transformé :<liste_seances> Cinéma: Epée de bois

<item>Salle 1 :

<horaire>15:00</horaire>

<horaire>18:00</horaire>

<horaire>21:00</horaire>

</item>

<item>Salle 2

<horaire>22:00</horaire>

</item>

</liste_seances>

apply-templates : utiliser @select

Page 92: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

92

Cours XML –M2-CCI / Y.Laborde

92

@select permet ici de descendre directement plus bas dans la sous-arborescence en "sautant" toute une partie.

On peut aussi désigner un endroit qui n'est pas dans la sous arborescence (en évitant de produire une boucle infinie !).

Note : par défaut, un xsl:apply-templates contient un @select="node()" qui lui fait sélectionner ses enfants

apply-templates : utiliser @select

Page 93: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

93

Cours XML –M2-CCI / Y.Laborde

93 Supprimer les balises

Une feuille de style contenant ce seul template recopie le document source en enlevant toutes les balises :

<xsl:template match="/"><xsl:apply-templates />

</xsl:template>

EN effet, par défaut, dans tous les nœuds où il ne trouve pas de xsl:template qui s’applique, le processeur imprime le contenu pour les nœuds de type texte et passe aux enfants pour les autres types de nœuds.

Page 94: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

94

Cours XML –M2-CCI / Y.Laborde

94Supprimer du texte

Plutôt que d'indiquer au processeur des chemins à parcourir qui excluent certaines parties de texte, on peut modifier son action par défaut (recopier le texte) sur les nœuds à exclure :

<?xml version="1.0"?><xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

<xsl:template match=”NOM | ADRESSE | METRO | …"><!– le template ne contient rien : ni action, ni relance duprocesseur avec apply-templates. Le contenu est donc abandonné -->

</xsl:template>

</xsl:stylesheet>

Page 95: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

95

Cours XML –M2-CCI / Y.Laborde

95La clef : les templates par défaut

Pourquoi, par défaut, le processeurs descend dans l'arborescence et imprime les nœuds textes ?

Une feuille de style a deux templates par défaut ; Ces templates sont appliqués quand le processeur ne trouve pas dans

la feuille de style un template correspondant au nœud traité

<xsl:template match="/ | *”><xsl:apply-templates/>

</xsl:template>

Correspond à la racine (/) ou (|) à tout élément (*). Action = avancer le processeur aux enfants (incluant élément, attribut et nœud texte car apply-template a par défaut @select=“node()”), et leur appliquer les templates.

Correspond à tout nœud texte. Action = imprimer son contenu

<xsl:template match="text()”><xsl:value-of select="."/>

</xsl:template>

Page 96: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

96

Cours XML –M2-CCI / Y.Laborde

96

Quand plusieurs templates peuvent s’appliquer…

pourquoi le processeur applique :<xsl:template match= "SALLE">et non le template par défaut :<xsl:template match="/ | *">,alors que les deux sont en concurrence ?

=> Le processeur applique le template le plus spécifique. On peut utiliser cette propriété pour prévoir un cas général et

des cas particuliers :@match="p" : s’applique à tous les p@match="p[1]" : s’applique à tous les aînés des fratries.

Page 97: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

97

Cours XML –M2-CCI / Y.Laborde

97 Redéfinir les templates par défaut

On peut redéfinir les templates par défaut pour modifier le comportement du processeur.

Si on ajoute <xsl:template match="text()"></xsl:template>

le processeur parcours toujours l'arborescence mais n'imprime plus les nœuds textes.

Page 98: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

98

Cours XML –M2-CCI / Y.Laborde

98

Exemple de modification des templates par défaut

On veut extraire du document seulement le contenu des nœuds REMARQUE.

Dans ce cas de figure la majorité du document est à exclure, seul un tag est à conserver.

On peut utiliser deux possibilités :1. Indiquer le chemin qui mène aux nœuds voulus2. Laisser le cheminement par défaut dans l'arborescence,

mais modifier le comportement par défaut pour ne pas recopier les nœuds textes

Page 99: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

99

Cours XML –M2-CCI / Y.Laborde

99 Méthode 1

Laisser le comportement par défaut, mais utiliser @select pour mener directement sur les REMARQUE

<?xml version="1.0"?><xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

<xsl:template match="/"><xsl:apply-templates select="//REMARQUE">

</xsl:template>

</xsl:stylesheet>

Page 100: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

100

Cours XML –M2-CCI / Y.Laborde

100 Méthode 2

On modifie le comportement par défaut : on laisse le cheminement dans l'arborescence, mais les nœuds textes ne sont plus recopiés, sauf pour le nœud voulu.

<?xml version="1.0"?><xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

<xsl:template match="text()"></xsl:template>

<xsl:template match="REMARQUE"><REMARQUE><xsl:value-of select='.'/></REMARQUE>

</xsl:template>

</xsl:stylesheet>

Page 101: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

101

Cours XML –M2-CCI / Y.Laborde

101Pour résumer (1)

Le processeur parcours l’arborescence, piloté par des templates, qui peuvent l'arrêter à des endroits précis, exécuter des instruction XSLT, et le relancer

Quand il ne trouve pas de template à appliquer, le processeur parcours l'arborescence, relancé par un template par défaut, dans un ordre enfants vers frères, et imprime le texte.

A moins qu’un template capte le processeur dans l’arborescence et ne le relance pas, l’arbre est parcouru entièrement, et tous les nœuds textes sont répliqués.

Page 102: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

102

Cours XML –M2-CCI / Y.Laborde

102Pour résumer (2)

Avec des templates on pilote le processeur : En insérant des templates à des points avec match En relançant ou non avec apply-templates En sélectionnant des sous arbres avec @select En utilisant ou modifiant les templates par défaut.

L’ensemble de ces moyens d’action permet d'utiliser cette approche déclarative (par template) comme la plus économique pour décrire une transformation de l’arborescence source en une arborescence cible.

Page 103: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

Grouper

Page 104: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

104

Cours XML –M2-CCI / Y.Laborde

104 Extraire les valeurs différentes

Comment produire une liste sans doublon des valeurs de @lang ? Avec <xsl:for-each select="//@lang"> la

liste produite peut contenir plusieurs fois la même valeur.

Comment regrouper les nœuds sur une valeur commune ? Par exemple à partir de plusieurs tag correction

(<corr resp="DC" date="12-06-2002">), les classer par correcteur sans les connaître à l'avance.

Page 105: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

105

Cours XML –M2-CCI / Y.Laborde

105 Solution : xsl:key

xsl:key déclare une variable dans laquelle des nœuds sont regroupés par "clefs".

xsl:key a trois attributs obligatoires : @name : donne un nom à la variable @match : une expression XPath indiquant les

nœuds à collecter @use : une expression XPath indiquant quelle

valeur utiliser pour grouper ces nœuds.

Page 106: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

106

Cours XML –M2-CCI / Y.Laborde

106<xsl:key

name="grouperParResp" match="//corr" use="@resp"

/>

On recherche les tags corr

On les groupes selon la valeur de leur attribut @resp (le contexte de cette expression XPath est le nœud corr)

en se <corr sic='désaisissant' resp='DB'>dessaisissant</corr> ... <corr sic='desine' resp='DB'>dessine</corr> déjà les traits ... <corr sic='l&apos;originial' resp='CF'>l'original</corr> ... <corr sic='uotre' resp='CF'>notre</corr>

DB

CF

<corr sic='désaisissant' resp='DB'>dessaisissant</co

rr>

<corr sic='desine' resp='DB'>dessine</corr>

<corr sic='l&apos;originial' resp='CF'>l'original</corr>

<corr sic='uotre' resp='CF'>notre</corr>

Clefs Nœuds collectés

Page 107: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

107

Cours XML –M2-CCI / Y.Laborde

107

L’élément key définit un groupe de nœud, lui attribue un nom et définit l’expression (la clef) qui permet de différencier les nœuds au sein de ce groupe.

Page 108: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

108

Cours XML –M2-CCI / Y.Laborde

108 Utilisation

Une fois créée une variable xsl:key peut être utilisée pour obtenir les nœuds associés à une clef.

la fonction XPath key(nom_table, clef) retourne tous les nœuds associés à l'entrée clef dans la table nom_table

<xsl:for-each select="key(grouperParResp, 'DB')"> Texte d'origine : <xsl:value-of select="@sic"/> Texte corrigé : <xsl:value-of select="."/></xsl:for-each>

Texte d'origine : désaisissantTexte corrigé : dessaisissantTexte d'origine : desineTexte corrigé : dessine

Appliqué à l'exemple précédent :

Page 109: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

109

Cours XML –M2-CCI / Y.Laborde

109 Trouver les valeurs uniques

Avec la fonction key() on ne peut que retrouver les nœuds associés à une clef, on ne peut pas lister directement les clefs d'une variable xsl:key.

Pour une liste de valeurs différentes, par exemple la liste des valeurs utilisées dans @lang, il faut utiliser une méthode détournée : utiliser une expression qui extrait un élément de chaque groupe

correspondant à une clef. Par exemple ne prendre que les éléments dont l'index dans le groupe dont

il fait parti est 1 Pour savoir si un nœud est le même que le premier retourné par un groupe

, on peut comparer la valeur que retourne generate-id() qui retourne un identifiant unique constant pour chaque nœud.

Page 110: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

110

Cours XML –M2-CCI / Y.Laborde

110Exemple

<xsl:key name="langues" match="//@lang" use="."/>

<xsl:for-each

select="//@lang[generate-id(.)=

generate-id(key(Langues', .)[1])]"> ...

•key(Langues', .) retourne le groupe des nœuds doublons du nœud traité.•key(Langues', .)[1] retourne le premier élément du groupe•generate-id retourne un identifiant unique pour un nœud. L'id du nœud contexte doit être le même que l'id du premier nœud du groupe des nœuds doublons.

• On sélectionne uniquement le premier nœud de chaque groupe, donc un nœud par groupe.

Page 111: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

111

Cours XML –M2-CCI / Y.Laborde

111

Cette méthode peut être utilisée avec un nœud différent entre match et use :

<xsl:key name="Langue" match="*[@lang]" use="@lang"/><table> <tr>

<td>Langues</td><td>Nombre d'éléments dans cette langue</td>

</tr> <xsl:for-each select="//*[@lang and generate-id(.)=

generate-id(key('Langue', @lang)[1])]"> <tr> <td><xsl:value-of select="@lang" /></td> <td><xsl:value-of select="count(key('Langue', @lang))"/> </td> </tr> </xsl:for-each></table>

Page 112: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

112

Cours XML –M2-CCI / Y.Laborde

112

@use peut être n'importe quelle expression calculée. Par exemple on peut grouper les p en fonction du nombre de notes qu’ils contiennent xsl:key name="pParNote" match="//p" use="count(note)«

On peut imaginer maintenant de regarder pour chaque groupe la position moyenne en début ou fin de texte, etc.

Page 113: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

Ajout d’information, Editer le corpus source

Page 114: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

114

Cours XML –M2-CCI / Y.Laborde

114

Jusqu’ici XSLT était utilisé pour extraire des données, pas pour éditer le corpus source.

XSLT impose de nombreuses limites à une utilisation pour ajouter de l’informations : il est difficile de « recopier » à l’identique.

L’édition d’un corpus avec XSLT ne peut donc se faire que sur des corpus très normalisés.

Page 115: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

115

Cours XML –M2-CCI / Y.Laborde

115Recopier à l’identique : copy-of

Page 116: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

116

Cours XML –M2-CCI / Y.Laborde

116xsl:copy

<xsl:template match="node() | @*"> <xsl:copy> <xsl:apply-templates

select="node() | @*"/> </xsl:copy></xsl:template>

<!-- Les templates de modification : --><xsl:template match="xptr[not(@id)]">

<!-- on supprime les xptr sans id. --></xsl:template>

En utilisant récursivement la fonction copy dans un template, on peut obtenir cette duplication et définir des templates pour ajouter des modifications

Page 117: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

117

Cours XML –M2-CCI / Y.Laborde

117 xsl:element et xsl:attribut

Page 118: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

118

Cours XML –M2-CCI / Y.Laborde

118 Exemple 1 : déplacer un élément

Dans un corpus les notes sont regroupées à la fin du document. Des éléments ptr ont permis d’enregistrer l’endroit des appels de note ; leur attribut @target permet de les associer à la note dont l’attribut @id correspond

Le but est de remonter les notes, conformément aux prescription TEI, directement à leur point d’insertion dans le texte et supprimer les pointeurs ptr.

Page 119: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

119

Cours XML –M2-CCI / Y.Laborde

119<xsl:template match="node() | @*"> <xsl:copy> <xsl:apply-templates

select="@* | node()"/> </xsl:copy></xsl:template>

<xsl:template match="ptr"><xsl:variable name="id" select="@target" /><xsl:element name="note">

<xsl:for-each select="./ancestor::text/back/note[@id=$id]/@*"> <xsl:attribute name="{name(.)}"> <xsl:value-of select="."/> </xsl:attribute>

</xsl:for-each><xsl:value-of select=".//ancestor::text/back/note[@id=$id]"/>

</xsl:element></xsl:template>

<xsl:template match="note"></xsl:template>

</xsl:template>Cf. ci-joint "ajout.xsl"

Page 120: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

Conclusion

Page 121: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

121

Cours XML –M2-CCI / Y.Laborde

121 Limites d'XSLT

Délicat pour l'ajout d'annotation au corpus Délicat de contrôler complètement la réécriture

Lourd et insuffisant pour la manipulation des chaînes de caractère (les nœuds texte) Prévu pour la manipulation de la structure, de l'encodage plus que du contenu

des nœuds textes Inutilisable avec de très gros documents

Prévoir dix fois la taille du fichier en mémoire vive. Ces limites sont dues à l'approche "arborescente" : XSLT permet de

manipuler une arborescence en mémoire. Une autre représentation du contenu, dite "séquentielle" permet plus de

précision et n’est pas limité par la taille du document, mais demande l’utilisation d’un langage de programmation.

Page 122: XSLT : XML Stylesheet Language Transformation & XPath : langage dadressage de parties de documents XML Une introduction à XSLT & Xpath pour l'analyse.

122

Cours XML –M2-CCI / Y.Laborde

122 Efficacité comme langage de requête

Deux stratégies à cumuler : à dominante procédurale ou déclarative.

Economie et plasticité grâce à l’utilisation de templates et templates par défaut.

Adapté à l’extraction d’information, la projection de sous-corpus ou la conversion vers d’autres formats.

La version 2 de XSLT apportera des améliorations (expressions régulières, typage, regroupement), sans changer cette dominante « extraction », plus que« édition », dans la « transformation »