Oui, il y a:
//test/item\[not(contains(text(), '(default)'))\]
Indice: not()
est une fonction en XPath au lieu d'un opérateur.
Une alternative, peut-être mieux formulée, est la suivante:
//test/item\[not(text()\[contains(., '(default)')\])\]
Il y a une différence subtile mais importante entre les deux expressions (appelons-les A et B, respectivement).
Cas simple: Si tous les ont uniquement un enfant nœud texte, A et B se comportent de la même façon.
Cas complexe: Si peut avoir plusieurs enfants nœuds texte, l'expression A ne correspond que lorsque '(default)' apparaît dans le premier d'entre eux.
Cela est dû au fait que text()
correspond à tous les nœuds texte enfants et produit un ensemble de nœuds. Pas de surprise jusqu'ici. Maintenant, contains()
accepte un ensemble de nœuds en tant que premier argument, mais doit le convertir en chaîne pour faire son travail. Et la conversion d'un ensemble de nœuds en chaîne produit uniquement la valeur de chaîne du premier nœud de l'ensemble, tous les autres nœuds sont ignorés (essayez string(//item)
pour voir ce que je veux dire). Dans le cas simple, c'est exactement ce qui se produit également, mais le résultat n'est pas aussi surprenant.
L'expression B gère cela en vérifiant explicitement chaque nœud texte individuellement au lieu de vérifier uniquement la valeur de chaîne de l'ensemble de l'élément . C'est donc la plus robuste des deux.