Exemple: Document XML XPath et XSLT - [Cedric]cedric.cnam.fr/.../valeurc-xpath-xslt-4x.pdf9...

Preview:

Citation preview

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 &gt;= $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

Recommended