FAQ XML
FAQ XMLConsultez toutes les FAQ
Nombre d'auteurs : 5, nombre de questions : 65, dernière mise à jour : 16 juin 2021
- Qu'est ce que XPath ?
- Pourquoi cette FAQ ne parle pas de XPath 2.0 ?
- Ma requête ne me ramène rien et je n'ai pas d'erreur ?
- Comment supprimer les doublons dans un affichage ?
- Comment vérifier si un élément est vide ?
- Comment convertir une chaîne en majuscules/minuscules ?
- Comment supprimer des caractères dans une chaîne ?
- J'utilise current() mais cela ne marche pas ?
- Quelle est la différence entre node() et * ?
- Existe-t-il une fonction permettant de remplacer une chaîne de caractères par une autre ?
- Comment sélectionner le n ième élément d'une sélection ?
- Pourquoi la fonction name(ma_sélection) ne me renvoie pas les résultats pour tous les noeuds sélectionnés ?
XPath est un langage avec une syntaxe non XML, permettant d'adresser les différents noeuds ou groupes de noeuds particuliers d'un document XML.
XPath voit le document XML comme un arbre de noeuds, qu'il permet de parcourir selon des axes (fils, parent, ancêtre, descendant, ...)
et en en sélectionnant les noeuds par leur nom. Les expressions XPath permettent également de représenter des chaînes de caractères, des nombres et des booléens.
XPath est intensément utilisé par d'autres langages et technologies XML, tels que XSLT, les W3C XML Schema, XLink, XForms...
Voir les tutoriels sur XPath
XPath 2.0 est à ce jour seulement au stade de Candidate Recommendation.
Seules quelques implémentations expérimentales, plus ou moins complètes, existent. Parmi ces implémentations, SAXON est réputée être une des plus complètes.
En XPath chercher à sélectionner un noeud qui n'existe pas n'est pas une erreur, le moteur de XPath se contente de renvoyer une liste vide.
XPath est sensible à la casse, vérifiez en conséquence l'écriture des balises dans votre expression, ou, peut-être, avez-vous utilisé des prédicats (conditions entre crochets) trop restrictifs ?
On vérifie s'il n'y a pas de noeud "précédent" ayant la même valeur.
Exemple avec un tri sur le contenu d'une balise Id
//Id[not(preceding::Id = .)]
ATTENTION, cette solution est TRES coûteuse. La solution XSLT doit toujours lui être préférée quand elle est possible.
Le prédicat à préciser dans l'expression XPath sera différent selon le sens apporté au mot "vide".
//my-element[not(text())]
//my-element[not(*)]
//my-element[not(node())]
En utilisant la fonction translate: translate (chaîne, 'abcdefghijklmnopqrstuvwxyz','ABCDEFGHIJKLMNOPQRSTUVWXYZ')
Par exemple :
translate ('Rapide', 'abcdefghijklmnopqrstuvwxyz','ABCDEFGHIJKLMNOPQRSTUVWXYZ') renverra la chaîne "RAPIDE"
translate() est une fonction XPath de remplacement de caractères par d'autres ; on peut également s'en servir pour supprimer des caractères
en l'utilisant sans donner de caractères de remplacement aux caractères recherchés.
Exemple - suppression de la ponctuation :
translate ('Demain, dois-je continuer ?', '-,?', '') renverra la chaîne "Demain dois je continuer "
current() est une fonction XSLT utilisable dans des expressions XPath, et elle doit être uniquement employée dans une feuille de style XSL.
- node() sélectionne tous types de noeuds, à savoir ceux de type élément (balises), les attributs, les noeuds textuels (contenu des balises également sélectionnable avec text()), les commentaires (sélectionnable également avec comment(), les instructions de traitement (également sélectionnable avec processing-instruction()) et le noeud racine (à différencier de l'élément racine)
- * récupère seulement les types element ou attributs.
node() et * permettent tous deux de sélectionner les attributs, à condition qu'ils soient précédés par l'axe attribute
Voir également Un cours sur les types Xpath.
Non, la seule fonction XPath de remplacement, translate(), ne permet de remplacer qu'un seul caractères à la fois.
Pour obtenir ce résultat il faudra utiliser les fonctions substring-after() et substring-before().
Par exemple, pour remplacer "renard" par "chien" dans la chaîne "le renard a mangé les poules" :
concat(substring-before('le renard a mangé les poules','renard'), 'chien', substring-after('le renard a mangé les poules', 'renard'))
Il suffit d'utiliser la fonction position() qui donne, dans la sélection en cours, la position de l'élément en lecture. /A/B[position()=2] sélectionne le deuxième fils de chacun des éléments A. /A/B[position()=2]/C[position()>1] sélectionne tous les fils C , sauf le premier, des deuxième fils de chacun des éléments A.
La fonction name(), mais aussi local-name() et namespace-uri () ne renvoie la valeur que du premier noeud sélectionné si plusieurs lui sont fournis en paramètre