web-dev-qa-db-fra.com

XPath pour ne retourner que les éléments contenant le texte, et non ses parents

Dans ce fichier xml, je veux faire correspondre l'élément contenant 'match' (élément random2)

<root>
 <random1>
  <random2>match</random2>
  <random3>nomatch</random3>
 </random1>
</root>

ok, jusqu'ici j'ai:

//[re:test(.,'match','i')] (with re in the proper namespace)

cela retourne random2, random1 et root ... J'aimerais seulement obtenir "random2"

des idées?

60
julian

Voulez-vous trouver des éléments qui contiennent "correspondance" ou égal "correspondance"?

Cela trouvera des éléments dont les nœuds de texte sont égaux à 'match' (ne correspond à aucun des éléments en raison des espaces de début et de fin dans random2):

//*[text()='match']

Ceci trouvera tous les éléments dont les nœuds de texte sont "correspondants", après avoir supprimé les espaces de début et de fin (correspond à random2):

//*/text()[normalize-space(.)='match']/parent::*

Tous les éléments contenant "match" seront trouvés dans la valeur du nœud de texte (correspond à random2 et random3):

//*[contains(text(),'match')]

Cette/ XPATH 2.0 solution utilise la fonction matches () et un modèle regex qui recherche les nœuds de texte contenant 'match' et commençant au début de la chaîne (ie ^) ou une limite de Word (ie \W) et terminée à la fin de la chaîne (c.-à-d. $) ou une limite de Word. Le troisième paramètre i évalue le motif de regex insensible à la casse. (correspond à random2)

//*[matches(text(),'(^|\W)match($|\W)','i')]
122
Mads Hansen

Essayer

//re:*[. ='match']
0
Gregoire