web-dev-qa-db-fra.com

Exclure certains éléments de la sélection dans XPath

Je sais que c'est une question simple, mais je ne peux pas le comprendre. Considérez le document XML simple suivant:

<root>
  <a></a>
  <b></b>
  <c></c>
  <a></a>
  <d></d>
  <e></e>
  <a></a>
  <a></a>
</root>

Quelle est la meilleure façon de sélectionner les nœuds <b> à travers <e> en utilisant XPath?

Je cherche quelque chose comme

/root/*[not(a)]

(ce qui ne fait pas l'affaire)

38
user123444555621
/root/*[not(self::a)]
61
Tomalak

Répondre à ajouter que dans XPath 2.0, vous pouvez utiliser except:

/root/(* except a)

Pour XPath 1.0, a souligné Tomalak, c'est la manière standard de le faire:

/root/*[not(self::a)]

Soit dit en passant, si quelqu'un atterrit ici en essayant de l'utiliser dans XSLT 2.0 dans un xsl:template/@match attribut cela ne fonctionnera pas car @match prend des modèles qui bien que look comme les expressions XPath, soient pas les expressions XPath. La solution pour XPath 1.0 fonctionnerait dans ce cas.

10
Louis

Je me rends compte que c'est une vieille question, mais j'ai récemment rencontré un problème similaire et utilisé le xpath suivant pour le résoudre:

/root/*[not(name()='a')]
7
BVH