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
Traducteurs :
Jean-Jacques Thomasson
Yves Bazin
Relecture de la traduction :
Ramzi Guetari
Extase Kwadzo Akpotsui
Jean-Claude Simon
Traduction hébergée par XMLfr.

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.

W3C

Langage XML Path (XPath)
Version 1.0

Recommandation du W3C du 16 Novembre 1999

Version anglaise correspondant à cette version française :
http://www.w3.org/TR/1999/REC-xpath-19991116
(disponible en XML ou  HTML)
Version précédente (anglaise) :
http://www.w3.org/TR/xpath
Versions antérieures (anglaises) :
http://www.w3.org/TR/1999/PR-xpath-19991008
http://www.w3.org/1999/08/WD-xpath-19990813
http://www.w3.org/1999/07/WD-xpath-19990709
http://www.w3.org/TR/1999/WD-xslt-19990421
Éditeurs de la norme :
James Clark mailto:jjc@jclark.com
Steve DeRose (Inso Corp. and Brown University) mailto:Steven_DeRose@Brown.edu

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.


Résumé

XPath est un langage pour adresser des parties de documents XML, conçu pour être utilisé à la fois par XSLT et XPointer.

Statut de ce document

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.

Table des matières

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é

Annexes

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)


1 Introduction

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 &lt;. 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 (&quot; ou &apos;). 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].

2 Chemins de localisation

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ément para 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'attribut name du noeud contextuel

attribute::* sélectionne tous les attributs du noeud contextuel

descendant::para sélectionne tous les descendants para du noeud contextuel

ancestor::div sélectionne tous les ancêtres div du noeud contextuel

ancestor-or-self::div sélectionne tous les ancêtres div du noeud contextuel et le noeud contextuel lui-même si c'est un div

descendant-or-self::para sélectionne tous les descendants para du noeud contextuel et le noeud contextuel lui-même si c'est un para

self::para sélectionne le noeud contextuel si c'est un élément para, et rien dans le cas contraire

child::chapter/descendant::para sélectionne les descendants para de l'element chapitre enfant du noeud contextuel

child::*/child::para sélectionne tous les petits enfants para 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éments para descendants du document contenant le noeud contextuel

/descendant::olist/child::item sélectionne tous les éléments item qui ont un parent olist et qui sont dans le même document que le noeud contextuel

child::para[position()=1] sélectionne le premier enfant para du noeud contextuel

child::para[position()=last()] sélectionne le dernier enfant para du noeud contextuel

child::para[position()=last()-1] sélectionne l'avant dernier para enfant du noeud contextuel

child::para[position()>1] sélectionne tous les enfants para du noeud contextuel autres que le premier

following-sibling::chapter[position()=1] sélectionne le prochain chapter cible du noeud contextuel

preceding-sibling::chapter[position()=1] sélectionne le précédent chapter cible du noeud contextuel

/descendant::figure[position()=42] sélectionne le 42ième élément figure du document

/child::doc/child::chapter[position()=5]/child::section[position()=2] sélectionne la 2ième section du 5ième élément chapter de l'élément doc du document

child::para[attribute::type="warning"] sélectionne tous les enfants para du noeud contextuel qui ont un attribut type dont la valeur est warning

child::para[attribute::type='warning'][position()=5] sélectionne le 5ième enfant para du noeud contextuel qui a un attribut type dont la valeur est warning

child::para[position()=5][attribute::type="warning"] sélectionne le 5ième enfant para du noeud contextuel si celui-là a un attribut type de valeur warning

child::chapter[child::title='Introduction'] sélectionne l'enfant chapter du noeud contextuel qui a un ou plus enfant title avec un contenu textuel égal à 'Introduction'

child::chapter[child::title] sélectionne l'enfant chapter du noeud contextuel qui a un ou plus enfant title

child::*[self::chapter or self::appendix] sélectionne tous les enfants chapter et appendix du noeud contextuel

child::*[self::chapter or self::appendix][position()=last()] sélectionne le dernier enfant chapter ou appendix 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.

Chemins de localisation
[1]  LocationPath    ::=  RelativeLocationPath
| AbsoluteLocationPath
[2]  AbsoluteLocationPath    ::=  '/' RelativeLocationPath?
| AbbreviatedAbsoluteLocationPath
[3]  RelativeLocationPath    ::=  Step
| RelativeLocationPath '/' Step
| AbbreviatedRelativeLocationPath

2.1 Etapes de localisation

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].

Etapes de localisation
[4]  Step    ::=  AxisSpecifierNodeTestPredicate*
| AbbreviatedStep
[5]  AxisSpecifier    ::=  AxisName '::'
| AbbreviatedAxisSpecifier

2.2 Axes

Les axes suivants sont disponibles :

l'axe enfant (child) contient les enfants directs du noeud contextuel

l'axe descendant (descendant) contient les descendants du noeud contextuel; un descendant est un enfant ou un petit enfant etc... Aussi, l'axe descendant ne contient jamais de noeud de type attribut ou des noms d'espace.

