Ce chapitre est basé sur la recommandation de XPath. Ce chapitre ne listera pas de prédicats, puisque la liste est disponible directement à l'adresse donnée. Nous nous contenterons de manipuler la syntaxe de ces derniers à travers des exemples.
Jusqu'à présent nous n'avions pas besoin d'introduire de type de données en parlant de XPath. Cela change quand on aborde les prédicats.
Il existe 4 types principaux :
number
boolean
string
node set
Les 3 premiers sont assez standard. Le dernier est le type du résultat d'une requête XPath. Il est aussi possible que certaines fonctions renvoient des node set.
Ces fonctions peuvent être par conséquent utilisées à la place d'un pas de localisation.
Il est possible d'utiliser des opérateurs dans les prédicats. Ces opérateurs sont assez standards. Les voici :
+ - addition (nombres)
- - soustraction (nombres)
* - multiplication (nombres)
div - division (nombres). en effet, le "/" est déjà pris pour autre chose
mod - modulo (nombres)
= - égalité (tout type)
<= - inégalité (nombres)
>= - inégalité (nombres)
< - inégalité (nombres)
> - inégalité (nombres)
!= - différence (tout type)
and - et logique (booléen)
or - ou logique (booléen)
Un opérateur ensembliste sur les node set
Tout ces opérateurs ont une fonction associé. Ce sont des facilités d'écritures, comme le @, le .., ou le //. Utilisez les pour rendre vos expressions plus lisible, mais n'oubliez jamais ce que vous manipulez réellement
Un prédicat s'écrit comme un fragment de code.
Le prédicat permet de filtrer les résultats du pas en cours.
Ainsi tout les nœuds pour lesquelles le prédicat évalue à vrai sont gardés, les autres sont jetés.
Il est possible d'utiliser une expression XPath complète (avec, pourquoi pas, quelques prédicats) à l'intérieur d'un prédicats.
Par défaut, XPath fait du transtypage automatique.
Ainsi si le prédicat ne s'évalue pas en booléen, il sera converti.
Les propriétés de conversion pour chaque type sont disponible dans la recommandation W3C.
//titre[@lang="fr"]
Renvoi :
<titre lang="fr">Harry Potter</titre>
<titre lang="fr">Apprendre XML</titre>
//titre[following-sibling::comment()]
Renvoi :
<titre lang="fr">Apprendre XML</titre>
//titre[substring-before(text(), ' ') = 'Harry']
Renvoi :
<titre lang="fr">Harry Potter</titre>
sum(//prix)
Renvoi :
69.94
6*7
Renvoi :
42