2010-10-01 3 views
12

Compte tenu de ceci:xPath: Sélectionnez l'élément parent seulement si l'élément de l'enfant ne contient pas une certaine valeur

<element_1> 
    <element_2>Text</element_2> 
    <element_3> 
     <element_4> 
      <element_5>Text with @ in Value</element_5> 
     </element_4> 
     <element_4> 
      <element_5>Test Text</element_5> 
     </element_4> 
    </element_3> 
    <element_6> 
     <element_7> 
      <element_8>0</element_8> 
... 

Comment puis-je sélectionner toutes les instances de ELEMENT_1 qui ne pas contiennent un « @ » dans element_5?

+0

Bonne question (+1). Voir ma réponse pour une expression XPath générale qui sélectionne tous les éléments requis dans un document - lorsque la structure du document n'est pas connue à l'avance. –

Répondre

14
element_1[not(contains(element_3/element_4/element_5,'@'))] 

Cela est interprété comme

element_1[       #select elements named "element_1" 
    not(contains(     #that do not contain 
    element_3/element_4/element_5, #children in this hierarchy 
    '@'        #the character @ 
)) 
] 
+1

Faut-il précéder // avant element_1? – Snekse

+0

Cela dépend si vous voulez faire correspondre element_1 à n'importe quel niveau, ou si c'est toujours la racine du DOM. – dty

+1

Notez également que cette solution suppose que element_5 est toujours directement sous element_4, qui est lui-même toujours directement sous element_3, lequel est toujours directement sous element_1. Les deux autres solutions supposent que element_5 peut apparaître à n'importe quel niveau sous element_1. – dty

0
element1[not(contains(.//element_5, '@'))] 
+0

Qu'est-ce qui se passe avec le downvote? –

6

Mon XPath est un peu rouillé, mais quelque chose comme ceci:

//element_1[.//element_5[not(contains(., "@"))]] 
+0

Nous sommes un petit peu difficile et ne recommande pas l'opérateur '//' quand le schéma est bien connu ... –

+0

C'est bien. Le PO n'était pas spécifique à ce sujet. – dty

+1

Pourquoi le down-rank? Au moins avoir la décence de laisser un message disant pourquoi vous avez classé en bas, qui que vous soyez. – dty

4

Comment puis-je sélectionner toutes les instances de element_1 qui ne contient pas un '@' dans element_5?

Utilisation:

//element_1[not(.//element_5[contains(.,'@')])] 

En anglais, cela signifie: Sélectionnez tous "element_1" éléments du document qui ne disposent pas d'une chaîne dont la valeur descendant "element_5" contient la chaîne '@'.

J'utilise l'abréviation // uniquement parce que la structure du fichier XML n'est pas claire.

Je recommande toujours d'éviter d'utiliser l'abréviation // toujours lorsque cela est possible, car cela pourrait entraîner une évaluation XPath très inefficace.

+1

@ Mads-Hansen: Merci pour les modifications, mais "descendant" est un mot anglais valide. –

Questions connexes