You are on page 1of 52

Le langage XPATH

Pr. F. LAHBOUBE

Anne universitaire 2014-2015

Plan

XPATH : Introduction
XPATH et modle de donne
Chemins de localisation
Expressions XPATH
Bibliothque de fonctions de base
La forme abrge des requtes Xpath
Langage XPath - Synthse

XPATH : Introduction
XPATH est un langage pour adresser des
parties de document XML, conu pour tre
la fois utilis par:
XSLT : slection des parties de document
transformer
XSL-FO : slections des parties de
document formater
XPointer : identification de fragments de
document XML
XLink : ancre des liens hypertexte
XQuery : sous-ensemble du langage
d'interrogation
bien d'autres langages et applications...

Document XML

XPATH avec XSL


L'objectif de XSL est de transformer un document XML en un autre
document.
Le mcanisme derrire XSLT: la programmation dclarative (on
dcrit ce que l'on souhaite, pas le comment): "Moteur XSL, quand tu
rencontres tel lment, fais ceci... "
Document XSL: un ensemble de rgles qui vont s'appliquer sur
l'arbre de document XML

Consquence: besoin de dterminer des lments prcis de l'arbre


XML : XPATH

XPATH : Introduction
La forme syntaxique de base de XPATH est
l'expression
Elle peut s'appliquer 4 types possibles d'objets:

Ensemble de nuds
Boolen
Nombre
Chane de caractre

Exemples :
/doc/chapter[5]/section[2]
chapter[title="Introduction"]

XPATH et modle de donne


XPATH utilise le terme de nud pour dsigner
une partie quelconque d'un document
Il distingue 7 types de nuds:

nud racine : parent de l'lment document


nuds lments
nuds texte
nuds attributs
nuds espace des noms
nuds d'instructions de traitement

XPATH et modle de donne


Il existe un ordre associ au document, dfini
pour tout les nuds:
Les nuds sont placs avant leurs enfants
Les nuds attributs et espace des noms d'un lment
sont classs avant les enfants de l'lment

Chemins de localisation
Le chemin de localisation est une expression
XPATH particulire
Slectionne un ensemble de nuds relativement
au nud contexte
Peuvent contenir des expressions rcursives de
filtrage des nuds
Une syntaxe directe mais verbeuse (il existe des
abrviations)

Chemins de localisation
La notion de nud contextuel est trs importante
Un chemin de localisation est une expression XPATH qui
retourne un node-set
Il est form de "location steps" spars par des "/"
Une "location step" est value par rapport au nud contextuel et
retourne un node-set dont chaque nud devient le nud
contextuel pour l'valuation du step suivant

Exemple :
child::doc/child::chapter[position()=5]
/child::section[position()=2]

10

Chemins de localisation
Il existe 2 types de location path
Relatif : commence au nud contextuel (contexte
d'valuation)
Absolu : commence au nud racine du document
contenant le nud contextuel (indiqu par un /
initial)

11

Chemins de localisation

Une location step se fait avec 3 composants:

un axe
un filtre ou test
0 ou n prdicats

Les deux premiers composants sont obligatoires


alors que le dernier est optionnel

12

Chemins de localisation: axe


L'axe d'un location step indique dans quel partie
de l'arbre (par rapport au nud courant) il faut
chercher les nuds retourner :

ancestor, ancestor-or-self
child
descendant, descendant-or-self
parent
following, following-sibling
self
attribute
namespace
preceding, preceding-sibling

13

| 'ancestor'

14

| 'ancestor'
2

15

'ancestor-or-self'

16

'ancestor-or-self'
3

17

| 'child'

18

| 'child'

19

| 'descendant'

20

| 'descendant'

21

| 'descendant-or-self'

22

| 'descendant-or-self'

23

| 'following'

24

| 'following'

25

| 'following-sibling'

26

| 'following-sibling'

27

| 'parent'

28

| 'parent'
1

29

| 'preceding'

30

| 'preceding'

31

| 'preceding-sibling'

32

| 'preceding-sibling'

33

| 'self'

34

Chemins de localisation : test


Le test d'une location Step indique quels nuds (type
et/ou nom) il faut choisir sur l'axe considr

Les nuds lments du nud considr : *


Les nuds texte (du nud considr) : text()
Les nuds (du nud considr) : node()
Les commentaires (du nud considr) : comment()
Les instructions de traitement : proceedinginstruction()

35

Chemins de localisation : prdicat


Un prdicat est une expression boolenne value en fonction du
contexte:
Nud contextuel
Taille: nombre de nuds dans le node-set filtr. Exemple:
(count() = 5)
Position : rang du nud dans le node-set, dans l'ordre du
document (ou dans l'ordre inverse pour les axes ancestor,
ancestor-or-self, preceding et preceding-sibling). Exemples:
last(), (position() mod 2 = 1)
Chaque nud du node-set n'est conserv que si l'valuation du
prdicat pour ce nud retourne true
Une expression prdicat est excute en l'valuant et en
convertissant le rsultat en boolen.

36

Chemins de localisation : prdicat


Exemples :

nodetest[1]: le premier nud


nodetest[position()=last()]: le dernier nud
nodetest[position() mod 2 = 0]: les nuds pairs
element[@id="foo"]: le(s) lment(s) dont l'attribut id a la valeur
"foo
element[not(@id)]: les lments qui n'ont pas d'attribut id
author[firstname="Norman"]: les lments author qui ont
des fils firstname dont le contenu est "Norman"
author[normalize-space(firstname)="Norman"]: les
lments author qui ont des fils firstname dont le contenu est
"Norman" (sans tenir compte des espaces)

Exemple
Les axes: self, child, parent,

descendant, descendant-or-self,
ancestor, ancestor-or-self,
preceding, preceding-sibling,

following, following-sibling, attribute

//CCC/self::*

<AAA>
<XXX>
<DDD>
<BBB/>
<BBB/>
<EEE/>
<FFF/>
</DDD>
</XXX>
<CCC>
<DDD>
<BBB/>
<BBB id=b/>
<GGG/>
<FFF/>
</DDD>
</CCC>
<CCC>
<BBB name=bbb>
<BBB id=bbb>
<BBB/>
</BBB>
</BBB>
</CCC>
</AAA>
37

Exemple
Les axes: self, child, parent,

descendant, descendant-or-self,
ancestor, ancestor-or-self,
preceding, preceding-sibling,

following, following-sibling, attribute

//CCC/child::*

<AAA>
<XXX>
<DDD>
<BBB/>
<BBB/>
<EEE/>
<FFF/>
</DDD>
</XXX>
<CCC>
<DDD>
<BBB/>
<BBB id=b/>
<GGG/>
<FFF/>
</DDD>
</CCC>
<CCC>
<BBB name=bbb>
<BBB id=bbb>
<BBB/>
</BBB>
</BBB>
</CCC>
</AAA>
38

Exemple
Les axes: self, child, parent,

descendant, descendant-or-self,
ancestor, ancestor-or-self,
preceding, preceding-sibling,

following, following-sibling, attribute

//CCC/parent::*

<AAA>
<XXX>
<DDD>
<BBB/>
<BBB/>
<EEE/>
<FFF/>
</DDD>
</XXX>
<CCC>
<DDD>
<BBB/>
<BBB id=b/>
<GGG/>
<FFF/>
</DDD>
</CCC>
<CCC>
<BBB name=bbb>
<BBB id=bbb>
<BBB/>
</BBB>
</BBB>
</CCC>
</AAA>
39

Exemple
Les axes: self, child, parent,

descendant, descendant-or-self,
ancestor, ancestor-or-self,
preceding, preceding-sibling,

following, following-sibling, attribute

//DDD/descendant::*

<AAA>
<XXX>
<DDD>
<BBB/>
<BBB/>
<EEE/>
<FFF/>
</DDD>
</XXX>
<CCC>
<DDD>
<BBB/>
<BBB id=b/>
<GGG/>
<FFF/>
</DDD>
</CCC>
<CCC>
<BBB name=bbb>
<BBB id=bbb>
<BBB/>
</BBB>
</BBB>
</CCC>
</AAA>
40

Exemple
Les axes: self, child, parent,

descendant, descendant-or-self,
ancestor, ancestor-or-self,
preceding, preceding-sibling,

following, following-sibling, attribute

//DDD/ancestor::*

<AAA>
<XXX>
<DDD>
<BBB/>
<BBB/>
<EEE/>
<FFF/>
</DDD>
</XXX>
<CCC>
<DDD>
<BBB/>
<BBB id=b/>
<GGG/>
<FFF/>
</DDD>
</CCC>
<CCC>
<BBB name=bbb>
<BBB id=bbb>
<BBB/>
</BBB>
</BBB>
</CCC>
</AAA>
41

Exemple
Les axes: self, child, parent,

descendant, descendant-or-self,
ancestor, ancestor-or-self,
preceding, preceding-sibling,

following, following-sibling, attribute

//GGG/preceding::*

<AAA>
<XXX>
<DDD>
<BBB/>
<BBB/>
<EEE/>
<FFF/>
</DDD>
</XXX>
<CCC>
<DDD>
<BBB/>
<BBB id=b/>
<GGG/>
<FFF/>
</DDD>
</CCC>
<CCC>
<BBB name=bbb>
<BBB id=bbb>
<BBB/>
</BBB>
</BBB>
</CCC>
</AAA>
42

Exemple
Les axes: self, child, parent,

descendant, descendant-or-self,
ancestor, ancestor-or-self,
preceding, preceding-sibling,

following, following-sibling, attribute

//GGG/preceding-sibling::*

<AAA>
<XXX>
<DDD>
<BBB/>
<BBB/>
<EEE/>
<FFF/>
</DDD>
</XXX>
<CCC>
<DDD>
<BBB/>
<BBB id=b/>
<GGG/>
<FFF/>
</DDD>
</CCC>
<CCC>
<BBB name=bbb>
<BBB id=bbb>
<BBB/>
</BBB>
</BBB>
</CCC>
</AAA>
43

Exemple
Les axes: self, child, parent,

descendant, descendant-or-self,
ancestor, ancestor-or-self,
preceding, preceding-sibling,

following, following-sibling, attribute

//*[attribute::id]

<AAA>
<XXX>
<DDD>
<BBB/>
<BBB/>
<EEE/>
<FFF/>
</DDD>
</XXX>
<CCC>
<DDD>
<BBB/>
<BBB id=b/>
<GGG/>
<FFF/>
</DDD>
</CCC>
<CCC>
<BBB name=bbb>
<BBB id=bbb>
<BBB/>
</BBB>
</BBB>
</CCC>
</AAA>
44

45

Expressions XPATH
Les location-paths ne sont pas les seuls types
d'expressions XPATH.
Il y a aussi des expressions boolennes,
numriques et chanes de caractres
Toute expression XPATH peut tre utilise dans
un prdicat de location-path

46

Expressions XPATH
XPath : des Expressions
Fonctions string
Fonctions boolean
Manipulation de Nud

Exemple :
1+1
String(3)

47

Bibliothque de fonctions de base


Les fonctions XPath sont nombreuses et sont
exploitables soit dans un prdicat, soit directement
comme expression Xpath
Voici quelques fonctions :
string-length( ... ) : longueur dune chane
starts-with( chane1, chane2 ) : tester si chane1 commence par
chane2
substring( chane1, position1, longueur) : extraction dune souschane
normalize-space( chane ) : normalisation des occurrences de blancs
1 blanc ; suppression des blancs den-tte et de fin

48

Bibliothque de fonctions de base

number( chane ) : conversion en nombre ;


string( expression ) : conversion en chane ;
concat( chane1, chane2 ) : concatnation ;
contains( chane1, chane2 ) : tester si chane1 contient chane2 ;
floor( nombre dcimal ) : arrondi infrieur (10.9 devient 10, par
exemple) ;
ceil( nombre dcimal ) : arrondi suprieur (10.1 devient 11, par
exemple) ;
round( nombre dcimal ) : arrondi au plus juste (10.4 devient 10 et
10.6 devient 11, par exemple) ;
count( NodeSet? ) : nombre de nuds ;
position() : position courante commenant par 1 ;
last( NodeSet? ) : dernire position ;

49

La forme abrge des requtes XPath


La forme abrge est plus intuitive, notamment par son analogie
avec les chemins (paths) de fichiers. Elle ne couvre pas tous les axes
de la forme non abrge.
Tous dabord laxe child est implicite.
Si nous crivons, par exemple :
personne/nom
nous dsignons alors tous les lments fils nom des lments fils
personne (selon le nud de dpart)

Loprateur // dsigne tous les


descendants. Par exemple :
//personne
reprsente tous les lments personne de notre arbre.

50

La forme abrge des requtes XPath


Lattribut est prfix par loprateur
@ Par exemple :
/contacts/personne/@num
retourne tous les attributs num de tous les lments
personne fils de la racine contacts.

Le texte est dsign par la fonction text().


Par exemple :
/contacts/personne/adresse/text()
retourne toutes les adresses sous forme de contenu
texte des lments fils personne de la racine contacts.

51

La forme abrge des requtes XPath

Loprateur .. dsigne llment


parent Par exemple :
//nom[ name( .. ) = personne ]
retourne tous les descendants nom dont le parent a pour nom
personne.

Enfin loprateur . reprsente le nud courant.


Par exemple :
//personne[./@num=10]
retourne tous les descendants personne dont lattribut num
pour valeur lentier 10

52

Langage XPath - Synthse


Nom
section
Slectionne les lments de nom donn
Nom[0]
section[0] Slectionne le premier lment ayant le nom donn
Nom[end()] section[end()] Slectionne le dernier lment ayant un nom donn
|
Droite|Gauche Indique une alternative (un nud OU bien l'autre (ou les deux))
/
/
Slectionne le nud racine d'une arborescence
/arbre/Nom /livre/chapitre Slectionne les nuds descendants par la balise de nom donn de l'arbre
*
*
Motif "joker" dsignant n'importe quel lme nt
//
//personne Indique tous les descendants d'un nud
.
.
Caractrise le nud courant
Dsigne le nud parent. Permet de remonter d'un niveau dans
..
..
l'arborescence
Indique un attribut caractristique ( @nom dsigne la valeur de l'attribut).
@
@nom
La notation @* dsigne tous les attributs d'un lment
text()
Dsigne le contenu d'un lment (le texte contenu entre ses balises)
text()
ID()
ID('a2546') Slectionne l'lment dont l'identifiant (la valeur de l'attribut ID) est celui
spcifi en param tre
Comment() Comment() Dsigne tous les nuds commentaires
Node()
Dsigne tous les noeuds
Node()

You might also like