l'axe parent (parent) contient le parent du noeud contextuel, s'il y en a un

l'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, la cible 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ément

l'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 contextuel

l'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.

Axes
[6]  AxisName    ::=  'ancestor'
| 'ancestor-or-self'
| 'attribute'
| 'child'
| 'descendant'
| 'descendant-or-self'
| 'following'
| 'following-sibling'
| 'namespace'
| 'parent'
| 'preceding'
| 'preceding-sibling'
| 'self'

2.3 Les tests de noeuds

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 ')'

2.4 Prédicats

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].

Prédicats
[8]  Predicate    ::=  '[' PredicateExpr ']'
[9]  PredicateExpr    ::=  Expr

2.5 Syntaxe abrégée

Les quelques exemples suivants utilisent la syntaxe abrégée :

para sélectionne les éléments enfants para 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'attribut name du noeud contextuel

@* sélectionne tous les attributs du noeud contextuel

para[1] sélectionne le premier enfant para du noeud contextuel

para[last()] sélectionne le dernier enfant para du noeud contextuel

*/para sélectionne tous les petits enfants para du noeud contextuel

/doc/chapter[5]/section[2] sélectionne la 2ième section du 5ième chapter de doc

chapter//para sélectionne les descendants para des enfants chapter du noeud contextuel

//para sélectionne tous les descendants para de la racine du document et donc, sélectionne tous les éléments para du document contenant le noeud contextuel

//olist/item sélectionne tous les éléments item ayant pour parent olist dans le document qui contient le noeud contextuel

. sélectionne le noeud contextuel

.//para sélectionne les descendants para du noeud contextuel

.. sélectionne le parent du noeud contextuel

../@lang sélectionne l'attribut lang du parent du noeud contextuel

para[@type="warning"] sélectionne tous les enfants para du noeud contextuel qui ont un attribut type ayant la valeur warning

para[@type="warning"][5] sélectionne le 5ième enfant para du noeud contextuel qui ont un attribut type ayant la valeur warning

para[5][@type="warning"] sélectionne le 5ième enfant para du noeud contextuel si celui-là a un attribut type dont la valeur est warning

chapter[title="Introduction"] sélectionne les enfants chapter du noeud contextuel qui ont au moins un enfant title dont le contenu textuel (string-value) est Introduction

chapter[title] sélectionne les enfants chapter du noeud contextuel qui ont au moins un enfant title

employee[@secretary and @assistant] sélectionne tous les enfants employee du noeud contextuel qui ont simultanément les attributs secretary et assistant

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 descendant para tandis que le premier sélectionne tous les éléments para descendants qui sont les premiers éléments para 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.

Abréviations
[10]  AbbreviatedAbsoluteLocationPath    ::=  '//' RelativeLocationPath
[11]  AbbreviatedRelativeLocationPath    ::=  RelativeLocationPath '//' Step
[12]  AbbreviatedStep    ::=  '.'
| '..'
[13]  AbbreviatedAxisSpecifier    ::=  '@'?

3 Expressions

3.1 Elémentaires

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

3.2 Appels de fonctions

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

3.3 Ensembles de noeuds

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ément foo 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ément foo 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

3.4 Booléens

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 que not($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 textuel foo; la deuxième est vraie si et seulement si tous les noeuds de $x ont comme valeur textuelle foo.

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 &lt; et &lt;=. Dans l'exemple suivant, la valeur de l'attribut test est une expression XPath : <xsl:if test="@value &lt; 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.

3.5 Nombres

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 enfant foo-bar; foo - bar représente la soustraction des résultats de l'évaluation du contenu textuel des éléments foo et bar 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 retourne 1

5 mod -2 retourne 1

-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.
Expressions numériques
[25]  AdditiveExpr    ::= MultiplicativeExpr
| AdditiveExpr '+' MultiplicativeExpr
| AdditiveExpr '-' MultiplicativeExpr
[26]  MultiplicativeExpr    ::=  UnaryExpr
| MultiplicativeExprMultiplyOperatorUnaryExpr
| MultiplicativeExpr 'div' UnaryExpr
| MultiplicativeExpr 'mod' UnaryExpr
[27]  UnaryExpr    ::=  UnionExpr
| '-' UnaryExpr

3.6 Chaînes de caractères

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]).

3.7 Structure lexicale

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).

