23
Tutoriel XSLT F. Sajous ERSS – 01/04/2005

Tutoriel XSLT F. Sajous ERSS – 01/04/2005. 2 Plan Rappels XML XPath XSLT Principes Templates et moteur Structures de contrôle XSLT Advanced

Embed Size (px)

Citation preview

Page 1: Tutoriel XSLT F. Sajous ERSS – 01/04/2005. 2 Plan Rappels XML XPath XSLT Principes Templates et moteur Structures de contrôle XSLT Advanced

Tutoriel XSLT

F. SajousERSS – 01/04/2005

Page 2: Tutoriel XSLT F. Sajous ERSS – 01/04/2005. 2 Plan Rappels XML XPath XSLT Principes Templates et moteur Structures de contrôle XSLT Advanced

2

Plan

• Rappels• XML• XPath

• XSLT• Principes• Templates et moteur• Structures de contrôle

• XSLT Advanced

Page 3: Tutoriel XSLT F. Sajous ERSS – 01/04/2005. 2 Plan Rappels XML XPath XSLT Principes Templates et moteur Structures de contrôle XSLT Advanced

3

Rappel superflu : XML

<?xml version="1.0" encoding="iso-8859-1"?><lexicalDatabase> <title level="resource">Morphalou : Lexique morphologique</title>

<lexicalEntry lemma="linguistique" grammaticalCategory="commonNoun" grammaticalGender="feminine">

<inflectionGroup> <inflection orthography="linguistique" grammaticalNumber="singular"/> <inflection orthography="linguistiques" grammaticalNumber="plural"/> </inflectionGroup> </lexicalEntry></lexicalDatabase>

Exemple : Morphalouen-tête

balise de fin

élément vide

@ribut

balise de début texte

Page 4: Tutoriel XSLT F. Sajous ERSS – 01/04/2005. 2 Plan Rappels XML XPath XSLT Principes Templates et moteur Structures de contrôle XSLT Advanced

4

XPath : rappel... superflu ?

• langage pour adresser des parties de documents XML• parties de documents = ensemble de noeuds de la

structure arborescente• sélection par

• type et la valeur des éléments• type et la valeur des attributs• place occupée dans l'arbre• typologie des voisins, parents, descendants...• fonctions XPath

• exemples• //inflection[@orthography='linguistique']/@grammaticalNumber• //inflection[@orthography='linguistique']/../../@grammaticalCategory• //lexicalEntry[count(.//inflection[@orthography=../../@lemma]) = count(.//inflection)]

Page 5: Tutoriel XSLT F. Sajous ERSS – 01/04/2005. 2 Plan Rappels XML XPath XSLT Principes Templates et moteur Structures de contrôle XSLT Advanced

5

XSLT : acteurs

ProcesseurXSLT

XMLrésultat

XMLrésultat sériali-

sateur

XSLXSL

ProcesseurXSLT

XMLsource

XMLsource X

HTMLPDFTexte...

à partir de quoi

comment

quoi

Page 6: Tutoriel XSLT F. Sajous ERSS – 01/04/2005. 2 Plan Rappels XML XPath XSLT Principes Templates et moteur Structures de contrôle XSLT Advanced

6

Sélection + Transformation

/XML

filtrage(patrons ou templates)

règles de transformation

XML résultat

Page 7: Tutoriel XSLT F. Sajous ERSS – 01/04/2005. 2 Plan Rappels XML XPath XSLT Principes Templates et moteur Structures de contrôle XSLT Advanced

7

Et concrètement : les templates

