Upload
lamhanh
View
221
Download
3
Embed Size (px)
Citation preview
XPa
th
par Philippe Poulard
2
<?xml version="1.0"?> <Contacts> <Contact> <Name>John Doe</Name> <Phone>626-555-3456</Phone> </Contact> <Contact> <Name>Joe <!--I need to check whether he prefers Joe or Joseph --> Smith </Name> <Phone>212-555-3456</Phone> </Contact> <Contact> <Name>Jane <![CDATA[& Ben]]> Reilly</Name> <Phone>212-555-2341</Phone> </Contact> <Contact> <Name>Mohammed Jones</Name> <Phone>718-555-2349</Phone> <Phone>914-555-7698</Phone> </Contact> <Contact> <Phone>914-555-3145</Phone> <Name>David Smith</Name> </Contact> <Contact> <Name>Jason Smith</Name> <Phone></Phone> </Contact> <Contact> <Name>Xao Li</Name> <Name>Jonathan Li</Name> <Phone>212-555-0998</Phone> </Contact> </Contacts>
Exemple
Ecrire un programme qui affiche les noms
XPa
th
par Philippe Poulard
3
En Java avec DOM
Element contactsElement = doc.getDocumentElement(); NodeList contacts = contactsElement.getChildNodes(); for (int i = 0; i < contacts.getLength(); i++) { Node current = contacts.item(i); if (current.getNodeType() == Node.ELEMENT_NODE) { Element contact = (Element) current; NodeList children = contact.getChildNodes(); for (int j = 0; j < contacts.getLength(); j++) { Node candidate = children.item(j); if (candidate.getNodeType() == Node.ELEMENT_NODE) { // Assuming name is the first child element String name = candidate.getFirstChild().getNodeValue(); System.out.println(name); // Assuming there's only one name per contact break; } } } }
Déjà long et pas très robuste : • Support des CDATA ? • Support des commentaires et PI ? • Et si le nom n'est pas en première position ? • Support des entités ?
John Doe Joe Jane Mohammed Jones 914-555-3145 Jason Smith Xao Li
XPa
th
par Philippe Poulard
4
En XPath
/Contacts/Contact/Name/text()
ou bien
John Doe Joe Smith Jane & Ben Reilly Mohammed Jones David Smith Jason Smith Xao Li Jonhatan Li
//Name/text()
(en vérité seuls les nœuds sont sélectionnés; comme en SQL il faudrait itérer sur les résultats et afficher la ‘’stringValue’’ de chaque noeud)
XPa
th
par Philippe Poulard
5
Sommaire • Qu'est-ce que XPath ? • Analogies entre XPath et file systems
• Fonctionnalités de base :
• Sélection d'un ensemble de nœuds
• Sélection de nœud d'attribut
• Modèle de données XPath • Chemins et étapes de localisation, tests de nœud, jokers
• Axes XPath
• Formes abrégées et verbeuses
• Predicats, collections, prédicats composés
• Fonctions XPath : • fonctions d'ensembles de nœuds,
• fonctions de chaînes,
• fonctions booléennes,
• fonctions numériques • Divers
• Contexte d'évaluation / Utilisation
• XPath2
XPa
th
par Philippe Poulard
6
Qu'est-ce ?
XPath est un langage non XML utilisé pour adresser des items dans un document XML
Il est intensivement utilisé dans XSLT
• Sa syntaxe élémentaire ressemble à l'expression d'un chemin dans un file system • Sa syntaxe formelle plus du tout
Une expression XPath peut s'exprimer : • relativement, vis à vis d'un nœud contextuel • d'une manière absolue
(syntaxe non XML)
http://www.w3c.org/TR/xpath
Standard du w3c
Le résultat d'une expression XPath peut être : • un ensemble de nœuds (ou un nœud seul) • une chaîne de caractères • un nombre • un booléen
(modèle logique)
XPath est un langage de requêtes pour
extraire des données d'un document XML
XPa
th
par Philippe Poulard
7
Analogies XPath et file system
<?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE Cours SYSTEM "Cours.dtd"> <Cours>
<Titre>Cours XML</Titre> <Auteur> <Nom>Poulard</Nom> <Prénom>Philippe</Prénom> </Auteur> <Description> Ce cours aborde les <b>concepts</b> de base mis en œuvre dans XML. </Description>
</Cours>
/ E Cours
E
E
Titre
Auteur
Description
E
E Nom
Prénom
T
T
T
T
text()
text()
text()
text()
/Cours/Auteur/Prénom
autoexec.bat
temp admin.pub
WINNT regedit.exe
/
config.sys
svf1.tmp
Setup1.exe
system keyboard.drv
mmsystem.dll
/WINNT/system
E T text()
T b
E
text()
Expression XPath qui retourne 1 nœud
XPa
th
par Philippe Poulard
8
autoexec.bat
temp admin.pub
WINNT regedit.exe
/
config.sys
svf1.tmp
Setup1.exe
system keyboard.drv
mmsystem.dll
Adressage relatif dans XPath
E Nœud contextuel Répertoire courant
.
..
../regedit.exe
Le nœud contextuel est déterminé par l'application utilisatrice de XPath
Le répertoire courant est déterminé par l'interpréteur de commandes
../Description
.
..
/ E Cours
E
E
Titre
Auteur
Description
E
E Nom
Prénom
T
T
T
T
text()
text()
text()
text()
E T text()
T b
E
text()
XPa
th
par Philippe Poulard
9
Comparaison XPath / file system
Expressions XPath File system URLs
Hiérarchie constituée de fichiers et de répertoire
Hiérarchie constituée d'éléments et d'autres types de nœuds
A chaque niveau les noms des fichiers sont uniques
A chaque niveau les noms des éléments peuvent ne pas être uniques
Une URL identifie un fichier unique Une expression XPath identifie un ensemble d'objets qui peut être un ou plusieurs nœuds
Une expression peut être évaluée à partir d'un nœud spécifique, appelé "le nœud contextuel" de la requête
Une URL peut être évaluée à partir d'un d'un répertoire spécifique, appelé "le répertoire courant"
Ana
logi
es
Dif
fére
nces
XPa
th
par Philippe Poulard
10
/ E animaux
E chiens
chats E
text()
Sélection d'un ensemble de nœuds
<?xml version="1.0" encoding="ISO-8859-1" ?> <animaux> <chiens> <chien>Lassie <couleur>noir</couleur> </chien> <chien>Médor <couleur>marron</couleur> </chien> </chiens> <chats> <chat>Félix <couleur>crème</couleur> </chat> <chat>Tom <couleur>crème</couleur> </chat> <chat>Rominet <couleur>gris</couleur> </chat> </chats> </animaux>
T E
E
chien
couleur T text()
text() T E
E
chien
couleur T text()
text() T E
E
chat
couleur T text()
text() T E
E
chat
couleur T text()
text() T E
E
chat
couleur T text()
/animaux/chats/chat
/animaux/chats/chat/couleur
XPa
th
par Philippe Poulard
11
Sélection de nœud d'attribut
/ E animaux
E chiens
chats E
text()
race
E
chien
couleur T text()
text() T race
chien
couleur T text()
text() T race
chat
couleur T text()
text() T race
chat
couleur T text()
text() T race
chat
couleur T text()
<?xml version="1.0" encoding="ISO-8859-1" ?> <animaux> <chiens> <chien race="Labrador">Mabrouk <couleur>noir</couleur> </chien> <chien race="Labrador">Médor <couleur>marron</couleur> </chien> </chiens> <chats> <chat race="Siamois">Félix <couleur>crème</couleur> </chat> <chat race="Birman">Tom <couleur>crème</couleur> </chat> <chat race="Abyssin">Rominet <couleur>gris</couleur> </chat> </chats> </animaux>
/animaux/chiens/chien/@race
@ è attribut "at"
T @
E
@ E
@ E
@ E
@ E
E
E
E
E
XPa
th
par Philippe Poulard
12
Sont exclus du modèle : • les sections CDATA • les appels d'entités • la clause DTD • la déclaration XML
Modèle de données XPath Document XML è arborescence de noeuds
• nœuds d'espace de nom
/
foo-élément
@bar-attribut
text()
comment()
processing-instruction()
namespace::foo-ns
Le modèle n'est pas seulement basé sur les nœuds eux-mêmes mais aussi sur leurs relations.
XPath ne permet pas d'accéder directement aux éléments, aux attributs et autres constructions de balisage. Il permet seulement d'accéder aux nœuds construits à partir de ce balisage.
Nœuds XPath
T
/
@
E
ns
--
?
Types de nœuds XPath
• nœud racine (nœud document)
• nœuds d'élément
• nœuds de texte
• nœuds d'attribut
• nœuds de commentaire
• nœuds d'instruction de traitement
XPa
th
par Philippe Poulard
13
Les appels d'entité, les appels de caractère et les sections CDATA sont indiscernables des contenus textuels
L'élément "foo" (de <foo> à </foo>) ne contient qu'un seul nœud texte (tout est fusionné)
/ E foo
text() T
Modèle de données XPath <?xml encoding="ISO-8859-1"?> <!DOCTYPE foo [
<!ENTITY fusion "(tout est fusionné)"> ]> <foo>L'élément "foo" <![CDATA[(de <foo> à </foo>)]]> ne contient qu'un seul nœud texte &fusion; </foo>
Normalisation
Les appels d'entités parsées sont résolus
/ E foo
text() T
T
T
T
text()
text()
text()
L'élément "foo"
ud texte
(de <foo> à </foo>)
œ
ne contient qu'un seul n
(tout est fusionné)
T
T text()
text()
normalization
XPa
th
par Philippe Poulard
14
width
height
height
width
svg svg svg:rect
svg:svg
Les attributs xmlns sont rapportés comme des nœuds d'espace de noms, et sont attachés à tous les nœuds d'élément et d'attributs dans la portée de la déclaration
Modèle de données XPath
Les valeurs par défaut des attributs fournis par la DTD sont fixées
<?xml encoding="ISO-8859-1"?> <!DOCTYPE foo [ <!ATTLIST foo bar CDATA #FIXED "BAR"> ]> <foo/>
/ bar
foo BAR
<?xml version="1.0"?> <svg:svg width="18cm" height="6cm" xmlns:svg="http://www.w3.org/2000/svg"> <svg:rect x="1" y="1" width="198"
height="118"/> </svg:svg>
/
x
y
"héritage"
@ E
@ @
E @
E
@ @
@
ns ns
XPa
th
par Philippe Poulard
15
Construction XML Type Nom Valeur
- Document - -
<élément> Element Nom de l'élément -
attribut="valeur" Attr Nom de l'attribut Valeur de l'attribut
texte Text - Texte
<!-- commentaire --> Comment - Commentaire
<?cible argument?> ProcessingInstruction Nom de la cible Argument
xmlns:préfixe="URI" Namespace Préfixe
Caractéristiques du noeud
URI
Modèle de données XPath
T
/
@
E
ns
--
?
XPa
th
par Philippe Poulard
16
Chemin de localisation
/animaux/chats/chien/@race
/animaux/chats/chat
/animaux/chats/chat/couleur
../Description
.
..
/
Adressage d'un ensemble hétérogène de nœuds Peut être vide
/animaux/chats/chat/couleur
Chemin de localisation
Etape de localisation
Chemin de localisation de la racine : /
Unions d'étapes de localisation
/animaux/chats/chat|/animaux/chiens/chien
/animaux/(chiens|chats)/(chat|chien)
Avec XSLT, on peut réaliser des unions d'expression avec |
il s'agit de la racine du document, pas de l'élément racine
Chaque étape est évaluée dans le contexte de l'étape précédente
Le contexte d'évaluation d'une étape est l'ensemble des nœuds obtenu par l'évaluation de l'étape précédente
XPa
th
par Philippe Poulard
17
Tests de nœud dans les étapes de localisation
Nœuds d'élément
Nœuds d'attribut
Nœuds de commentaire
Nœuds de texte
Nœuds d'instruction de traitement
chats S'exprime par le nom de l'élément
S'exprime par le nom de l'attribut précédé de @ @race
Tests de nœuds nommés
Tests de type de nœuds
comment()
text()
processing-instruction()
processing-instruction("xml-stylesheet") Nœuds d'instruction de traitement
Les nœuds d'espace de nommage ne sont pas adressables par des tests de nœud
XPa
th
par Philippe Poulard
18
Jokers de tests de nœud Les jokers permettent de sélectionner différents items et types de nœuds différents
Joker pour les éléments : * /animaux/(chiens|chats)/(chien|chat) Exemple :
/animaux/*/*
S'il n'y a pas d'autres animaux, ces expressions sont équivalentes
Joker pour les attributs : @*
Exemple : /animaux/chats/chat/@*
Préfixage par un espace de noms : svg:*
c'est l'URI associée qui est prise en compte, et non pas le préfixe lui-même l'espace de nom doit être spécifié au niveau du processeur XPath
dépend du processeur et de l'application utilisatrice
Sélectionne tous les attributs de l'élément chat, s'il y en a plusieurs
Joker universel : node()
Exemple : /animaux/chats/chat/node() Sélectionne tous les nœuds de l'élément chat, s'il y en a plusieurs
Sélectionne tous les nœuds, quel que soit leur type
XPa
th
par Philippe Poulard
19
<?xml version="1.0" encoding="ISO-8859-1"?> <Cours> <!--penser à acheter du pain pour ce soir--> <Titre>Cours XML</Titre> <Auteur> <Nom>Poulard</Nom> <Prénom>Philippe</Prénom> </Auteur> <Description type="html"> Ce cours aborde les <b>concepts</b> de base mis en œuvre dans XML. <!-- c'est le meilleur cours !!! --> <?diaporama file="xml.ppt"?> </Description> </Cours>
/ E Cours
E
E
Titre
Auteur
Description
E
E Nom
Prénom
T
T
T
T
text()
text()
text()
text()
E T text()
T b
E
text()
-- comment()
Exemples d'utilisation des jokers
? processing-instruction()
/Cours/Auteur/*/text()
/Cours/Description/node()
/Cours/Description/comment()
-- comment()
XPa
th
par Philippe Poulard
20
Axes XPath
E Nœud contextuel
*
.
..
E
E
Titre
Auteur
Description
E
E Nom
Prénom
T
T
T
T
text()
text()
text()
text()
E T text()
T b
E
text()
Axe self
XPath permet de spécifier la "direction" dans laquelle un test de nœud doit être réalisé. Il y a 13 axes différents.
XPath propose une syntaxe abrégée pour les
axes les plus utilisés. Syntaxe :
A chaque étape de localisation (séparées par /), un axe différent peut être utilisé :
axe::test-de-noeud
Axe parent L'axe par défaut est l'axe child
Axe child
.
.. *
self::* parent::* child::*
../Description
parent::*/child::Description =
=
self child parent attribute namespace descendent descendent-or-self ancestor ancestor-or-self following following-sibling preceding preceding-sibling
/ E Cours
-- comment()
XPa
th
par Philippe Poulard
21
Axes typés XPath 2 axes particuliers permettent de sélectionner des types de nœud : attribute et namespace permettent d'accéder aux nœuds correspondants
Les 11 autres axes permettent d'accéder à tous les types de nœud, SAUF les nœuds de type attribut et les nœuds d'espace de nommage
width
height
height
width
svg svg svg:rect
svg:svg
<?xml version="1.0"?> <svg:svg width="18cm" height="6cm" xmlns:svg="http://www.w3.org/2000/svg"> <svg:rect x="1" y="1" width="198"
height="118"/> </svg:svg>
/
x
y
@ @
E @
E
@ @
@
ns ns
L'axe des attributs bénéficie d'une forme abrégée
namespace::foo-ns
@bar-attribut = attribute::bar-attribut
/child::svg:svg/attribute::height
/child::svg:svg/namespace::svg
/svg:svg/svg:rect/@y
self child parent attribute namespace descendent descendent-or-self ancestor ancestor-or-self following following-sibling preceding preceding-sibling
XPa
th
par Philippe Poulard
22
Axes non typés XPath
self child parent attribute namespace descendent descendent-or-self ancestor ancestor-or-self following following-sibling preceding preceding-sibling
descendent-or-self::node()
E
E
Titre
Auteur
Description
E
E Nom
Prénom
T
T
T
T
text()
text()
text()
text()
E T text()
T b
E
text()
E Nœud contextuel
E
E
Titre
Auteur
Description
E
E Nom
Prénom
T
T
T
T
text()
text()
text()
text()
E T text()
T b
E
text()
descendent::node()
ancestor::node()
ancestor-or-self::node() .//node() = forme abrégée
/ E Cours
-- comment()
/ E Cours
-- comment()
XPa
th
par Philippe Poulard
23
Axes non typés XPath
self child parent attribute namespace descendent descendent-or-self ancestor ancestor-or-self following following-sibling preceding preceding-sibling
following::node()
E
E
Titre
Auteur
Description
E
E Nom
Prénom
T
T
T
T
text()
text()
text()
text()
E T text()
T b
E
text()
Nœud contextuel
E
E
Titre
Auteur
Description
E
E Nom
Prénom
T
T
T
T
text()
text()
text()
text()
E T text()
T b
E
text()
following-sibling::node()
preceding::node()
preceding-sibling::node()
Même parent que le nœud de
référence
Même parent que le nœud de référence
Nœuds terminés avant le début du
nœud de référence
Nœuds commençant après la fin du nœud de référence
/ E Cours
-- comment()
/ E Cours
-- comment()
XPa
th
par Philippe Poulard
24
Joker universel : node()
Exemple : /animaux/chats/chat/node() Sélectionne tous les nœuds de l'élément chat, s'il y en a plusieurs
Sélectionne tous les nœuds, quel que soit leur type
Piège XPath
Sont exclus : les attributs et les nœuds d'espace de noms, puisqu'ils ne sont pas dans l'axe par défaut child
/animaux/chats/chat/child::node()
/animaux/chats/chat/attribute::node()
/animaux/chats/chat/attribute::*
Ces 2 expressions sont équivalentes puisqu'il n'y a qu'un seul type de nœud dans l'axe attribut
L'axe child contient seulement : • les nœuds d'élément • les nœuds de texte • les nœuds de commentaire • les nœuds d'instruction de traitement
XPa
th
par Philippe Poulard
25
child::foo-élément child::* attribute::foo-élément attribute::* /descendant-or-self::node() self::node() parent::node() [position()=n]
foo-élément * @foo-élément @* // . .. [n]
/child::animaux /child::* attribute::race attribute::* /descendant-or-self()::node()/chat self::node()/text() parent::node()/chiens //chat[position()=3]
/animaux /* @race @* //chat text() ../chiens //chat[3]
Forme verbeuse Forme abrégée Exemples
Limitation des axes XPath : il n'existe pas d'axe de parcours "naturel" d'un arbre
Formes verbeuses et abrégées des expressions
XPa
th
par Philippe Poulard
26
Prédicats XPath Syntaxe : axe::test-de-noeud[prédicat] Un prédicat permet de spécifier un filtre
dans une étape de localisation Un prédicat est une expression booléenne qui sera testée pour chaque nœud de l'ensemble des nœuds de l'étape de localisation
/ E animaux
E chiens
chats E
text()
race
E
chien
couleur T text()
text() T race
chien
couleur T text()
text() T race
chat
couleur T text()
text() T race
chat
couleur T text()
text() T race
chat
couleur T text()
T @
E
@ E
@ E
@ E
@ E
E
E
E
E
<?xml version="1.0" encoding="ISO-8859-1" ?> <animaux> <chiens> <chien race="Labrador">Mabrouk <couleur>noir</couleur> </chien> <chien race="Labrador">Médor <couleur>marron</couleur> </chien> </chiens> <chats> <chat race="Siamois">Félix <couleur>crème</couleur> </chat> <chat race="Birman">Tom <couleur>crème</couleur> </chat> <chat race="Abyssin">Rominet <couleur>gris</couleur> </chat> </chats> </animaux>
//chat[couleur="crème"]
non retenu
XPa
th
par Philippe Poulard
27
Expressions booléennes dans les prédicats //*[*/@race="Birman"] Test sur un attribut : and
or not() = != < <= > >= ( )
//*[@race!="Birman") and (@race!="Siamois")]
Expressions non booléennes Les prédicats qui retournent des expressions non booléennes sont converties :
Type
Chaîne Ensemble de nœuds Numérique
Résultat Vide Non vide Vide Non vide Numéro du nœud identique Numéro du nœud différent
Valeur Faux Vrai Faux Vrai Vrai Faux //chat[2]
//chat[couleur]
//chat[string(couleur)]
Tous les nœuds peuvent être convertis en chaîne de caractère
Les expressions booléennes peuvent être exprimées avec un jeu de fonctions XPath, comme string(), position(), last()…
/Cours/*[not(self::Titre)]
(suppose que l’attribut existe)
XPa
th
par Philippe Poulard
28
<?xml version="1.0" encoding="ISO-8859-1" ?> <animaux> <chiens> <chien race="Labrador">Mabrouk <couleur>noir</couleur> </chien> <chien race="Labrador">Médor <couleur>marron</couleur> </chien> </chiens> <chats> <chat race="Siamois">Félix <couleur>crème</couleur> </chat> <chat race="Birman">Tom <couleur>crème</couleur> </chat> <chat race="Abyssin">Rominet <couleur>gris</couleur> </chat> </chats> </animaux>
Collections
/ E animaux
E chiens
chats E
text()
race
E
chien
couleur T text()
text() T race
chien
couleur T text()
text() T race
chat
couleur T text()
text() T race
chat
couleur T text()
text() T race
chat
couleur T text()
T @
E
@ E
@ E
@ E
@ E
E
E
E
E
/animaux/*/*[position()=last()]
(/animaux/*/*)[position()=last()]
Les crochets [ et ] ont une priorité plus grande que le slash /, mais on peut aussi utiliser des parenthèses ( et ).
XPa
th
par Philippe Poulard
29
Prédicats composés Syntaxe : axe::test-de-noeud[prédicat][prédicat][prédicat]
Les prédicats sont évalués successivement sur le résultat du précédent.
/ E animaux
E chiens
chats E
text()
race
E
chien
couleur T text()
text() T race
chien
couleur T text()
text() T race
chat
couleur T text()
text() T race
chat
couleur T text()
text() T race
chat
couleur T text()
T @
E
@ E
@ E
@ E
@ E
E
E
E
E //chat[position()=last()][couleur="crème"]
//chat[couleur="crème"][position()=last()]
vide
<?xml version="1.0" encoding="ISO-8859-1" ?> <animaux> <chiens>
…/… <chiens> <chats> <chat race="Siamois">Félix <couleur>crème</couleur> </chat> <chat race="Birman">Tom <couleur>crème</couleur> </chat> <chat race="Abyssin">Rominet <couleur>gris</couleur> </chat> </chats> </animaux>
XPa
th
par Philippe Poulard
30
Fonctions d'ensemble de nœuds XPath position()
/animaux/*[count(*)>2]
count(node-set)
id(string)
last()
local-name(node-set?)
name(node-set?)
namespace-uri(node-set?)
Retourne le nombre de nœuds de l'ensemble de nœuds passé en argument
Retourne les nœuds ayant un ID égal à l'un des mots de la chaîne passée en argument id("ref123 ref456 ref789")
/animaux/*/*[position()=last()]
/animaux/*/*[position()=1]
Retourne le numéro d'index du nœud de référence dans le contexte /animaux/*/*[1] Forme abrégée :
Retourne le nombre de nœuds de l'ensemble de nœuds de référence
//*[name(.)!="svg:rect"]
//*[namespace-uri(.)="http://www.w3.org/2000/svg"]
//*[local-name(.)!="rect"]
Retourne le nom qualifié du premier nœud de l'ensemble de nœuds passé en argument
Retourne la partie locale du nom du premier nœud de l'ensemble de nœuds passé en argument
Retourne l'URI de l'espace de nom du premier nœud de l'ensemble de nœuds passé en argument
/animaux/*/*[last()] ou
XPa
th
par Philippe Poulard
31
Fonctions de chaînes XPath concat(string* ) Retourne la concaténation des chaînes passées en argument
contains(string, string)
normalize-space(string)
starts-with(string, string)
string(object)
string-length(string)
substring(string, number, number?)
substring-after(string, string)
substring-before(string, string)
translate(string, string, string)
Retourne vrai si la deuxième chaîne passée en argument est contenue dans la première chaîne passée en argument
Retourne la chaîne après normalisation des espaces
Retourne vrai si la première chaîne passée en argument commence par la deuxième chaîne passée en argument
Retourne la chaîne correspondante
Retourne la longueur de la chaîne passée en argument
Retourne la partie de la chaîne passée en argument qui commence à la position indiquée par le 2e argument sur la longueur indiquée par le 3e argument
Retourne la partie de la chaîne passée en argument qui suit la première occurrence de la 2e chaîne passée en argument
Retourne la partie de la chaîne passée en argument qui précède la première occurrence de la 2e chaîne passée en argument
Retourne la chaîne passée en 1er argument dont les caractères de la 2e chaîne passée en argument ont été remplacés par ceux de même index de la 3e chaîne passée en argument
XPa
th
par Philippe Poulard
32
Conversion des nœuds en chaînes
string(object) Retourne la chaîne correspondante, en fonction du type :
Tous les nœuds peuvent être convertis en chaîne de caractère
Type de nœud Résultat
Text Comment ProcessingInstruction Attribute Element Document Namespace
La valeur du nœud La valeur du nœud La valeur du nœud La valeur du nœud La concaténation des valeurs de nœuds texte du contenu La concaténation des valeurs de nœuds texte du contenu La valeur du nœud
Il n'y a pas de fonctions uppercase ni lowercase… mais il y a une fonction translate translate("Texte à Casse Mixte","abcdefghijklmnopqrstuvwxyz","ABCDEFGHIJKLMNOPQRSTUVWXYZ")
TEXTE à CASSE MIXTE
Ensemble de nœuds Le premier nœud seulement est converti
string(/animaux/*) retourne Mabrouk noir Médor marron
Mabrouk noir Médor marron Félix crème Tom crème Rominet gris string(/animaux) retourne
…donc :
XPa
th
par Philippe Poulard
33
Fonctions booléennes XPath
boolean(object)
false()
lang(string)
not(boolean)
true()
Type
Chaîne Ensemble de nœuds Numérique
Résultat Vide Non vide Vide Non vide 0 ou NaN ≠0
Valeur Faux Vrai Faux Vrai Faux Vrai
Retourne vrai si la langue passée en argument correspond à la langue du nœud courant. La langue du nœud courant est déterminée par l'attribut xml:lang de ce nœud ou de ses ancêtres. La casse est ignorée. Si l'argument ne contient pas de suffixe (exemple : fr), la comparaison se limite à la langue non suffixée (exemple : fr pour fr-ca).
XPa
th
par Philippe Poulard
34
Fonctions numériques XPath
ceiling(number)
floor(number)
number(object?)
round(number)
sum(node-set)
Retourne l'arrondi supérieur du nombre passé en argument
Retourne l'arrondi inférieur du nombre passé en argument
Retourne le plus proche arrondi du nombre passé en argument
Retourne la somme des nœuds de l'ensemble de nœud passé en argument, après leur conversion numérique
Type Chaîne Booléen Ensemble de nœuds
Conversion Expression numérique Autre Vrai Faux
Contenu selon IEEE 754 NaN 1 0
Converti en chaîne, puis comme ci-dessus
Opérations numériques + - * div mod
Pour -, div et mod, il faut laisser un espace de part et d'autres de l'opérateur
XPa
th
par Philippe Poulard
35
Ordre de parcourt d'un axe XPath
Le sens de parcourt d'un axe est significatif pour certaines opérations.
Tous les axes "remontants" ou "arrières" commencent au plus près du nœud contextuel.
Ainsi, les opérations numériques sur les nœuds sont sensibles au sens de parcours.
Sur un même ensemble de nœud, le premier nœud dans un sens de lecture "arrière" ou "remontant" est le dernier nœud dans un sens de lecture "avant" ou "descendant"
ancestor-or-self::node()[last()] = /*
ancestor-or-self::*[1] = self::*
ancestor::*[1] = parent::*
Corrolaire
preceding-sibling::*[last()] = ../*[1] Est-ce vrai pour tout les nœuds ?
(si le contexte est un élément)
(sauf si on est sur le premier élément ou avant)
XPa
th
par Philippe Poulard
36
Tests sur les nodes
• 2 ensembles de nœuds (nodeset) sont équivalents si la valeur textuelle de l'un de leur nœud est égal • 2 ensembles de nœuds sont différents si la valeur textuelle de l'un de leur nœud est différente
//a/item[2] = //b/item //a/item[2] != //b/item Sont 2 expressions vraies !!!
Les tests d'égalité et d'inégalité sur les nœuds doivent être compris comme des tests sur les ensembles
<?xml version="1.0" encoding="ISO-8859-1"?> <data> <a>
<item>1</item> <item>2</item> <item>3</item> <item>4</item> <item>5</item>
</a> <b>
<item>2</item> <item>3</item> <item>4</item> <item>6</item> <item>7</item>
</b> </data>
Comparaison d'ensembles de nœuds
donnée par la fonction string()
XPa
th
par Philippe Poulard
37
Curiosités
number(x)!=number(x)
x est-il numérique ?
Si est vrai, alors x n'est pas numérique est faux, alors x est numérique
NaN=NaN est faux ! Un test d'égalité avec NaN retourne faux NaN!=NaN est vrai ! Un test d'inégalité avec NaN retourne vrai
XPa
th
par Philippe Poulard
38
Contexte d'évaluation
Contexte
Un nœud contextuel
Une paire d'entiers positifs non nuls Position dans le contexte
Taille du contexte
Un ensemble de variables associées
Une librairie de fonctions
Un ensemble de déclarations d'espace de nommage
Variables
Les expressions XPath peuvent contenir des variables nommées dont les valeurs peuvent être n'importe quel objet. Les variables sont référencées par $var
Contexte
//personnes[ @âge > $âge-du-capitaine ]
L'association de la valeur de la variable à son nom est donnée par le contexte d'évaluation de l'expression
Les applications qui utilisent XPath offrent les moyens nécessaires à la définition de ces variables.
XPa
th
par Philippe Poulard
39
Chaque application qui utilise XPath dispose d'un moyen propre nécessaire à la définition : • des variables • des librairies de fonctions supplémentaires • de la résolution des préfixes
Contexte d'évaluation
//geom:arc[ math:cos( @theta ) > $custom:limit ]/@xlink:href
geom è http://www.foo.com/geometry math è http://www.foo.com/maths xlink è http://www.w3.org/1999/xlink custom è http://www.bar.org/my-ns
( http://www.bar.org/my-ns , limit ) è 0,5 ( http://www.foo.com/maths , pi ) è 3,1415926535 ( null , date ) è 10 juin 1969
( http://www.foo.com/maths , cos ) è cos( ) ( http://www.foo.com/maths , sin ) è sin( ) ( http://www.foo.com/maths , tan ) è tan( ) ( null , ends-with ) è ends-with( )
Variables :
Fonctions :
Espaces de nommage :
contexte
XPa
th
par Philippe Poulard
40
Synthèse
axe::test-de-noeud[prédicat][prédicat][prédicat]
expression XPath
NodeSet
Boolean
String
Number
étape de localisation
chemin de localisation étape/étape/étape
XPa
th
par Philippe Poulard
41
Utilisations • Interpréteur XPath : exemple avec Jaxen
• XSLT
• Active Tags
XPath xpath = new DOMXPath("/foo:bar/@xlink:href", nav); SimpleNamespaceContext nsContext = new SimpleNamespaceContext(); nsContext.addNamespace("foo", "http://www.foo.org/"); nsContext.addNamespace("xlink", "http://www.w3.org/1999/xlink"); xpath.setNamespaceContext(nsContext); List result = contextpath.selectNodes(document);
http://jaxen.org
<xsl:template match="/"> <html> <body> <h1><xsl:value-of select="Cours/Titre"/></h1> <xsl:apply-templates select="Cours/Auteur"/> <xsl:apply-templates select="Cours/Description"/> </body> </html> </xsl:template>
http://ns.inria.org/active-tags
<xcl:active-sheet xmlns:io="http://www.inria.fr/xml/active-tags/io" xmlns:xcl="http://www.inria.fr/xml/active-tags/xcl"> <xcl:parse-stylesheet name="xslt" source="file:///path/to/stylesheet.xsl"/> <xcl:for-each name="file" select="{ io:file('file:///path/to/base/dir/')/*[@io:extension='xml'] }"> <xcl:parse name="document" source="{ $file }" style="stream"/> <xcl:transform source="{ $document }" stylesheet="{ $xslt }" output="file:///path/to/published/{ $file/@io:short-name }.html" /> </xcl:for-each> </xcl:active-sheet>
XPa
th
par Philippe Poulard
42
Et après ?
XML Path Language (XPath) 2.0 http://www.w3.org/TR/xpath20/
XQuery 1.0 and XPath 2.0 Data Model http://www.w3.org/TR/xpath-datamodel/
XQuery 1.0 and XPath 2.0 Functions and Operators http://www.w3.org/TR/xpath-functions/
XQuery 1.0 and XPath 2.0 Formal Semantics http://www.w3.org/TR/xquery-semantics/
XSL Transformations (XSLT) Version 2.0 http://www.w3.org/TR/xslt20/