2010-10-11 6 views
5

Ein ziemlich einfaches Problem ... XML-Fragment:Wie wähle ich Knoten aus, die keinen bestimmten untergeordneten Knoten haben?

<bean id='Juicer'> 
    <property name="electric"> 
     <value>false</value> 
    </property> 
</bean> 

<bean id='Oven'> 
    <property name="electric"> 
     <value>true</value> 
    </property> 
    <property name="wattage"> 
     <value>1000</value> 
    </property> 
</bean> 

Ich versuche, eine XPath-Abfrage zu schreiben, die alle bean s wählt, die keine <property name="wattage"> haben.

Ich kann nicht herausfinden, wie "Bohnen nicht dieses Kind" in Xpath sagen.

Beachten Sie, dass ich mich nicht darauf verlassen kann, dass die "elektrische" Eigenschaft jedes Mal falsch ist, wenn die "Wattzahl" fehlt. (Auch dieses Beispiel ist irgendwie erfunden).

Thanks :)

+0

@ Hier-sein-Wölfe: Gute Frage (+1). Sehen Sie meine Antwort für den bisher einfachsten/kürzesten XPath-Ausdruck und seine Erklärung. –

Antwort

5

Okay, nach einem kleinen Graben dachte ich es aus:

//bean[not (property[@name='wattage'])] 

Einfach in der Tat: P

+0

@ Here-Be-Wolves: Ein kleines Problem: Es gibt kein Element mit dem Namen "Bohnen" in Ihrer bereitgestellten XML ... –

+0

natürlich meinte ich "Bean". Danke für das Aufzeigen. – jrharshath

3

Bei

//bean[not(property[@name='wattage'])] 
1

Versuchen Sie, die aktuelle Knoten ist das übergeordnete Element der bean Elemente, ein XPath-Ausdruck, um die gewünschten Elemente ausgewählt ist:

bean[not(property/@name = 'wattage')] 

Dies ist wahrscheinlich der einfachste solchen Ausdruck (nur ein einziges Prädikat).

Dieser Ausdruck in Englisch übersetzt sagt:

Wählen Sie alle bean Kinder des aktuellen Knotens, für die kein name Attribut eines ihrer property Kinder ist die Zeichenfolge "wattage".

0
//bean[not(@name = 'wattage')] 
+1

Ich glaube, dass diese Abfrage Knoten wie '' zurückgibt, weil es eine Eigenschaft ('electric') gibt, deren @name nicht' wattage' ist. –

Verwandte Themen