Ce document est une traduction de la recommandation XML Path Language
(XPath) 1.0 du W3C, datée du 16
novembre 1999. Cette version traduite peut contenir des erreurs
absentes de l'original, dues à la traduction elle-même. La version
originale en anglais, seule normative, se trouve à l'adresse http://www.w3.org/TR/1999/REC-xpath-19991116.
Copyright © 1998 W3C (MIT, INRIA, Keio), tous droits réservés. Les règles du W3C sur la responsabilité, les marques de commerce, les droits d'auteur et les licences de logiciels sont applicables. Notes de traduction: L'entité ISO LATIN I de "oe" ligaturé n'étant pas supportée par certains navigateurs, il sera écrit oe. |
Copyright © 1999 W3C® (MIT, INRIA, Keio), Tous droits réservés. Les règles du W3C sur les droits, marque, utilisation du document et protection des logiciels s'appliquent.
XPath est un langage pour adresser des parties de documents XML, conçu pour être utilisé à la fois par XSLT et XPointer.
La version anglaise de ce document a été contrôlée par des membres du W3C et des représentants de sociétés concernées et a été acceptée par le Directeur comme "Recommandation du W3C". Il s'agit donc d'un document dont le contenu est stable et qui peut être utilisé comme guide de référence ou cité comme référence normative dans d'autres documents. Le rôle du W3C en élevant ce document au niveau d'une Recommandation est d'attirer l'attention sur cette spécification et d'en promouvoir une large diffusion. Ceci augmente les fonctionnalités et les capacités d'intégration du Web.
La liste (en anglais) des erreurs identifiées de la spécification d'origine est disponible à l'adresse : http://www.w3.org/1999/11/REC-xpath-19991116-errata.
Les commentaires sur la version anglaise de cette spécification peuvent être envoyés à www-xpath-comments@w3.org; Des archives des commentaires sont disponibles.
La version anglaise de cette spécification est la seule version officielle de référence. Toutefois, pour les versions traduites, vous pouvez consulter l'adresse http://www.w3.org/Style/XSL/translations.html.
Une liste des Recommandations actuelles du W3C ainsi que d'autres documents techniques sont disponibles à http://www.w3.org/TR.
La version anglaise de cette spécification est le résultat d'un travail commun des groupes de travail sur XSL et XML Linking et fait ainsi partie des travaux du W3C sur les styles et XML.
1 Introduction
2 Chemins de localisation
2.1 Etapes de localisation
2.2 Les directions
2.3 Les tests sur les noeuds
2.4 Les predicats
2.5 Syntaxe abrégée
3 Expressions
3.1 Elémentaires
3.2 Appels de fonctions
3.3 Ensembles de noeuds
3.4 Booléens
3.5 Nombres
3.6 Chaînes de caractères
3.7 Structure lexicale
4 Librairie centrale de fonctions
4.1 Fonctions pour les ensembles de
noeuds
4.2 Fonctions pour les chaînes de
caractères
4.3 Fonctions booléennes
4.4 Fonctions numériques
5 Modèle de données
5.1 Le noeud racine
5.2 Les noeuds
d'éléments
5.2.1 Les identifiants uniques
5.3 Les noeuds
d'attributs
5.4 Les noeuds des
espaces de noms
5.5 Les noeuds des instructions de traitement
5.6 Les noeuds
de commentaires
5.7 Les noeuds
textuels
6 Conformité
A Références
A.1 Références normatives
A.2 Autres Références
B Correspondance avec les espaces d'information de XML
(Non-normatif)
XPath est le résultat d'un effort d'homogénéisation de la syntaxe et de la sémantique de fonctions communes à [XSLT] et [XPointer]. L'objectif premier de XPath est de définir la manière d'adresser des parties d'un document [XML]. En vue de pourvoir à cet objectif premier, cette spécification fournit également les moyens pour traiter des chaînes de caractères, des nombres et des booléens. XPath utilise une syntaxe compacte et non-XML pour faciliter son utilisation dans des URI et des attributs de balises XML. XPath agit sur les structures abstraites et logiques d'un document XML, plutôt que sur sa syntaxe apparente. Le nom XPath vient de l'utilisation d'une écriture de type "chemins d'accès", comme les URL, pour se déplacer à l'intérieur de la structure hiérarchique d'un document XML.
En plus de l'adressage des données, XPath est également conçue pour avoir un sous-ensemble naturel de règles de comparaison (pour tester si un noeud correspond à une forme) ; cette utilisation de XPath est décrite dans XSLT.
XPath représente les documents XML comme un arbre de noeuds. Il y a plusieurs types de noeuds, parmi lesquels les noeuds d'éléments, d'attributs et de texte. XPath fournit un mécanisme pour associer une valeur de type chaîne de caractères à chaque type de noeud. Certains ont également un nom. XPath supporte complètement les espaces de nom XML [Noms XML]. Ainsi, le nom d'un noeud est une paire composée d'une partie locale et d'un espace de noms URI pouvant être nul; elle est appelée nom expansé. Le modèle de données est décrit en détail au chapitre [5 Modèle de données].
La forme syntaxique de base de XPath est l'expression. Une expression répond à la règle de production Expr. Une expression s'applique à 4 types possibles d'objets :
L'évaluation des expressions dépend du contexte. XSLT et XPointer spécifient chacune le contexte pour les expressions XPath qui y sont utilisées. Le contexte peut être :
La position contextuelle est toujours inférieure ou égale à la dimension contextuelle.
Une association de variable consiste en une mise en correspondance entre un nom de variable et une valeur. La valeur d'une variable est un objet qui peut être, soit d'un des types définis pour une expression, soit d'un autre type non spécifié ici.
Une bibliothèque de fonctions permet de définir des associations entre des noms de fonction et des fonctions. Chaque fonction peut avoir zéro ou plusieurs arguments et retourne un seul résultat. Ce document définit une bibliothèque de fonctions de référence que toutes les implémentations de XPath doivent supporter (cf [4 Bibliothèque de fonctions de référence]). Toutes les fonctions de cette bibliothèque ont des arguments et des résultats qui appartiennent à l'un des 4 types d'objets de base. XSLT et XPointer étendent les possibilités de XPath en définissant des fonctions additionnelles; quelques unes agissent sur les 4 types de base, d'autres sur les types additionnels de XSLT et XPointer.
Les déclarations d'espaces de noms associent des préfixes à des espaces de noms d' URI.
Les associations de variables, de fonctions et d'espaces de noms utilisés pour évaluer des sous-expressions sont toujours les mêmes que celles de l'expression englobante. Les noeuds, positions et dimensions contextuels utilisés pour évaluer une sous-expression sont parfois différents de ceux de l'expression englobante. Plusieurs sortes d'expressions changent le noeud contextuel; seuls les prédicats changent les positions et dimensions contextuelles (cf [2.4 Prédicats]). Dans la description de l'évaluation des différentes sortes d'expressions, il est explicitement fait état des changements de positions, dimensions et noeuds contextuels dans les sous-expressions; si rien n'est spécifié, c'est qu'ils restent inchangés.
Des expressions XPath sont souvent utilisées dans des attributs XML. La
grammaire spécifiée dans cette section est compatible avec celle applicable
aux valeurs d'attributs telle que définie à partir de la version 1.0 de la
norme XML. Ainsi, par exemple, si la grammaire utilise le caractère
<
, celui-ci ne doit pas apparaître dans l'instance XML tel
quel, mais sous une forme conforme aux règles de XML 1.0, par exemple, en
utilisant l'entité caractère <
. A l'intérieur des
expressions, les chaînes de texte littéral sont délimitées par de simples ou
doubles cotes, qui délimitent également les valeurs d'attributs XML. Pour
éviter la confusion, les entités caractères correspondantes peuvent être
utilisées ("
ou '
). Il est
également possible d'utiliser alternativement les caractères ' et " pour
délimiter respectivement la valeur de l'attribut et le texte littéral des
expressions XPath.
Une expression particulièrement importante est le chemin de localisation. Celle-ci sélectionne un ensemble de noeuds relativement à un noeud de contexte dit noeud contextuel. Le résultat de l'évaluation d'une telle expression est l'ensemble des noeuds ciblés par le chemin de localisation. Les chemins de localisation peuvent contenir des expressions récursives de filtrage des noeuds. Un chemin de localisation doit être conforme à la règle de production des chemins de localisation.
Dans la grammaire qui suit, les termes nom qualifié (QName) et nom sans deux points (NCName) sont définis dans [XML Names], et S est défini dans [XML]. La grammaire utilise la même notation EBNF que [XML] (exception faite des symboles qui ont toujours leur initiale en lettre capitale).
La validation lexico-syntaxique des expressions commence par le découpage de la chaîne de caractères en unités lexicales; ensuite, la validation à proprement parler est faite sur ces unités lexicales. Les espaces blancs peuvent être utilisés librement entre les unités lexicales. Le processus de reconnaissance des unités lexicales est décrit au chapitre [3.7 Structure lexical].
Bien que les chemins de localisation ne soient pas le cas le plus général de construction grammaticale du langage (un Chemin de localisation est un cas particulier d'un Expr), ils n'en sont pas moins les constructions les plus importantes et seront, de ce fait, décrits en premier.
Chaque chemin de localisation peut être exprimé en utilisant une syntaxe directe mais plutôt verbeuse. Il existe également un certain nombre d'abréviations syntaxiques permettant d'exprimer les cas les plus courants de manière concise. Cette section explique la sémantique des chemins de localisation en utilisant une syntaxe non-abrégée. La syntaxe abrégée sera ensuite expliquée en montrant comment elle se développe en syntaxe non-abrégée (cf [2.5 Syntaxe abrégée]).
Ci-après sont présentés quelques exemples de chemins de localisation utilisant une syntaxe non-abrégée :
child::para
sélectionne l'élémentpara
enfant du noeud contextuel
child::*
sélectionne tous les éléments enfant du noeud contextuel
child::text()
sélectionne tous les noeuds textuels du noeud contextuel
child::node()
sélectionne tous les enfants du noeud contextuel, quelque soit leur type
attribute::name
sélectionne l'attributname
du noeud contextuel
attribute::*
sélectionne tous les attributs du noeud contextuel
descendant::para
sélectionne tous les descendantspara
du noeud contextuel
ancestor::div
sélectionne tous les ancêtresdiv
du noeud contextuel
ancestor-or-self::div
sélectionne tous les ancêtresdiv
du noeud contextuel et le noeud contextuel lui-même si c'est undiv
descendant-or-self::para
sélectionne tous les descendantspara
du noeud contextuel et le noeud contextuel lui-même si c'est unpara
self::para
sélectionne le noeud contextuel si c'est un élémentpara
, et rien dans le cas contraire
child::chapter/descendant::para
sélectionne les descendantspara
de l'elementchapitre
enfant du noeud contextuel
child::*/child::para
sélectionne tous les petits enfantspara
du noeud contextuel
/
sélectionne la racine du document (qui est toujours le parent de l'élément document)
/descendant::para
sélectionne tous les élémentspara
descendants du document contenant le noeud contextuel
/descendant::olist/child::item
sélectionne tous les élémentsitem
qui ont un parentolist
et qui sont dans le même document que le noeud contextuel
child::para[position()=1]
sélectionne le premier enfantpara
du noeud contextuel
child::para[position()=last()]
sélectionne le dernier enfantpara
du noeud contextuel
child::para[position()=last()-1]
sélectionne l'avant dernierpara
enfant du noeud contextuel
child::para[position()>1]
sélectionne tous les enfantspara
du noeud contextuel autres que le premier
following-sibling::chapter[position()=1]
sélectionne le prochainchapter
cible du noeud contextuel
preceding-sibling::chapter[position()=1]
sélectionne le précédentchapter
cible du noeud contextuel
/descendant::figure[position()=42]
sélectionne le 42ième élémentfigure
du document
/child::doc/child::chapter[position()=5]/child::section[position()=2]
sélectionne la 2ième section du 5ième élémentchapter
de l'élémentdoc
du document
child::para[attribute::type="warning"]
sélectionne tous les enfantspara
du noeud contextuel qui ont un attributtype
dont la valeur estwarning
child::para[attribute::type='warning'][position()=5]
sélectionne le 5ième enfantpara
du noeud contextuel qui a un attributtype
dont la valeur estwarning
child::para[position()=5][attribute::type="warning"]
sélectionne le 5ième enfantpara
du noeud contextuel si celui-là a un attributtype
de valeurwarning
child::chapter[child::title='Introduction']
sélectionne l'enfantchapter
du noeud contextuel qui a un ou plus enfanttitle
avec un contenu textuel égal à 'Introduction
'
child::chapter[child::title]
sélectionne l'enfantchapter
du noeud contextuel qui a un ou plus enfanttitle
child::*[self::chapter or self::appendix]
sélectionne tous les enfantschapter
etappendix du
noeud contextuel
child::*[self::chapter or self::appendix][position()=last()]
sélectionne le dernier enfantchapter
ouappendix
du noeud contextuel
Il y a 2 types de chemins de localisation : relatifs et absolus.
Un chemin relatif consiste en une séquence d'une ou plusieurs étapes
séparées par le caractère /. Les étapes sont assemblées de gauche à droite.
Chacune à leur tour, les étapes sélectionnent un ensemble de noeuds
relativement au noeud contextuel. Une séquence initiale d'étapes et composée
avec une suivante comme suit : la séquence initiale sélectionne un certain
nombre de noeuds qui sont utilisés un par un comme noeud contextuel de la
prochaine étape. Les ensembles des noeuds identifiés par cette étape sont
ensuite réunis. Par exemple : child::div/child::para
sélectionne
les éléments enfant para
de l'élément div enfant du noeud
contextuel, ou, en d'autres termes, les petits-enfants para qui ont div comme
parents.
Un chemin absolu consiste en un /
optionnellement suivi d'un
chemin relatif. Un /
par lui-même sélectionne le noeud racine du
document contenant le noeud contextuel. S'il est suivi d'un chemin relatif,
alors le chemin de localisation sélectionne l'ensemble des noeuds qui seraient
sélectionnés par le chemin relatif s'appliquant au noeud racine du document
contenant le noeud contextuel.
[1] | LocationPath | ::= | RelativeLocationPath |
| AbsoluteLocationPath | |||
[2] | AbsoluteLocationPath | ::= | '/' RelativeLocationPath? |
| AbbreviatedAbsoluteLocationPath | |||
[3] | RelativeLocationPath | ::= | Step |
| RelativeLocationPath '/' Step | |||
| AbbreviatedRelativeLocationPath |
Une étape de localisation se fait en 3 temps :
un axe, qui spécifie le type de relation arborescente (ndlr : c'est à dire le sens de recherche) entre le noeud contextuel et les noeuds à localiser.
un noeud de test, qui spécifie le type du noeud et le nom expansé des noeuds obtenus par l'étape de localisation
0 ou n prédicats, qui sont des expressions arbitraires pour raffiner l'ensemble des noeuds obtenus par l'étape de localisation.
La syntaxe d'une étape de localisation est le nom de l'axe et le noeud de
test séparés d'un point-virgule (;), suivi de 0 ou n expresions repérées par
des crochets. Par exemple, dans child::para[position()=1]
,
child
est le nom de l'axe, para le noeud de test et
[position()=1]
est un prédicat.
L'ensemble de noeuds obtenu par l'étape de localisation résulte d'une première génération d'un ensemble de noeuds par rapport à l'axe et le noeud de test puis par filtrage successif de ce résultat par les prédicats.
L'ensemble de noeuds initial contient les noeuds dont la relation au noeud
contextuel est conforme à celle spécifiée par l'axe, et ayant le type et le nom expansé spécifié par le test. Par exemple,
l'étape de localisation descendant::para
sélectionne les éléments
para
descendants du noeud contextuel : descendant
spécifie que chaque noeud de l'ensemble initial doit être un descendant du
noeud contextuel; para
spécifie que chaque noeud de l'ensemble
initial doit être un élément appelé para. Les axes disponibles sont décrits au
chapitre [2.2 Axes]. Les tests de noeuds
disponibles sont décrits dans la section [2.3 Tests
sur les noeuds]. La signification de certains tests de noeuds dépend
de l'axe.
L'ensemble initial de noeuds est filtré d'après le 1er prédicat pour générer un nouvel ensemble de noeuds, lui-même filtré par le second prédicat etc... L'ensemble final est celui qui résulte de l'étape de localisation. L'axe affecte la manière dont l'expression de chaque prédicat est évalué; aussi, la sémantique d'un prédicat est définie par rapport à un axe. Reportez-vous à la section [2.4 Prédicats].
[4] | Step | ::= | AxisSpecifierNodeTestPredicate* | |
| AbbreviatedStep | ||||
[5] | AxisSpecifier | ::= | AxisName '::' | |
| AbbreviatedAxisSpecifier |
Les axes suivants sont disponibles :
l'axe enfant (
child)
contient les enfants directs du noeud contextuell'axe descendant (
descendant
) contient les descendants du noeud contextuel; un descendant est un enfant ou un petit enfant etc... Aussi, l'axedescendant
ne contient jamais de noeud de typeattribut
ou desnoms d'espace
.l'axe parent (
parent
) contient le parent du noeud contextuel, s'il y en a unl'axe ancêtre (
ancestor)
contient les ancêtres du noeud contextuel; cela comprend son parent et les parents des parents etc... Aussi, cet axe contient toujours le noeud racine, sauf si le noeud contextuel est lui-même la racine.l'axe cible suivante (
following-sibling)
contient tous les noeuds cibles du noeud contextuel; si celui-là est un attribut ou un espace de noms, le suivant ciblé est vide.l'axe cible précédente (
preceding-sibling)
contient tous les prédécesseurs du noeud contextuel; si le noeud contextuel est un attribut ou un espace de noms, lacible précédente
est vide.l'axe suivant (
following)
tous les noeuds du même document que le noeud contextuel qui sont après le noeud contextuel dans l'ordre du document, à l'exclusion de tout descendant, des attributs et des espaces de noms.l'axe précédent (
preceding)
contient tous les noeuds du même document que le noeud contextuel, qui sont avant lui dans l'ordre du document, à l'exclusion de tout ancêtre, des attributs et des espaces de noms.l'axe attribut (
attribute)
contient les attributs du noeud contextuel; l'axe est vide quand le noeud n'est pas un élémentl'axe des espaces de noms (
namespace)
contient les noeuds des espaces de noms du noeud contextuel; l'axe est vide quand le noeud contextuel n'est pas un élément.l'axe réflexif (
self)
contient seulement le noeud contextuell'axe descendant-ou-réflexif (
descendant-or-self)
contient le noeud contextuel et ses descendants.l'axe ancêtres-ou-réflexif (
ancestor-or-self)
contient le noeud contextuel et ses ancêtres; aussi, cet axe contiendra toujours le noeud racine.NOTE : les axes ancêtre, descendant, suivant, précédent et réflexif partitionnent un document (en ignorant les noeuds d'attributs et ceux des espaces de noms) : ils ne se recouvrent pas les uns les autres et, à eux tous, contiennent tous les noeuds d'un document.
Chaque axe a un type de noeud principal. Si un axe peut contenir des éléments, alors le type principal des noeuds est un élément; sinon, c'est le type des noeuds que l'axe peut contenir, soit :
Pour l'axe des attributs, le type principal des noeuds est le type
attribute
.Pour l'axe des espaces de noms, le type principal des noeuds est le type
namespace
.Pour les autres axes, le type principal est
element
.
Un test de noeud qui est un nom qualifié est vrai
si et seulement si le type du noeud testé (cf [5
Modèle de données]) est le type principal et s'il a un nom expansé égal au nom expansé spécifié par le nom qualifié . Par
exemple, child::para
sélectionne les éléments enfants
para
du noeud contextuel; si celui-là n'a pas d'enfant
para
, la sélection sera un ensemble vide de noeuds.
attribute::href
sélectionne l'attribut href
du noeud
contextuel; s'il n'a pas d'attribut href
, la sélection sera un
ensemble vide de noeuds.
Un nom qualifié
dans le test du noeud est expansé en un nom
expansé en utilisant la déclaration de l'espace de noms qui provient du
contexte de l'expression. C'est le même type d'expansion que celle faite sur
les noms de types d'éléments dans les balises de début et de fin excepté que
l'espace de noms par défaut déclaré avec xmlns
n'est pas utilisé
: si le nom qualifié
n'a pas de préfixe, alors l'espace de noms URI est nul (les noms d'attributs
sont expansés de la même manière). Une erreur est générée si le nom qualifié a un
préfixe qui n'a pas de déclaration de l'espace de noms dans le contexte de
l'expression.
Un test de noeud *
est vrai pour n'importe quel noeud du type
du noeud principal. Par exemple, child::*
sélectionnera tous les
éléments enfants du noeud contextuel, et attribute::*
sélectionnera tous les attributs du noeud contextuel.
Un test de noeud peut prendre la forme NCName:*
.
Dans ce cas, le préfixe est expansé de la même manière que le nom qualifié , en
utilisant les déclarations des espaces de noms du contexte. Une erreur est
générée si aucune déclaration de l'espace de noms n'est trouvée dans le
contexte pour le préfixe. Le test de noeud est vrai pour tout noeud du type
principal dont le nom expansé a l'espace de
noms URI auquel le préfixe s'étend, indépendamment de la partie locale du
nom.
Le test de noeud text()
est vrai pour tout noeud textuel. Par
exemple, child::text()
sélectionnera les noeuds textuels enfants
du noeud contextuel. De manière similaire, le test de noeud
comment()
est vrai pour tout noeud de type
comentaire
(comment)
, et le test
processing-instruction()
est vrai pour toute instruction de
traitement (processing instruction
). Le test
processing-instruction()
peut avoir un argument de type Literal; dans ce cas, il est vrai pour toute
instruction de traitement qui a un nom égal à la valeur de ce Literal.
Un test de noeud node()
est vrai pour tout noeud quelqu'en
soit le type.
[7] | NodeTest | ::= | NameTest | |
| NodeType '(' ')' | ||||
| 'processing-instruction' '(' Literal ')' |
Un axe est orienté soit vers l'avant soit vers l'arrière. Un axe qui ne
fait que contenir le noeud contextuel ou ses suivants dans le sens du document est un axe vers l'avant
(forward axis
). Un axe qui ne fait que contenir le noeud
contextuel et ses prédécesseurs dans le sens du
document est un axe vers l'arrière (reverse axis
) Ainsi, les
axes de type ancêtre (ancestor
), ancêtre-ou-réflexif
(ancestor-or-self
), précédent (preceding
), et cible
précédente (preceding-sibling
) sont vers l'arrière (reverse
axes
); Tous les autres axes sont vers l'avant. Comme l'axe réfléchi
contient au plus un noeud, le sens ne fait aucune différence. La position de proximité d'un noeud,
dans un ensemble de noeuds, relativement à un axe de parcours, est définie
comme étant la position du noeud dans l'ensemble ordonné de noeuds vers
l'avant du document si le sens est vers l'avant (forward axis
)
et l'inverse (reverse axis
) si le sens est vers l'arrière. La
première position est 1.
Un prédicat filtre un ensemble de noeuds, relativement à un axe de parcours, de manière à produire un nouvel ensemble de noeuds. Pour chaque noeud de l'ensemble à filtrer, l'expression du prédicat (PredicateExpr) est évaluée en utilisant le noeud comme noeud contextuel, le nombre de noeud de l'ensemble comme dimension contextuelle et la position de proximité (proximity position) du noeud dans l'ensemble comme position contextuelle; si l'expression du prédicat (PredicateExpr) est vraie pour un noeud, il est inclu dans le nouvel ensemble, sinon il est rejeté.
Une expression de prédicat (PredicateExpr)
est exécutée en évaluant l'expression (Expr) puis en
convertissant le résultat en booléen. Si le résultat est un nombre, le
résultat sera vrai si le nombre est égal à la position contextuelle et sera
faux dans le cas contraire; si le résultat n'est pas un nombre, alors la
valeur sera identique à celle qui aurait été générée par la fonction boolean. Ainsi, le chemin de localisation
para[3]
est équivalent à para[position()=3]
.
[8] | Predicate | ::= | '[' PredicateExpr ']' | |
[9] | PredicateExpr | ::= | Expr |
Les quelques exemples suivants utilisent la syntaxe abrégée :
para
sélectionne les éléments enfantspara
du noeud contextuel
*
sélectionne tous les enfants du noeud contextuel
text()
sélectionne tous les noeuds enfants de type textuels du noeud contextuel
@name
sélectionne l'attributname
du noeud contextuel
@*
sélectionne tous les attributs du noeud contextuel
para[1]
sélectionne le premier enfantpara
du noeud contextuel
para[last()]
sélectionne le dernier enfantpara
du noeud contextuel
*/para
sélectionne tous les petits enfantspara
du noeud contextuel
/doc/chapter[5]/section[2]
sélectionne la 2ièmesection
du 5ièmechapter
dedoc
chapter//para
sélectionne les descendantspara
des enfantschapter
du noeud contextuel
//para
sélectionne tous les descendantspara
de la racine du document et donc, sélectionne tous les élémentspara
du document contenant le noeud contextuel
//olist/item
sélectionne tous les élémentsitem
ayant pour parentolist
dans le document qui contient le noeud contextuel
.
sélectionne le noeud contextuel
.//para
sélectionne les descendantspara
du noeud contextuel
..
sélectionne le parent du noeud contextuel
../@lang
sélectionne l'attributlang
du parent du noeud contextuel
para[@type="warning"]
sélectionne tous les enfantspara
du noeud contextuel qui ont un attributtype
ayant la valeurwarning
para[@type="warning"][5]
sélectionne le 5ième enfantpara
du noeud contextuel qui ont un attributtype
ayant la valeurwarning
para[5][@type="warning"]
sélectionne le 5ième enfantpara
du noeud contextuel si celui-là a un attributtype
dont la valeur estwarning
chapter[title="Introduction"]
sélectionne les enfantschapter
du noeud contextuel qui ont au moins un enfanttitle
dont le contenu textuel (string-value) estIntroduction
chapter[title]
sélectionne les enfantschapter
du noeud contextuel qui ont au moins un enfanttitle
employee[@secretary and @assistant]
sélectionne tous les enfantsemployee
du noeud contextuel qui ont simultanément les attributssecretary
etassistant
L'abréviation la plus importante est que child::
peut être
omis dans un chemin de localisation. En effet, child
est l'axe
par défaut. Par exemple, un chemin de localisation div/para
est
un raccourci pour child::div/child::para
.
Il en est de même pour les attributs : attribute::
peut être
abrégé en @
. Par exemple, le chemin de localisation
para[@type="warning"]
est un raccourci pour
child::para[attribute::type="warning"]
qui sélectionne les
enfants para
ayant un attribut type
dont la valeur
est warning
.
//
est un raccourci pour
/descendant-or-self::node()/
. Par exemple, //para
est une forme raccourcie de
/descendant-or-self::node()/child::para
qui sélectionne tout
élément para
du document (même l'élément para
qui
serait le 1er élément du document sera sélectionné par //para
puisque le noeud élément du document lui-même est un enfant du noeud racine);
div//para
est un raccourci pour
div/descendant-or-self::node()/child::para
qui sélectionne tous
les descendants para
des enfants div
.
NOTE : Le chemin de localisation
//para[1]
n'est pas équivalent à/descendant::para[1]
. La deuxième expression sélectionne le premier élément descendantpara
tandis que le premier sélectionne tous les élémentspara
descendants qui sont les premiers élémentspara
de leurs parents.
Le signe .
est utilisé comme raccourci de
self::node()
. Cette écriture est particulièrement utile quand
elle est combinée avec //
. Par exemple, le chemin
.//para
est un raccourci de
self::node()/descendant-or-self::node()/child::para
et sélectionne tous les éléments para
descendants du noeud
contextuel.
De la même manière, l'écriture ..
est un raccourci du chemin
de localisation parent::node()
. Par exemple,
../title
est le raccourci de
parent::node()/child::title
qui sélectionne les enfants
title
de l'élément parent du noeud contextuel.
[10] | AbbreviatedAbsoluteLocationPath | ::= | '//' RelativeLocationPath | |
[11] | AbbreviatedRelativeLocationPath | ::= | RelativeLocationPath '//' Step | |
[12] | AbbreviatedStep | ::= | '.' | |
| '..' | ||||
[13] | AbbreviatedAxisSpecifier | ::= | '@'? |
L'expression VariableReference prend la valeur associée au nom de la variable dans l'ensemble des attributions de variables du contexte. Une erreur est produite si le nom de la variable n'est pas associé à une quelconque valeur dans le contexte de l'expression.
Les parenthèses peuvent être utilisées pour faire des regroupements.
[14] | Expr | ::= | OrExpr | |
[15] | PrimaryExpr | ::= | VariableReference | |
| '(' Expr ')' | ||||
| Literal | ||||
| Number | ||||
| FunctionCall |
L'expression FunctionCall est évaluée en utilisant FunctionName pour identifier une fonction dans l'évaluation de l'expression par rapport à une bibliothèque contextuelle de fonctions, évaluant chaque Argument, convertissant chacun dans le type requis par la fonction, et finalement appelant la fonction en lui passant les arguments convertis. Une erreur est produite si le nombre des arguments est incorrect ou si un argument ne peut pas être converti dans le type requis. La valeur retournée par l'expression FunctionCall est celle produite par la fonction.
Un argument est converti en chaîne de caractères comme avec la fonction
string. Un argument est converti en un
type numérique comme avec la fonction number. Un argument est converti en un type
booléen comme avec la fonction boolean.
Un argument qui n'est pas un type de l'ensemble des noeuds ne peut pas être
converti.
[16] | FunctionCall | ::= | FunctionName '(' ( Argument ( ',' Argument )* )? ')' | |
[17] | Argument | ::= | Expr |
Un chemin de localisation peut être utilisé comme expression. Dans ce cas, cette expression retourne l'ensemble de noeuds sélectionné par le chemin.
L'opérateur |
calcule l'union de ses opérandes, qui doivent
être des ensembles de noeuds.
Les Prédicats de filtrage sont utilisés de la
même manière pour filtrer les expressions que pour filtrer les chemins de
localisation. Une erreur est générée si l'expression à filtrer n'est pas
appliquée à un ensemble de noeuds. Un Prédicat
filtre l'ensemble de noeuds dans le sens de l'axe child
.
NOTE : La signification d'un Prédicat dépend fondamentalement de l'axe sur lequel on l'applique. Par exemple,
preceding::foo[1]
retourne le 1er élémentfoo
dans le sens inverse du document parce que l'axe appliqué à[1]
est précédent (preceding
); par opposition,(preceding::foo)[1]
retourne le premier élémentfoo
dans le sens de lecture du document, parce que l'axe qui s'applique au prédicat[1]
est l'axe enfant (child
).
Les opérateurs /
et //
peuvent intervenir dans
des expressions et comme indicateurs de chemins de localisation relatifs. Une
erreur est produite si l'expression ne retourne pas un ensemble de noeuds. En
ce qui concerne le signe /, il se comporte de la même manière, qu'il soit
utilisé comme opérateur ou comme chemin de localisation. Comme pour les
chemins de localisation, //
est le raccourci de
/descendant-or-self::node()/
.
Il n'existe aucun type d'objet pouvant être converti en ensemble de noeuds
[18] | UnionExpr | ::= | PathExpr | |
| UnionExpr '|' PathExpr | ||||
[19] | PathExpr | ::= | LocationPath | |
| FilterExpr | ||||
| FilterExpr '/' RelativeLocationPath | ||||
| FilterExpr '//' RelativeLocationPath | ||||
[20] | FilterExpr | ::= | PrimaryExpr | |
| FilterExprPredicate |
Un objet de type booléen peut prendre 2 valeurs : vrai (true
)
ou faux (false
).
L'expression ou (or)
est évaluée en convertissant chaque
opérande en une valeur booléenne comme si la fonction boolean était utilisée. Le résultat est vrai
si l'un ou l'autre des opérandes est vrai, le résultat est faux dans tous les
autres cas. L'opérande de droite n'est pas évalué si celui de gauche est
vrai.
L'expression et (and)
est évaluée en convertissant chaque
opérande en un booléen comme si la fonction boolean était utilisée. Le résultat est vrai
si les deux opérandes prennent la même valeur vrai, il est faux dans tous les
autres cas. L'opérande de droite n'est pas évalué si celui de gauche est
faux.
L'expression d'égalité EqualityExpr (qui
n'est pas simplement une expression de relation RelationalExpr) ou l'expression de relation RelationalExpr (qui n'est pas simplement une
expression d'addition AdditiveExpr) est évaluée
en comparant les objets qui résultent de l'évaluation des 2 opérandes. Cette
comparaison est définie dans les 3 prochains paragraphes. En premier, les
comparaisons appliquées à des ensembles de noeuds mais qui seront exprimées
dans des termes non-spécifiques aux ensembles de noeuds; cela est fait pour
les opérateurs =
, !=
, <=
,
<
, >=
et >
. Ensuite, sont
décrits les opérateurs pour les cas qui ne s'appliquent pas aux ensembles de
noeuds : les cas =
et!=
dans le 2ième paragraphe et
les cas <=
, <
, >=
et
>
dans le 3ième paragraphe.
Si les deux objets à comparer sont des ensembles de noeuds, alors la comparaison ne sera vraie que si et seulement s'il y a un noeud dans chacun des deux ensembles qui satisfassent à la condition de comparaison de type string-values. Si l'un des objets à comparer est un ensemble de noeuds et l'autre est un nombre, alors la comparaison sera vraie si et seulement s'il existe un noeud de l'ensemble de noeuds tel que le résultat de la comparaison entre le nombre à comparer et le résultat de la conversion de son contenu textuel obtenu par string-value en un nombre par l'utilisation de la fonction number est vraie. Si l'un des objets à comparer est un ensemble de noeuds et l'autre une chaîne de caractères, alors la comparaison est vraie si et seulement s'il existe un noeud de l'ensemble des noeuds tel que le résultat de la comparaison de son contenu textuel obtenu par string-value et la chaîne de caractères est vraie. Si l'un des objets est un ensemble de noeuds et l'autre un booléen, alors la comparaison sera vraie si et seulement si le résultat de la comparaison entre le booléen et le résultat de la conversion de l'ensemble de noeuds en booléen avec la fonction boolean est vrai.
Quand aucun des objets à comparer n'est un ensemble de noeuds et que
l'opérateur est =
ou !=
, alors la comparaison entre
les objets se fait après les avoir convertis dans un type commun. Si au moins
un des objets à comparer est un booléen, alors chaque objet à comparer est
converti en booléen de même manière que si la fonction boolean était appliquée. Autrement, si au
moins un des objets est un nombre, alors chaque objet à comparer est converti
en nombre de la manière que si la fonction number leur était appliquée. Autrement, les
deux objets à comparer sont convertis en chaînes de caractères comme avec si
la fonction string était appliquée.
L'égalité =
sera vraie si et seulement si les objets sont égaux,
l'inégalité !=
sera vraie si et seulement si les objets sont
différents. Les nombres sont comparés conformément à la norme IEEE 754 [IEEE 754]. Deux booléens sont égaux si et seulement s'ils sont tous les deux vrais ou faux. Deux chaînes sont égales si et seulement
si elles sont composées d'une même séquence de caractères UCS.
NOTE : si
$x
représente un ensemble de noeuds, alors$x="foo"
ne signifie pas la même chose quenot($x!="foo")
: la première expression est vraie si et seulement si l'un quelconque (n'importe lequel) des noeuds de$x
a la valeur textuelfoo
; la deuxième est vraie si et seulement si tous les noeuds de$x
ont comme valeur textuellefoo
.
Quand aucun des objets est un ensemble de noeuds et que l'opérateur est
<=
, <
, >=
ou
>
, alors la comparaison entre les objets se fait après les
avoir convertis en nombre et en comparant ces nombres conformément à la norme
IEEE 754. La comparaison d'infériorité <
sera vraie si et
seulement si le premier nombre est inférieur au deuxième. L'inégalité
<=
sera vraie si et seulement si le premier nombre est
inférieur ou égal au deuxième. La comparaison de supériorité >
sera vraie si et seulement si le premier nombre est supérieur au deuxième.
L'inégalité >=
sera vraie si et seulement si le premier nombre
est supérieurs ou égal au deuxième.
NOTE : Quand une expression XPath est écrite dans un document XML, tous les signes
<
et les opérateurs<=
doivent être protégés conformément aux règles de la norme XML 1.0 en utilisant, par exemple<
et<=
. Dans l'exemple suivant, la valeur de l'attributtest
est une expression XPath :<xsl:if test="@value < 10">...</xsl:if>
[21] | OrExpr | ::= | AndExpr | |
| OrExpr 'or' AndExpr | ||||
[22] | AndExpr | ::= | EqualityExpr | |
| AndExpr 'and' EqualityExpr | ||||
[23] | EqualityExpr | ::= | RelationalExpr | |
| EqualityExpr '=' RelationalExpr | ||||
| EqualityExpr '!=' RelationalExpr | ||||
[24] | RelationalExpr | ::= | AdditiveExpr | |
| RelationalExpr '<' AdditiveExpr | ||||
| RelationalExpr '>' AdditiveExpr | ||||
| RelationalExpr '<=' AdditiveExpr | ||||
| RelationalExpr '>=' AdditiveExpr |
NOTE : L'effet de la grammaire ci-dessus est que l'ordre de préséance est (en commençant par le niveau de préséance le plus faible) :
ou
et
=
,!=
<=
,<
,>=
,>
et que les opérateurs sont associatifs par la gauche. Par exemple,
3 > 2 > 1
équivaut à(3 > 2) > 1
, dont le résultat est faux.
Les nombres sont des nombres flottants. Un nombre peut prendre n'importe quelle valeur d'un réel , double précision sur 64 bits, conforme à la notation de la norme IEEE 754 [IEEE 754]. Cela inclue une valeur spéciale "Not-a-Number" (NaN), l'infini positif et négatif, le zéro positif et le zéro négatif. Se reporter à la Section 4.2.3 de [JLS] pour un résumé des règles principales du standard IEEE 754.
Les opérateurs numériques convertissent leurs opérandes en nombres de la même manière que la fonction number.
L'opérateur +
représente l'addition.
L'opérateur -
représente la soustraction.
NOTE : Puisque XML autorise l'utilisation du signe
-
dans les noms, l'opérateur de soustraction doit typiquement être précédé d'un espace blanc. Par exemple,foo-bar
représente un ensemble de noeuds contenant l'élément enfantfoo-bar
;foo - bar
représente la soustraction des résultats de l'évaluation du contenu textuel des élémentsfoo
etbar
par la fonction string-value.
L'opérateur div
représente une division de nombres à virgule
flottante conforme à l'IEEE 754.
L'opérateur mod
retourne le reste d'une division entière dont
le dividende est le deuxième opérande de l'opérateur mod
. Par
exemple,
5 mod 2
retourne1
5 mod -2
retourne1
-5 mod 2
retourne-1
-5 mod -2
retourne-1
NOTE :Cela est la même chose que l'opérateur %
de Java
et ECMAScript.
NOTE :Mais cela est différent du calcul du reste de l'IEEE 754, qui retourne le reste d'une division arrondie.
[25] | AdditiveExpr | ::= | MultiplicativeExpr | |
| AdditiveExpr '+' MultiplicativeExpr | ||||
| AdditiveExpr '-' MultiplicativeExpr | ||||
[26] | MultiplicativeExpr | ::= | UnaryExpr | |
| MultiplicativeExprMultiplyOperatorUnaryExpr | ||||
| MultiplicativeExpr 'div' UnaryExpr | ||||
| MultiplicativeExpr 'mod' UnaryExpr | ||||
[27] | UnaryExpr | ::= | UnionExpr | |
| '-' UnaryExpr |
Les chaînes de caractères sont une suite de 0 ou n caractères, dans lesquelles un caractère a la même définition que dans la recommandation XML [XML]. Un caractère de XPath correspond donc à un seul caractère abstrait Unicode et une seule valeur scalaire Unicode (cf [Unicode]); Cela est différent d'une valeur codée Unicode 16-bit : la représentation codée d'un caractère en Unicode pour un caractère abstrait dont la valeur scalaire est supérieure à U+FFFF est une paire de deux valeurs codées sur 16 bits (une paire surrogate). Dans de nombreux langages de programmation, une chaîne de caractères est représentée par une séquence de valeurs Unicode codées sur 16-bit; les implementations de XPath dans ces langages doit faire attention qu'une paire "surrogate" soit correctement traitée comme un simple caractère XPath.
NOTE : Il est possible dans Unicode d'avoir 2 chaînes traitées de manière identique même si elles sont constituées de 2 séquences distinctes de caractères abstraits Unicode. Par exemple, quelques caractères accentués ont deux représentations possibles : une forme pré-composée et une forme décomposée (decomposed). Il s'en suit que les expressions XPath peuvent retourner des résultats inattendus sauf si les caractères des expressions XPath ainsi que du document XML aient été préalablement canonisés (cf [Character Model]).
Au cours de la lecture des unités lexicales valides, c'est toujours l'unité lexicale la plus longue qui est renvoyée.
Pour des questions de lisibilité, les espaces blancs peuvent être utilisés dans les expressions même s' ils ne sont pas implicitement autorisés par la grammaire : l'expression ExprWhitespace peut être librement rajoutée dans les "patterns" avant ou après toute expression ExprToken.
Les règles spéciales de découpage en unités lexicales suivantes doivent être appliquées dans l'ordre précisé pour supprimer les ambiguïtés de la grammaire de l'expression ExprToken :
S' il existe une unité lexicale précédente et si celle-là ne fait pas partie de la famille des signes suivants
@
,::
,(
,[
,,
ou d'un Opérateur, alors le caractère*
doit être identifié comme le signe de la multiplication (MultiplyOperator) et un NCName doit être reconnu comme étant un nom d'opérateur (OperatorName).Si le caractère suivant un NCName (potentiellement séparé par des blancs de type ExprWhitespace) est
(
, alors l'unité lexicale doit être reconnue comme un type de noeud (NodeType) ou un nom de fonction (FunctionName).Si les deux caractères qui suivent un nom NCN (NCName) (potentiellement séparés par des blancs de type ExprWhitespace) sont
::
, alors l'unité lexicale doit être reconnue comme un nom d'axe (AxisName).Dans les autres cas, l'unité lexicale doit être reconnue comme un opérateur de multiplication (MultiplyOperator), un nom d'opérateur (OperatorName), un type de noeud (NodeType), un nom de fonction (FunctionName), ou un nom d'axe (AxisName).
[28] | ExprToken | ::= | '(' | ')' | '[' | ']' | '.' | '..' | '@' | ',' | '::' | |
| NameTest | ||||
| NodeType | ||||
| Operator | ||||
| FunctionName | ||||
| AxisName | ||||
| Literal | ||||
| Number | ||||
| VariableReference | ||||
[29] | Literal | ::= | '"' [^"]* '"' | |
| "'" [^']* "'" | ||||
[30] | Number | ::= | Digits ('.' Digits?)? | |
| '.' Digits | ||||
[31] | Digits | ::= | [0-9]+ | |
[32] | Operator | ::= | OperatorName | |
| MultiplyOperator | ||||
| '/' | '//' | '|' | '+' | '-' | '=' | '!=' | '<' | '<=' | '>' | '>=' | ||||
[33] | OperatorName | ::= | 'and' | 'or' | 'mod' | 'div' | |
[34] | MultiplyOperator | ::= | '*' | |
[35] | FunctionName | ::= | QName - NodeType | |
[36] | VariableReference | ::= | '$'QName | |
[37] | NameTest | ::= | '*' | |
| NCName ':' '*' | ||||
| QName | ||||
[38] | NodeType | ::= | 'comment' | |
| 'text' | ||||
| 'processing-instruction' | ||||
| 'node' | ||||
[39] | ExprWhitespace | ::= | S |
Cette section décrit les fonctions que les implémentations de XPath doivent toujours inclure dans leurs bibliothèques de fonctions utilisées pour l'interprétation des expressions.
Chaque fonction de la bibliothèque est spécifiée en utilisant une fonction prototype, qui donne le type retourné, le nom de la fonction et le typage des arguments. Si un type d'argument est suivi d'un point d'interrogation, cela signifie que cet argument est optionnel; sinon, l'argument est requis.
La fonction last retourne un nombre égal à la dimension contextuelle (context size) issue du contexte d'évaluation de l'expression.
La fonction position retourne un nombre égal à la position contextuelle context position issue du contexte d'évaluation de l'expression.
Fonction : number count(node-set)
La fonction count retourne le nombre de noeuds de l'ensemble de noeuds passé en argument.
Fonction : node-set id(object)
La fonction id sélectionne les éléments par leur identifiant unique (cf [5.2.1 Identifiants uniques]). Quand l'argument de la fonction id est du type "ensemble de noeuds", alors le résultat est l'ensemble des résultats de l'application de la fonction id à la valeur textuelle (string-value) de chacun des noeuds de l'ensemble passé en argument. Quand l'argument de la fonction id est d'un autre type, celui-là est converti en une chaîne de caractères comme avec la fonction string . La chaîne de caractères est transformée en une série d'unités lexicales séparées par des blancs (un blanc est tout série de caractères conformes à la règle de production S). Le résultat est un ensemble de noeuds contenant les éléments du même document que le noeud contextuel et qui ont un identifiant unique égal à l'une quelconque des unités lexicales de la série.
id("foo")
sélectionne l'élément qui a comme identifiant uniquefoo
id("foo")/child::para[position()=5]
sélectionne le 5ième enfantpara
de l'élément qui a comme identifiant uniquefoo
Fonction: string local-name(node-set?)
La fonction local-name retourne la partie locale du nom expansé du noeud de l'ensemble des noeuds passé en argument qui est le premier dans l'ordre du document. Si l'ensemble de noeuds passé en argument est vide ou que le premier noeud n'a pas de nom expansé, la fonction retourne une chaîne de caractères vide. Si l'argument est omis, la valeur par défaut utilisée par la fonction est un ensemble de noeuds réduit au seul noeud contextuel.
Fonction: string namespace-uri(node-set?)
La fonction namespace-uri retourne l'URI de l'espace de noms du nom expansé du noeud de l'ensemble de noeuds passé en argument qui est le premier dans l'ordre du document. Si l'ensemble de noeuds passé en argument est vide, le premier noeud n'a pas de nom expansé, ou si l'URI de l'espace de noms du nom expansé est nulle, une chaîne vide est retournée. Si l'argument est omis, la réponse par défaut est un ensemble de noeuds ayant un seul membre : le noeud contextuel.
NOTE : La chaîne retournée par la fonction namespace-uri sera vide sauf pour les noeuds d'éléments et d'attributs. Fonction: string name(node-set?)
La fonction name retourne une chaîne contenant un nom qualifié représentant le nom expansé du noeud de l'ensemble de noeuds passé en argument qui est le premier dans l'ordre du document. Le nom qualifié doit obligatoirement représenter le nom expansé en respectant la déclaration de l'espace de noms en vigueur sur le noeud dont le nom expansé est représenté. Typiquement, cela sera le nom qualifié qui apparaîtra dans le source XML. Ceci doit être le cas s'il y a des déclarations d'espaces de noms en vigueur sur le noeud associant plusieurs préfixes au même espace de noms. Toutefois, une implémentation peut introduire une information sur le préfixe original dans sa représentation des noeuds; dans ce cas, une implemntation peut garantir que la chaîne retournée est toujours la même que le nom qualifié utilisé dans le source XML. Si l'ensemble de noeuds passé en argument est vide ou que le premier noeud n'a pas de nom expansé, une chaîne vide est retournée. Si l'argument est omis, la valeur retournée par défaut est un ensemble de noeuds dont le seul membre est le noeud contextuel.
NOTE : La chaîne retournée par la fonction name sera identique à celle retournée par la fonction local-name exceptée pour les noeuds d'éléments et d'attributs.
Fonction: string string(object?)
La fonction string convertie un objet en chaîne de caractères selon les règles suivantes :
Un ensemble de noeuds est converti en chaîne de caractères en retournant la valeur textuelle du premier noeud de l'ensemble dans l'ordre du document. Si l'ensemble de noeuds est vide, une chaîne vide est retournée.
Un nombre est converti en chaîne comme suit :
NaN est converti en la chaîne de caractères
NaN
le zéro positif est converti en la chaîne
0
(caractère zéro)le zéro négatif est converti en la chaîne
0
(caractère zéro)plus l'infini est converti en la chaîne
Infinity
moins l'infini est converti en la chaîne
-Infinity
si le nombre est un entier, il est représenté sous forme décimale comme un nombre (Number) sans point décimal et sans chiffre après la virgule, précédé d'un moins (
-
) si le nombre est négatif.sinon, le nombre est représenté sous la forme d'un Nombre (Number) ayant toujours au moins un chiffre avant et après la décimale, précédé du signe moins (
-
) si le nombre est négatif; le point décimal n'est pas précédé de zéro au delà du premier requis avant la décimale; au delà du premier chiffre requis après la décimale, il doit y avoir autant, mais pas plus, de chiffres que nécessaires pour différencier sans ambiguïté le nombre de toutes les autres valeurs numériques du standard IEEE 754.La valeur booléenne
false
est convertie en la chaîne de caractèresfalse
. La valeur booléennetrue
est convertie en la chaîne de caractèrestrue
.Tout objet d'un type différent des 4 types de base est converti en chaîne de caractères selon une règle propre au type.
Si l'argument est omis, la valeur retournée par défaut est un ensemble de noeuds réduit au noeud contextuel.
NOTE : La fonction
string
n'a pas pour objet de convertir des nombres en chaînes de caractères pour les présenter aux utilisateurs. La fonctionformat-number
et l'élémentxsl:number
de [XSLT] sont là pour ça.
Fonction: string concat(string, string, string*)
La fonction concat retourne le résultat de la concaténation des arguments.
Fonction: boolean starts-with(string, string)
La fonction starts-with retourne
la valeur booléenne true
si la première chaîne de caractères
passée en argument commence par la chaîne de caractères passée en 2ième
argument; sinon, cette fonction retourne la valeur false
.
Fonction: boolean contains(string, string)
La fonction contains retourne
true
si la première chaîne de caractères passée en argument
contient la chaîne de caractères passée en 2ième argument; sinon, retourne la
valeur false
.
Fonction: string substring-before(string, string)
La fonction substring-before retourne la
sous-chaîne de caractères du premier argument qui précède la première
occurrence de la 2ième chaîne de caractères dans le premier argument, ou une
chaîne vide si le premier argument ne contient aucune occurrence de la
deuxième. Par exemple, substring-before("1999/04/01","/")
retourne 1999
.
Fonction: string substring-after(string, string)
La fonction substring-after
retourne la sous-chaîne de caractères du premier argument qui suit la première
occurrence de la 2ième chaîne de caractères dans le premier argument, ou une
chaîne vide si le premier argument ne contient aucune occurrence de la
deuxième. Par exemple, substring-after("1999/04/01","/")
retourne
04/01
, et substring-after("1999/04/01","19")
retourne 99/04/01
.
Fonction: string substring(string, number, number?)
La fonction substring retourne la
sous-chaîne du premier argument commençant à la position spécifiée par le
second argument et de longueur spécifiée par le troisième argument. Par
exemple, substring("12345",2,3)
retourne "234"
. Si
le troisième argument n'est pas spécifié, la fonction retourne la sous-chaîne
comprise entre la position de départ spécifiée et la fin de la chaîne de
caractères initiale. Par exemple, substring("12345",2)
retourne
"2345"
.
Plus précisément, chaque caractère de la chaîne (cf [3.6 Strings]) a une position numérique : celle du premier caractère est 1, le deuxième 2 etc....
NOTE : ceci diffère de Java et ECMAScript, dans lesquels les méthodes
String.substring
considèrent que la position du premier caractère est 0.
La sous-chaîne retournée contient les caractères dont la position est plus grande ou égale à la valeur arrondie du 2ième argument et, si le troisième argument est spécifié, inférieur à la somme de la valeur arrondie des 2ième et 3ième arguments; les comparaisons et l'addition utilisée ci-dessus doivent suivre le standard IEEE 754 rules; l'arrondi est calculé comme avec la fonction round.
Les exemples suivants illustrent différents cas de figures courants :
substring("12345", 1.5, 2.6)
retourne"234"
substring("12345", 0, 3)
retourne"12"
substring("12345", 0 div 0, 3)
retourne""
substring("12345", 1, 0 div 0)
retourne""
substring("12345", -42, 1 div 0)
retourne"12345"
substring("12345", -1 div 0, 1 div 0)
retourne""
Fonction: number string-length(string?)
La fonction string-length retourne le nombre de caractères de la chaîne (cf [3.6 Strings]). Si l'argument est omis, la valeur retournée est égale à la longueur de la valeur textuelle du noeud contextuel.
Fonction: string normalize-space(string?)
La fonction normalize-space retourne la chaîne de caractères passée en argument après y avoir normalisé les espaces blancs : suppression des espaces en début et fin et remplacement des séquences de blancs successifs par un seul caractère blanc. Les caractères blancs utilisés sont les mêmes que ceux définis par la règle de production S de XML. Si l'argument est omis, la fonction retourne la chaîne obtenue en ayant utilisé comme argument la valeur textuelle du noeud contextuel.
Fonction: string translate(string, string, string)
La fonction translate retourne la
première chaîne de caractères passée en argument dans laquelle les occurrences
des caractères de la deuxième chaîne sont remplacées par les caractères
correspondant aux mêmes positions de la troisième chaîne. Par exemple,
translate("bar","abc","ABC")
retourne la chaîne BAr
.
Si l'un des caractères du deuxième argument n'a pas de position correspondante
dans le troisième (parce que le deuxième argument est plus long que le
troisième), alors les occurrences de ce caractère sont supprimées du premier
argument. Par exemple, translate("--aaa--","abc-","ABC")
retourne
"AAA"
. Si un caractère apparaît plus d'une fois dans la deuxième
chaîne, alors c'est la première occurence de ce caractère qui détermine la
règle de transformation. Si la chaîne passée en troisième argument est plus
longue que la deuxième, alors, les caractères en trop sont ignorés.
NOTE : La fonction translate n'est pas suffisante pour les changements de casse dans toutes les langues. Une future version de XPath fournira des fonctions additionnelles à cette fin.
Fonction: boolean boolean(object)
La fonction boolean converti ses arguments en booléens selon les règles suivantes :
un nombre est vrai (
true
) si et seulement s'il n'est ni un zéro positif ou négatif, ni un NaNun ensemble de noeuds est vrai (
true
) si et seulement s'il n'est pas videune chaîne de caractères est vrai (
true
) si et seulement si sa longueur n'est pas nulleun objet d'un type autre que les 4 de base est converti selon des règles spécifiques à chaque type.
Fonction: boolean not(boolean)
La fonction not retourne l'inverse de la
valeur du booléen passé en argument : vrai (true
) si l'argument
est faux et vice-versa.
La fonction true retourne
true
.
La fonction false retourne
false
.
Fonction: boolean lang(string)
La fonction lang retourne
true
ou false
selon que la langue du noeud
contextuel telle que spécifiée par les attributs xml:lang
est la
même ou est un sous-langage de la langue passée en argument de la fonction. La
langue du noeud contextuel est déterminée par la valeur de l'attribut
xml:lang
attribut du noeud contextuel, ou, si celui-là n'a pas
cette valeur attribut, par la valeur de l'attribut xml:lang
du
plus proche ancêtre du noeud contextuel ayant cet attribut. Si aucun n'est
trouvé, la fonction lang retourne la
valeur false
. Si un tel attribut existe, alors la fonction lang retourne la valeur true
si la
valeur de l'attribut est égale à celle passée en argument (les différences de
casse étant ignorées), ou s'il y a quelques suffixes commençant avec
-
de sorte que la valeur de l'attribut soit égale à l'argument si
on ignore ce suffixe et la casse. Par exemple, lang("en")
retournerait la valeur true
si le noeud contextuel est l'un des 5
éléments suivants :
<para xml:lang="en"/>
<div xml:lang="en"><para/></div>
<para xml:lang="EN"/>
<para xml:lang="en-us"/>
Fonction: number number(object?)
La fonction number convertit l'argument passé en nombre selon les règles suivantes :
une chaîne de caractères qui est composée de blancs (optionnels) suivis du signe moins (-) suivi d'un nombre (Number) suivi de blancs est convertie en le nombre conforme à la norme IEEE 754 le plus proche (selon la règle d'arrondi au plus proche de l'IEEE 754) de la valeur mathématique représentée par la chaîne; toute autre chaîne est convertie en NaN
les booléens vrais (
true
) sont convertis en 1; les booléens faux (false
) sont convertis en 0un ensemble de noeuds est d'abord converti en chaîne de caractères comme avec la fonction string et cette chaîne est ensuite considérée comme argument à la fonction number
un objet de type différent des 4 types de base est converti en un nombre selon des règles dépendantes du type de l'objet
Si l'argument est omis, la valeur retournée par défaut est celle qui aurait été obtenue en considérant un ensemble de noeuds contenant le seul noeud contextuel.
NOTE : La fonction number ne doit pas être utilisée pour convertir des données numériques se trouvant dans un élément d'un document XML sauf si l'élément en question est d'un type permettant de représenter des données numériques dans un format neutre (qui serait typiquement transformé dans un format spécifique pour être présentées à un utilisateur). De plus, la fonction number ne peut pas être utilisée sauf si le format neutre utilisé par l'élément est cohérent avec la syntaxe XPath définie pour les nombres (Number).
Fonction : number sum(node-set)
La fonction sum retourne la somme, pour tous les noeuds de l'ensemble de noeuds passé en argument, du résultat de la conversion en nombres des valeurs textuelles (string-values) du noeud.
Fonction: number floor(number)
La fonction floor retourne le plus grand (du côté de l'infini positif) nombre entier inférieur à l'argument.
Fonction: number ceiling(number)
La fonction ceiling retourne le plus petit (du côté de l'infini négatif) nombre entier qui ne soit pas inférieur à l'argument.
Fonction: number round(number)
La fonction arrondi (round) retourne le nombre entier le plus proche de l'argument. S' il y a 2 nombres possibles, alors celui des deux qui est le plus proche de l'infini positif est retourné. Si l'argument est NaN, alors NaN est retourné. Si l'argument est l'infini positif, alors l'infini positif est retourné. Si l'argument est l'infinité négatif, alors l'infini négatif est retourné. Si l'argument est zéro positif, alors zéro positif est retourné. Si l'argument est le zéro négatif, alors le zéro négatif est retourné. Si l'argument est inférieur à zéro, mais plus grand ou égal à -0.5, alors le zéro négatif est retourné.
NOTE : Pour les 2 derniers cas, le résultat de l'appel de la fonction arrondi (round) ne donne pas le même résultat qu'en additionnant 0.5 et exécuter la fonction floor.
XPath considère le document comme étant un arbre. Cette section décrit comment XPath modélise un document XML sous forme d'arbre. Ce modèle est purement conceptuel et ne présume d'aucune implémentation particulière. Le rapport entre ce modèle et l'ensemble d'information XML [XML Infoset] est décrit dans l'annexe B : Projection de l'Ensemble d'Information XML.
Les documents XML sur lesquels sont appliqués XPath doivent se conformer à la recommandation XML sur les espaces de noms [XML Names].
L'arbre contient des noeuds. Il y a 7 types de noeuds :
les noeuds racines
les noeuds d'éléments
les noeuds de texte
les noeuds attributs
les noeuds d'espaces de noms
les noeuds d'instructions de traitement
les noeuds commentaires
Pour chaque type de noeud, il y a une manière de déterminer une valeur textuelle (string-value). Dans quelques cas, la valeur textuelle fait partie des noeuds; dans d'autres cas, la valeur textuelle est calculée à partir des valeurs textuelles des noeuds ascendants.
NOTE : Pour les noeuds d'éléments et racines, la valeur textuelle est différente de la chaîne obtenue avec la méthode DOM
nodeValue
(cf [DOM]).
Quelques types ont également un nom expansé, qui est une paire composée d'une partie locale et d'un espace de noms URI. La partie locale est une chaîne de caractères. L'espace de noms URI est soit nulle soit une chaîne de caractères. L'espace de noms URI spécifié dans le document XML peut être une URI de référence conforme à la norme [RFC2396]; cela signifie qu'on peut lui fournir un identifiant de fragment et qu'il peut être relatif. Une URI relative doit être résolue pendant le traitement des espaces de noms : les URI d'espaces de noms des noms expansés des noeuds du modèle de données doit être absolu. Deux noms expansés sont égaux s'ils ont la même partie locale, et s' ils ont tous les 2 soit un espace de noms nul, soit des URIs d'espaces de noms identiques.
Il existe un ordre associé au document (document order), défini pour tous les noeuds qui correspond à l'ordre avec lequel apparaît le premier caractère de chaque noeud dans la représentation XML après expansion des entités générales. Aussi, le noeud racine sera le premier des noeuds. Les noeuds sont avant leurs enfants. Aussi, l'ordre des noeuds du document est celui de leur balise de début correspondante en XML (après expansion des entités). Les noeuds d'attribut et les espaces de noms d'un élément sont classés avant les enfants de l'élément. Les noeuds d'espaces de noms sont rangés avant les noeuds d'attributs. L'ordre relatif des noeuds d'espaces de noms dépend de l'implémentation. L'ordre relatif des noeuds d'attributs dépend de l'implémentation. L'ordre inverse du document est l'inverse de l'ordre du document.
Les noeuds racines et les noeuds d'éléments ont une liste ordonnée de noeuds enfants. Les noeuds ne partagent jamais leurs enfants : si un noeud est différent d'un autre, alors aucun de leurs enfants ne seront les mêmes. Chaque noeud autre que le noeud racine a exactement un parent, qui est soit un noeud d'élément soit le noeud racine. Le noeud racine ou un noeud d'élément sont les parents de chacun de leurs noeuds enfants. Les descendants d'un noeud sont les enfants du noeud et les enfants des enfants du noeud.
Le noeud racine est la racine de l'arbre. Un noeud racine n'a aucune occurrence autre qu'à la racine de l'arbre. Le noeud élément correspondant au premier élément du document est l'enfant du noeud racine. Le noeud racine a aussi comme enfants des noeuds d'instructions de traitements et de commentaires pour ceux qui peuvent être utilisés dans le prologue et à la fin du document.
La valeur textuelle du noeud racine est le résultat de la concaténation des valeurs textuelles de tous les noeuds descendants du noeud racine dans l'ordre du document.
Le noeud racine n'a pas de nom expansé
Il existe un noeud d'élément pour chaque élément du document. Un noeud d'élément a un nom expansé calculé en expansant le nom qualifié de l'élément spécifié dans la balise conformément aux recommandations XML sur les espaces de noms [Noms XML]. L'URI de l'espace de noms du nom expansé de l'élément sera nulle si le nom qualifié n'a pas de préfixe et qu'il n'y a pas d'espace de noms par défaut applicable.
NOTE : Dans la notation de l'annexe sur les [Noms XML], la partie locale du nom expansé correspond à la valeur de l'attribut
type
de l'élémentExpEType
; l'URI de l'espace de noms du nom expansé correspond à la valeur de l'attributns
de l'élémentExpEType
, et est nul si cet attribut est omis.
Un noeud d'élément a comme contenu, des enfants qui sont des noeuds d'éléments, de commentaires, des instructions de traitement et des noeuds textuels. Les références d'entités, tant internes qu'externes, sont expansées. Les références de caractères sont résolues.
La valeur textuelle d'un noeud d'élément est le résultat de la concaténation des valeurs textuelles de tous ses noeuds textuels descendants dans l'ordre du document.
ID
. Il ne
peut y avoir dans le document 2 éléments identifiés avec le même ID. Si un
processeur XML détecte que 2 éléments d'un même document ont le même ID (ce
qui est possible uniquement si le document n'est pas valide) alors le 2ième
élément dans l'ordre du document doit être considéré comme n'ayant pas un
identifiant unique.
NOTE : Si un document n'a pas de DTD, alors aucun élément du document n'aura d'identifiant unique.
Chaque noeud d'élément a un ensemble de noeuds d'attributs associés; l'élément est le parent de chacun de ces noeuds d'attributs; toutefois, un noeud d'attribut n'est pas un enfant de son élément parent.
NOTE : Cela est différent de DOM, qui ne considère pas qu'un élément est le parent d'un attribut (cf [DOM]).
Les éléments ne se partagent jamais les noeuds d'attributs : si un noeud d'élément est différent d'un autre, alors aucun des noeuds d'attributs ne seront les mêmes.
NOTE :L'opérateur=
teste si 2 noeuds ont la même valeur, pas si ce sont les mêmes noeuds. Aussi, les attributs de deux éléments différents peuvent être comparés en utilisant=
, même s'ils ne sont pas les mêmes noeuds.
Une valeur d'attribut par défaut est traitée comme une valeur spécifiée. Si
un attribut a été déclaré dans la DTD mais que la valeur par défaut est de
type #IMPLIED
, et que la valeur de l'attribut n'est pas
spécifiée sur une occurence de l'élément, alors, l'ensemble des noeuds
d'attributs de cette occurence ne contient aucun noeud pour l'attribut en
question.
Quelques attributs, tels que xml:lang
et
xml:space
, ont une sémantique qui s'applique à tous les
descendants de l'élément qui porte l'attribut, jusqu'à une éventuelle
réinitialisation de l'attribut sur l'un des descendants. Toutefois, cela n'a
pas d'effet sur le lieu d'apparition des noeuds d'attribut dans l'arbre : un
élément a des noeuds d'attributs seulement pour les attributs qui étaient
explicitement spécifiés dans la balise ouvrante ou la balise vide de l'élément
ou qui étaient explicitement déclarés dans la DTD avec une valeur par
défaut.
Un noeud d'attribut a un nom expansé et une valeur textuelle. Le nom expansé est calculé en expansant le nom qualifié spécifié dans la balise du document XML conformément à la recommandation XML sur les espaces de noms [Noms XML]. L'URI de l'espace de nom du nom d'attribut sera nulle si le nom qualifié de l'attribut n'a pas de préfixe.
NOTE :Dans la notation de l'annexe A.3 sur les [Noms XML], la partie locale du nom expansé correspond à l'attributname
de l'élémentExpAName
; l'URI de l'espace de noms du nom expansé correspond à la valeur de l'attributns
de l'élémentExpAtName
, et est nulle si celui-là est omis.
Un noeud d'attribut a une valeur textuelle. La valeur textuelle est la valeur normalisée telle que spécifiée dans la recommandation XML [XML]. Un attribut dont la valeur normalisée est une chaîne de longueur zéro n'est pas traitée spécialement : elle donne lieu à un noeud d'attribut dont la valeur textuelle est une chaîne de longueur zéro.
NOTE :Il est possible pour les attributs par défaut d'être déclarés dans des DTD externes ou une entité paramètre externe. La recommandation XML n'impose pas aux processeurs XML d'être capables de lire une DTD ou une entité paramètre externe tant qu'il ne valide pas. Une feuille de style ou tout autre mécanisme prenant en charge la déclaration des valeurs d'attribut par défaut d'un arbre XPath d'une DTD ou d'une entité externe pourrait ne pas marcher avec des processeurs XML validant.
Il n'y a pas de noeuds d'attributs correspondant aux attributs d'initialisation des espaces de noms (cf [Noms XML]).
Chaque élément est associé à un ensemble de noeuds d'espaces de noms, un
pour chaque préfixe d'espace de noms particulier applicable à l'élément (y
compris le préfixe xml
, implicitement déclaré par la
recommandation XML sur les espaces de noms [Noms XML])
et un pour l'espace de nom par défaut s'il en existe un pour le document.
L'élément est le parent de chacun de ces noeuds
d'espaces de noms; toutefois, un noeud d'espace de noms n'est pas un enfant de
son élément parent. Les éléments ne se partagent jamais les noeuds d'espaces
de noms : si deux noeuds d'éléments sont différent, alors aucun de leurs
noeuds respectifs d'espaces de noms ne seront les mêmes. Cela signifie qu'un
élément aura un noeud d'espace de noms :
pour chacun de ses attributs dont le nom commence par
xmlns:
;pour chaque attribut d'un élément ancêtre dont le nom commence par
xmlns:
sauf si l'élément lui-même ou un plus proche ancêtre redéclare le préfixe;pour l'attribut
xmlns
, si l'élément ou un de ses ancêtres ont l'attributxmlns
, et que la valeur de l'attributxmlns
du plus proche de ces éléments est non-videNOTE : L'attribut de valeur nulle
xmlns=""
annule l'existence d'un espace de noms par défaut (cf [Noms XML]).
Un noeud d'espace de noms a un nom expansé : la partie locale est le préfixe de l'espace de noms (qui est vide si le noeud de l'espace de noms est celui de l'espace de nom par défaut); l'URI de l'espace de noms est toujours nulle.
La valeur textuelle d'un noeud d'espace de noms est l'URI de l'espace de noms qui est associée au préfixe de l'espace de noms; si elle est relative, elle doit être résolue de la même manière qu'une URI d'espace de noms d'un nom expansé.
Il existe un noeud d'instruction de traitement pour chaque instruction de traitement, sauf pour celles qui se trouvent dans la déclaration de type de document (DTD).
Une instruction de traitement a un nom
expansé : sa partie locale est la cible de l'instruction de traitement,
l'URI de l'espace de noms est nulle. La valeur
textuelle du noeud de l'instruction de traitement est la partie de
l'instruction de traitement qui suit la cible et tout espace blanc. Elle ne
contient pas le signe de fin d'instruction de traitement
?>
.
NOTE :La déclaration XML n'est pas une instruction de traitement. Aussi, il n'existe pas de noeud de type instruction de traitement correspondant à la déclaration XML.
Il existe un noeud de commentaire par commentaire, exception faite des ceux se trouvant dans la déclaration de type de document (DTD).
La valeur textuelle d'un commentaire est le
contenu du commentaire à l'exclusion des signes d'ouverture et de fermeture :
<!--
et -->
.
Un noeud de commentaire n'a pas de nom expansé.
Les caractères de données sont mis dans des noeuds textuels. Le plus grand nombre de caractères possibles est mis dans chaque noeud textuel : un noeud textuel n'a jamais de précédent ou suivant direct du même type. La valeur textuelle d'un noeud textuel es la suite de caractères. Un noeud textuel contient au moins un caractère.
Tout caractère d'une zone de type CDATA est traité comme caractère de
données. Ainsi, <![CDATA[<
dans un document source sera
traité de la même manière que <
. les 2 donneront un seul
caractère <
dans un des noeud de l'arbre. Ainsi, un zone CDATA
est traitée comme si les unités lexicales <![CDATA[
and
étaient retirées et que chaque occurrence des signes
<
et &
était respectivement remplacée par
<
et &
.
NOTE : Quand un noeud textuel qui contient le signe
<
est enregistré en XML, celui-là doit être protégé en, par exemple, le remplaçant par l'entité caractère<
, ou en l'incluant dans une zone de type CDATA.
Les caractères à l'intérieur des commentaires, les instructions de traitement et les valeurs d'attributs n'entraînent pas la création de noeuds textuels. Les fins de ligne des entités externes sont normalisées à #xA tel que spécifié dans la recommandation XML [XML].
Un noeud textuel n'a pas de nom expansé.
XPath est principalement une spécification dont l'objectif premier est
d'être intégrée dans d'autres spécifications. Aussi, les critères de
conformité de XPath sont ceux des spécifications qui l'utilisent (telle que [XPointer] et [XSLT]); il n'existe aucun
critère de conformité pour des implémentations autonomes de XPath.
Les noeuds du modèle de données XPath peuvent être dérivés des items d'information fournis par l'Ensemble d'Information XML [XML Infoset] comme suit :
NOTE : Une nouvelle version du brouillon de travail sur les Ensembles d'Informations XML (XML Information Set), qui remplacera la version du 17 mai, était pratiquement terminée quand cette version de XPath était elle-même terminée et on en attendait une version définitive en même temps ou juste après. Les correspondances sont indiquées pour cette nouvelle version du brouillon de travail sur les Ensembles d'Informations XML. Si celle-là n'a pas encore été éditée, les membres du W3C peuvent la consulter la version interne du groupe de travail à l'adresse http://www.w3.org/XML/Group/1999/09/WD-xml-infoset-19990915.html (seulement pour les membres).
Le noeud racine correspond à l'item d'information sur le document. Les enfants du noeud racine correspondent aux propriétés enfants et enfants - commentaires.
Un noeud d'élément correspond à l'item d'information d'élément. Les enfants
d'un noeud d'élément correspondent aux propriétés enfants et enfants
- commentaires. Les attributs d'un noeuud d'élément correspondent à la
propriété attributs. Un espace de noms d'un noeud d'élément correspond
à la propriété des espaces de noms dans le périmètre. La partie locale
d'un nom expansé d'un noeud d'élément
correspond à la propriété nom local. L'URI d'un espace de noms du nom expansé d'un noeud d'élément correspond à la
propriété URI de l'espace de noms. L'identificant unique du noeud
d'élément correspond à la propriété enfants de l'item d'information
d'attribut de la propriété attributs qui a une propriété de type
d'attribut égale à ID
.
Un noeud d'attribut correspond à un item d'information d'attribut. La partie locale du nom expansé du noeud d'attribut correspond à la propriété nom local. L'URI de l'espace de noms du nom expansé du noeud d'attribut correspond à la propriété URI de l'espace de noms. La valeur textuelle du noeud correspond à la concaténation de la propriété code de caractère de chaque membre de la propriété enfants.
Un noeud textuel correspond à une séquence consécutive d'un ou plusieurs items d'information de caractères. La valeur textuelle du noeud correspond à la concaténation de la propriété code de caractère de chaque item d'information de caractères.
Une instruction noeud découle d'une instruction d'information. La partie locale d'un nom expansé vient de la propriété cible. (La partie URI de l''espace de noms d'un nom expansé d'un est nulle.) La valeur textuelle d'un noeud provient de la propriété contenu de celui-ci. Il n'existe pas d'instructionsde noeuds pour les instruction d'information enfant d'un element information de type document.
Un noeud commentaire découle d'un élément information commentaire. La valeur textuelle du noeud vient
de la propriété contetnu. Il n'y a pas pas de noeud de commentaire pour les
éléments informatifs commentaires qui sont les enfants d'un élément informatif
déclaré comme document.
Un espace de noms de noeuds vient de la déclaration d'un item information. La partie locale d'un nom expansé d'un noeud vient de la propriété préfixe. (La partie URI de l''espace de noms d'un nom étendu est nulle.). La valeur textuelle provient de la propriété espace de noms URI.