2010-10-06 167 views
10

Quiero extraer valor de nombre de atributo de la etiqueta siguienteconsulta XPath cómo obtener el valor de un atributo basado en dos atributos

<application 
    comments="Do not erase this one" 
    executable="run_CIET" 
    icon="default" 
    instances="1" 
    mode="1" 
    name="CIET" 
    order="10" 
    selection="1" 
    tool="y" 
/> 

puedo conseguir fácilmente valor de valor de nombre de atributo basado en el valor del modo como se muestra a continuación

xpath Applications.xml '//applications/application[@mode='3']'/@name 

Pero si quiero añadir más condtion de que es "obtener el nombre de valor de atributo cuando el modo = X y el atributo herramienta no existe en la etiqueta de aplicación"

Cómo lo hacemos º ¿es? Intenté algo como

xpath Applications.xml '//applications/application[@mode='3' and [email protected]]'/@name 

pero no funciona.

No he usado XPath antes y me resulta complicado Buscar la ayuda de W3C en XPath pero no encontré lo que quería. Por favor ayuda.

+0

Buena pregunta, +1. Consulte mi respuesta para obtener una explicación de su problema, una solución breve y completa y algunas recomendaciones. :) –

Respuesta

16
How do we do this? I tried something like 

    xpath Applications.xml '//applications/application[@mode='3' and [email protected]]'/@name 

but its not working. 



[email protected] 

es sintaxis no válida en XPath. Hay un operador !=, pero ningún operador !.

Uso:

//applications/application[@mode='3' and not(@tool)]/@name 

Hay dos cosas que siempre debe tratar de evitar:

  1. utilizando el operador != - tiene raro definición y no se comporta como el not() función --no la use si uno de los operandos es un conjunto de nodos.

  2. Intente evitar tanto como sea posible utilizando la abreviatura // - esto puede causar una ineficiencia significativa y también un comportamiento anómalo que no es aparente para la mayoría de las personas.

5

El uso de not(@tool) en lugar de [email protected] debería hacer el trabajo. Si su motor XPath no se comporta puede concebir count(@tool)=0, pero eso no debería ser necesario.

Cuestiones relacionadas