<?xml version="1.0" encoding="iso-8859-1"?><xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform'> <xsl:template match="expression xpath1"> <!-- construire sortie correspondant à l'élément (aux éléments filtré(s) --> </xsl:template>

<xsl:template match="expression xpath2"> <!-- construire sortie correspondant à l'élément (aux éléments) filtré(s) --> </xsl:template></xsl:stylesheet>

en-tête

racine

patrons

XML

XML

Page 8: Tutoriel XSLT F. Sajous ERSS – 01/04/2005. 2 Plan Rappels XML XPath XSLT Principes Templates et moteur Structures de contrôle XSLT Advanced

8

Templates : un exemple

<analyse> <sent> <taggertoken form="Il" pos="PRO"/> <taggertoken form="était" pos="VER:sg"/> <taggertoken form="une" pos="DET:femi:sg"/> <taggertoken form="fois" pos="NOM:femi:sg"/> ... </sent> <sent> ... </sent></analyse>

XML source

<analyse> <sent> <snum>1</snum> <token>Il</token> <token>était</token> <token>une</token> <token>fois</token> </sent> ...</analyse>

Résultat souhaité

<xsl:template match="sent"> <sent><snum> <xsl:value-of select="position()"/></snum></sent></xsl:template><xsl:template match="taggertoken"> <token><xsl:value-of select="@form"/></token></xsl:template>XSL

<sent> <snum>1</snum></sent>...

Résultat obtenu

Page 9: Tutoriel XSLT F. Sajous ERSS – 01/04/2005. 2 Plan Rappels XML XPath XSLT Principes Templates et moteur Structures de contrôle XSLT Advanced

9

Moteur !

analyse

sent sent

taggertokenform="il"pos="PRO"

taggertokenform="était"pos="VER:sg"

taggertokenform="une"pos="DET:femi:sg"

...

...

template correspondant ?Non !

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

</xsl:template>

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

</xsl:template>

<xsl:template match="sent"> <snum><xsl:value-of select="position()"/></snum></xsl:template>

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

</xsl:template>

Oui !

<sent> <snum>1</snum></sent>

Page 10: Tutoriel XSLT F. Sajous ERSS – 01/04/2005. 2 Plan Rappels XML XPath XSLT Principes Templates et moteur Structures de contrôle XSLT Advanced

10

Pour éviter les infanticides...

<analyse> <sent> <taggertoken form="Il" pos="PRO"/> <taggertoken form="était" pos="VER:sg"/> <taggertoken form="une" pos="DET:femi:sg"/> <taggertoken form="fois" pos="NOM:femi:sg"/> ... </sent> <sent> ... </sent></analyse>

XML source

<sent> <snum>1</snum> <token>Il</token> <token>était</token> <token>une</token> <token>fois</token> </sent> ...

Résultat

<xsl:template match="sent"> <sent><snum> <xsl:value-of select="position()"/></snum> <xsl:apply-templates/></sent></xsl:template><xsl:template match="taggertoken"> <token><xsl:value-of select="@form"/></token></xsl:template>XSL

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

...et les parenticides !

<analyse>

</analyse>

Page 11: Tutoriel XSLT F. Sajous ERSS – 01/04/2005. 2 Plan Rappels XML XPath XSLT Principes Templates et moteur Structures de contrôle XSLT Advanced

11

Patrons par défaut<livre> <chapitre> <titre>XML</titre> <contenu>XML : un lang. de balises extensibles...</contenu> </chapitre> <chapitre> <titre>XSLT</titre> <contenu>XSLT est un lang. de tranforma°...</contenu> <chapitre/></livre>

<xsl:template match="titre"> <xsl:value-of select="position()"/> <xsl:value-of select="titre"/></xsl:template>

réalisons un sommaire...

1 XMLXML : un lang.de balises extensibles.. 2 XSLTXSLT estun lang. de tranforma°...

Résultat

Le processeur XSLT pacourt l'arbre :- "en profondeur d'abord" (racine vers feuilles)- puis de gauche à droite

Pour chaque élément rencontré :- patron défini : on l'applique- patron défini : patron par défaut !

Page 12: Tutoriel XSLT F. Sajous ERSS – 01/04/2005. 2 Plan Rappels XML XPath XSLT Principes Templates et moteur Structures de contrôle XSLT Advanced

12

Défaut des patrons

• 3 patrons par défaut :• éléments textuels : générer le texte en sortie• commentaires : ignorer• autres noeuds : appliquer les patrons (définis ou par

défaut) aux enfants

<livre> <chapitre> <titre>XML</titre> <contenu>XML : un lang. de balises extensibles...</contenu> </chapitre> <chapitre> <titre>XSLT</titre> <contenu>XSLT est un lang. de tranforma°...</contenu> <chapitre/></livre>

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

1 XMLXML : un lang.de balises extensibles...2 XSLTXSLT estun lang. de tranforma°...

Page 13: Tutoriel XSLT F. Sajous ERSS – 01/04/2005. 2 Plan Rappels XML XPath XSLT Principes Templates et moteur Structures de contrôle XSLT Advanced

13

En attendant le grand soir...<livre> <chapitre> <titre>XML</titre> <contenu>XML : un lang. de balises extensibles...</contenu> </chapitre> <chapitre> <titre>XSLT</titre> <contenu>XSLT est un lang. de tranforma°...</contenu> <chapitre/></livre>

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

XML

1 XML2 XSLT

Résultat attendu

<xsl:template match="contenu"></xsl:template>+

template défini pour contenu qui génère une sortie vide

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

(joue sur les priorités)

<xsl:template match="/"> <xsl:for-each select="//titre"> <xsl:value-of select="position()"/> <xsl:value-of select="."/> </xsl:for-each></xsl:template>

ou

template défini pour la racineet... structure de contrôle...

Page 14: Tutoriel XSLT F. Sajous ERSS – 01/04/2005. 2 Plan Rappels XML XPath XSLT Principes Templates et moteur Structures de contrôle XSLT Advanced

14

Priorités du patronat...<livre> <chapitre> <titre>XML</titre> <contenu>XML : un lang. de balises extensibles...</contenu> </chapitre> <chapitre> <titre>XSLT</titre> <contenu>XSLT est un lang. de tranforma°...</contenu> <chapitre/></livre>

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

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

règle du "plus spécifique"

<xsl:template match="titre"> Titre : <xsl:value-of select="."/></xsl:template><xsl:template match="/*/*[position()=1]"> Pos1 : <xsl:value-of select="."/> </xsl:template>

?

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

règle du "plus englobant"

MAIS !si on ajoute

génère une sortie vide* et / "matchent"

élément rencontré en 1er

c'est toujours les plus grospatrons qui gagnent !

Page 15: Tutoriel XSLT F. Sajous ERSS – 01/04/2005. 2 Plan Rappels XML XPath XSLT Principes Templates et moteur Structures de contrôle XSLT Advanced

15

Priorités du patronat...<livre> <chapitre> <titre>XML</titre> <contenu>XML : un lang. de balises extensibles...</contenu> </chapitre> <chapitre> <titre>XSLT</titre> <contenu>XSLT est un lang. de tranforma°...</contenu> <chapitre/></livre>

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

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

<xsl:template match="titre"> Titre : <xsl:value-of select="."/></xsl:template><xsl:template match="/*/*[position()=1]"> Pos1 : <xsl:value-of select="."/> </xsl:template>

?

<xsl:template match="titre" priority="2"> Titre : <xsl:value-of select="."/></xsl:template><xsl:template match="/*/*[position()=1]" priority="1"> Pos1 : <xsl:value-of select="."/> </xsl:template>

Page 16: Tutoriel XSLT F. Sajous ERSS – 01/04/2005. 2 Plan Rappels XML XPath XSLT Principes Templates et moteur Structures de contrôle XSLT Advanced

16

<xsl:choose> <xsl:when test="cond1"> <!-- instr si con1 vraie --> </xsl:when> <xsl:when test="cond2"> <!-- instr si cond1 fausse et cond2 vraie --> </xsl:when> <xsl:otherwise> <!-- instr si toutes les cond sont fausses --> </xsl:otherwise></xsl:choose>

Choix multiple (switch case default)

Structures de contrôles

<xsl:if test='fct xpath booléenne'> <!-- instr. si vrai --></xsl:if>

Conditionnelle

● instruction sort facultativemais non nécessairement unique

pas de else !

<xsl:for-each select="xpath1"> <xsl:sort select="xpath2" order="ascending | descending"/> <!-- instruction --></xsl:for-each>

Itération

● xpath : absolu ou relatifà l'élément courant

● une liste de noeuds sélecionnésà chaque itération, un noeud

devient l'élément courant

Page 17: Tutoriel XSLT F. Sajous ERSS – 01/04/2005. 2 Plan Rappels XML XPath XSLT Principes Templates et moteur Structures de contrôle XSLT Advanced

17

Action !

• Lancer <oXygen/> 5.1• Fichiers XML et XSL dans C:\ERSS-XSLT

• Exercices/Session 1

• Avant de partir, SVP :• supprimer le répertoire C:\ERSS-XSLT• désinstaller <oXygen/>

• (panneau de configuration, Ajout/Suppression de programmes)

Page 18: Tutoriel XSLT F. Sajous ERSS – 01/04/2005. 2 Plan Rappels XML XPath XSLT Principes Templates et moteur Structures de contrôle XSLT Advanced

18

En vrac...

Quelques éléments pour aller plus loin

Page 19: Tutoriel XSLT F. Sajous ERSS – 01/04/2005. 2 Plan Rappels XML XPath XSLT Principes Templates et moteur Structures de contrôle XSLT Advanced

19

Variables

• <xsl:variable name="nom_var" [ instr XSLT dont le résultat deviendra la valeur de la variable]</xsl:variable>

• Une fois une variable définie, elle est constante !!! (i = i + 1 impossible)

• <xsl:value-of select='$nom_var'/>• sortie HTML : <a href='{$nom_var}'>lien</a>

Page 20: Tutoriel XSLT F. Sajous ERSS – 01/04/2005. 2 Plan Rappels XML XPath XSLT Principes Templates et moteur Structures de contrôle XSLT Advanced

20

Créer des éléments XML

• <xsl:element name="nom élément"> <xsl:attribute name="nom_attr"> [ instructions XSLT ] </xsl:attribute> [ instructions XSLT ] </xsl:element>

Page 21: Tutoriel XSLT F. Sajous ERSS – 01/04/2005. 2 Plan Rappels XML XPath XSLT Principes Templates et moteur Structures de contrôle XSLT Advanced

21

Copier des éléments XML

• <xsl:copy> [ instructions XSLT ]</xsl:copy>

• Cette instruction ne copie que les balises ouvrantes et fermantes de l'élément courant(ne copie ni attributs, ni enfants)

• <xsl:copy> [ instructions XSLT ] <xsl:apply-templates/></xsl:copy>

Page 22: Tutoriel XSLT F. Sajous ERSS – 01/04/2005. 2 Plan Rappels XML XPath XSLT Principes Templates et moteur Structures de contrôle XSLT Advanced

22

Copier des éléments XML (2)

• <xsl:copy-of select="XPath"> [ instructions XSLT ]</xsl:copy>

• copie toute la structure de l'élément sélectionné (y compris attributs et descendance)

• utilisation conjointe avec xsl:copy :<xsl:copy> <xsl:copy-of select="@*"/> [ instructions XSLT ] <xsl:apply-templates/></xsl:copy>

Page 23: Tutoriel XSLT F. Sajous ERSS – 01/04/2005. 2 Plan Rappels XML XPath XSLT Principes Templates et moteur Structures de contrôle XSLT Advanced

23

Plusieurs documents XML

• Pour accéder à un docuement autre que celui en cours de transformation :document('cheminFichier')/XPath

XSLXSL

ProcesseurXSLT

XMLsource

XMLsource Résultat

XML (autre)<...> ... <monElt id='63'> ... </monElt> ...

XML (autre)<...> ... <monElt id='63'> ... </monElt> ...

<xsl:value-of select="document('autre')/monElt[@id='63']">