Structure lexicale des expressions
[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

4 Bibliothèque de fonctions de base

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.

4.1 Fonctions des ensembles de noeuds

Fonction : number last()

La fonction last retourne un nombre égal à la dimension contextuelle (context size) issue du contexte d'évaluation de l'expression.

Fonction : number position()

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 unique foo

id("foo")/child::para[position()=5] sélectionne le 5ième enfant para de l'élément qui a comme identifiant unique foo

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.

4.2 Fonctions de chaînes de caractères

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ères false. La valeur booléenne true est convertie en la chaîne de caractères true.

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 fonction format-number et l'élément xsl: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.

4.3 Fonctions Booléennes

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 NaN

un ensemble de noeuds est vrai (true) si et seulement s'il n'est pas vide

une chaîne de caractères est vrai (true) si et seulement si  sa longueur n'est pas nulle

un 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.

Fonction: boolean true()

La fonction true retourne true.

Fonction: boolean false()

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"/>

4.4 Fonctions numériques

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 0

un 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.

5 Modèle de données

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.

5.1 Le noeud racine

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é

5.2 Les noeuds d'éléments

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ément ExpEType; l'URI de l'espace de noms du nom expansé correspond à la valeur de l'attribut ns de l'élément ExpEType, 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.

5.2.1 Les identifiants uniques

Un noeud d'élément peut recevoir un identifiant unique (ID). C'est la valeur de l'attribut déclaré dans la DTD comme étant de type 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.

5.3 Les noeuds d'attributs

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'attribut name de l'élément ExpAName; l'URI de l'espace de noms du nom expansé correspond à la valeur de l'attribut ns de l'élément ExpAtName, 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]).

5.4 Les noeuds d'espaces de noms

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'attribut xmlns, et que la valeur de l'attribut xmlns du plus proche de ces éléments est non-vide

NOTE : 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é.

5.5 Les noeuds d'instructions de traitement

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.

5.6 Les noeuds de commentaires

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é.

5.7 Les noeuds textuels

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 &lt;. 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 &lt; et &amp;.

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 &lt;, 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é.

6 Conformité

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.


A Références

A.1 Références normatives

IEEE 754
Institute of Electrical and Electronics Engineers. Standard IEEE pour les opérations arithmétiques à virgule flottante. ANSI/IEEE Std 754-1985.
RFC2396
T. Berners-Lee, R. Fielding, and L. Masinter. Syntaxe générique des Identifiants Uniformes de Ressource (URI - Uniform Resource Identifiers). IETF RFC 2396. Voir http://www.ietf.org/rfc/rfc2396.txt.
XML
World Wide Web Consortium.  Langage de Balisage Extensible (XML - Extensible Markup Language) Recommandation 1.0 du W3C. Voir http://www.w3.org/TR/1998/REC-xml-19980210
Noms XML
World Wide Web Consortium. Les espaces de noms en XML (Namespaces in XML). Recommandation du W3C. Voir http://www.w3.org/TR/REC-xml-names

A.2 Autres Références

Character Model
World Wide Web Consortium. Le modèle de caractères pour le World Wide Web (Character Model for the World Wide Web). Brouillon de travail du W3C. Voir http://www.w3.org/TR/WD-charmod
DOM
World Wide Web Consortium. Le modèle objet des documents (Document Object Model - DOM) spécification de niveau 1. Recommandation du W3C. Voir http://www.w3.org/TR/REC-DOM-Level-1 (traduction française non normative: http://xmlfr.org/w3c/TR/REC-DOM-Level-1/)
JLS
J. Gosling, B. Joy, and G. Steele. La spécification du langage Java (The Java Language Specification). Voir http://java.sun.com/docs/books/jls/index.html.
ISO/IEC 10646
ISO (International Organization for Standardization). ISO/IEC 10646-1:1993, Technologie de l'information -- Encodage universel multi-octets des ensembles de caractères -- Partie 1: archiecture et plan de base multilingue (Information technology -- Universal Multiple-Octet Coded Character Set (UCS) -- Part 1: Architecture and Basic Multilingual Plane). Standard international. Voir http://www.iso.ch/cate/d18741.html.
TEI
C.M. Sperberg-McQueen, L. Burnard Règles pour le codage électronique et l'échange de textes (Guidelines for Electronic Text Encoding and Interchange). Voir http://etext.virginia.edu/TEI.html.
Unicode
Unicode Consortium. Le standard Unicode (The Unicode Standard). Voir http://www.unicode.org/unicode/standard/standard.html.
Ensemble d'Informations sur XML (XML Infoset)
World Wide Web Consortium. Ensemble d'informations sur XML (XML Information Set). Brouillon de travail du W3C. Voir http://www.w3.org/TR/xml-infoset
XPointer
World Wide Web Consortium. Le langage de pointeurs XML (XML Pointer Language - XPointer- ). Brouillon de travail du W3C. Voir http://www.w3.org/TR/WD-xptr
XQL
J. Robie, J. Lapp, D. Schach. Le lanagage de requêtes XML (XML Query Language -XQL- ). Voir http://www.w3.org/TandS/QL/QL98/pp/xql.html
XSLT
World Wide Web Consortium. Les transformations XSL (Transformations -XSLT- ). Recommandation du W3C. Voir http://www.w3.org/TR/xslt (traduction française non normative: http://xmlfr.org/w3c/TR/xslt/)

B Correspondances avec XML (section Non-Normative)

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 noeud 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.


Valid HTML 4.0!