2010-10-11 18 views
5

Un lugar sencillo problema ... Fragmento XML:¿Cómo selecciono los nodos que NO tienen un nodo hijo particular?

<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> 

Estoy intentando escribir una consulta XPath que seleccionará todos bean s que no tienen un <property name="wattage">.

No sé cómo decir "frijoles que no tienen este niño" en xpath.

Tenga en cuenta que no puedo confiar en que la propiedad "eléctrica" ​​sea falsa cada vez que falta la "potencia". (también, este ejemplo es un poco artificial).

Gracias :)

+0

@ Here-Be-Wolves: Buena pregunta (+1). Vea mi respuesta para la expresión XPath más simple/más corta hasta ahora, y su explicación. –

Respuesta

5

bien, después de un poco de investigación he descubierto:

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

simple hecho: P

+0

@ Here-Be-Wolves: Un problema menor: no hay ningún elemento llamado 'beans' en el XML proporcionado ... –

+0

por supuesto, quise decir" bean ". gracias por señalar. – jrharshath

3

Trate

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

En caso de que el actual nodo es el elemento padre de los elementos bean, una expresión XPath que selecciona los elementos deseados es:

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

Esta es probablemente la más simple expresión, tales (sólo tiene un único predicado).

Esta expresión traducida en Inglés dice:

Seleccionar todos bean hijos del nodo actual para los que no name atributo de cualquiera de sus hijos property es la cadena "wattage".

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

Creo que esta consulta devolverá nodos como '', porque existe una propiedad ('electric') cuyo @name no es' wattage'. –

Cuestiones relacionadas