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