2012-06-13 9 views
42

que tienen algún XML que se estructura como esta:¿Cómo se usa no contiene() en xpath?

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

y necesito para seleccionar cada producción con una categoría que no contiene "negocios" (por lo que sólo la primera producción en este ejemplo).

¿Es esto posible con xpath? Intenté trabajar en estas líneas, pero no conseguí nada:

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

Respuesta

79

Las consultas XPath distinguen entre mayúsculas y minúsculas. Después de haber analizado su ejemplo (que, por cierto, es impresionante, nadie parece dar ejemplos más!), Puedo conseguir el resultado deseado con sólo cambiar "negocio", a "negocios"

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

I He probado esto abriendo el archivo XML en Chrome, y usando las herramientas Developer para ejecutar esas consultas XPath, y me devolvió la categoría Film.

24

necesito para seleccionar cada producción con una categoría que no contiene "negocios"

Aunque upvoted @ respuesta de Arran como correcta, También me gustaría añadir esta ... interpretarse en sentido estricto, especificación de la OP se implementa como

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

en lugar de

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

Este último selecciona cada producción cuyo primercategory niño no contiene "Negocio". Las dos expresiones XPath se comportarán de manera diferente cuando production no tiene hijos category, o más de uno.

No hace ninguna diferencia en la práctica, siempre y cuando cada <production> tenga exactamente un hijo , como en su breve ejemplo XML. Si siempre puede contar con que eso sea cierto o no, depende de varios factores, como si tiene un esquema que aplique esa restricción. Personalmente, optaría por la opción más robusta, ya que no "cuesta mucho" ... suponiendo que su requerimiento como se establece en la pregunta es realmente correcto (en lugar de, por ejemplo, "seleccionar cada producción que no tiene una categoría"). que contiene "Negocio").

+0

@LoamyHound: Gracias para la corrección! Finalmente vi tu respuesta, y arreglé el soporte faltante, más de 2 años después. – LarsH

1

Puede utilizar not(expression) función

not() es una función en XPath (en contraposición a un operador)

Ejemplo:

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

O

expression != true()