12 votes

Comment construire un xpath pour sélectionner des éléments qui ne contiennent pas une chaîne

Comment puis-je utiliser quelque chose de similaire à l'exemple ci-dessous, mais avec le résultat opposé, c'est-à-dire des éléments qui ne contiennent pas (default) dans le texte.

     Some text (default)
     Some more text
     Even more text

Étant donné cela

//test/item[not(contains(text(), '(default)'))]

retournerait le premier élément. Y a-t-il un opérateur not que je peux utiliser avec contains ?

19voto

Tomalak Points 150423

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X