web-dev-qa-db-fra.com

Comment utiliser ne contient pas () dans xpath?

J'ai du XML structuré comme ceci:

<whatson>
  <productions>    
    <production>
      <category>Film</category>
    </production>
    <production>
      <category>Business</category>
    </production>
    <production>
      <category>Business training</category>
    </production>
  </productions>
</whatson>

Et je dois sélectionner chaque production avec une catégorie qui ne contient pas "Business" (donc juste la première production dans cet exemple).

Est-ce possible avec xpath? J'ai essayé de travailler dans ce sens mais je n'ai abouti à rien:

//production[not(contains(category,'business'))]
53
Jason

Les requêtes XPath sont sensibles à la casse. Après avoir examiné votre exemple (qui, d’ailleurs, est génial, personne ne semble plus en donner d’exemples!), Je peux obtenir le résultat souhaité en changeant simplement "business" pour "Business"

//production[not(contains(category,'Business'))]

J'ai testé cela en ouvrant le fichier XML dans Chrome et en utilisant les outils de développement pour exécuter les requêtes XPath. Cela m'a ramené la catégorie Film.

98
Arran

Je dois sélectionner chaque production avec une catégorie qui ne contient pas "Business"

Bien que j'aie voté positivement comme réponse de la réponse de @ Arran, j'ajouterais également ceci: __________, interprété de manière stricte, la spécification de l'OP serait mise en œuvre de la manière suivante:

//production[category[not(contains(., 'Business'))]]

plutôt que

//production[not(contains(category, 'Business'))]

Ce dernier sélectionne chaque production dont l’enfant first category ne contient pas "Business". Les deux expressions XPath se comporteront différemment lorsqu'une variable production n'aura pas d'enfants category ou plusieurs.

En pratique, cela ne fait aucune différence tant que chaque <production> a exactement un <category> enfant, comme dans votre court exemple XML. Le fait de savoir si cela est toujours vrai ou non dépend de divers facteurs, tels que la présence d'un schéma appliquant cette contrainte. Personnellement, j'opterais pour l'option la plus robuste, car elle ne "coûte" pas beaucoup ... en supposant que votre besoin, comme indiqué dans la question, soit vraiment correct (par opposition à "par exemple, sélectionnez chaque production qui n'a pas de catégorie qui contient "Business" ').

25
LarsH

Vous pouvez utiliser la fonction not(expression)

not() est une fonction dans xpath (par opposition à un opérateur)

Exemple:

//a[not(contains(@id, 'xx'))]

OR

expression != true()
1
Shubham Jain

Devrait être // production [pas (contient (catégorie, 'entreprise'))]]

0
bace