2010-07-08 22 views
76

En Xpath, deseo seleccionar elementos que igualen un valor específico.XPath - Selección de elementos que equivalen a un valor

muestra de datos XML:

<aaa id="11" > 
    <aaa id="21" > 
     <aaa id="31" ></aaa> 
     <bbb id="32" > 
      <aaa id="41" ></aaa> 
      <bbb id="42" ></bbb> 
      <ccc id="43" ></ccc> 
      <ddd id="44" >qwerty</ddd> 
      <ddd id="45" ></ddd> 
      <ddd id="46" ></ddd> 
     </bbb> 
    </aaa> 
    <bbb id="22" > 
     <aaa id="33" >qwerty</aaa> 
     <bbb id="34" ></bbb> 
     <ccc id="35" ></ccc> 
     <ddd id="36" ></ddd> 
     <ddd id="37" ></ddd> 
     <ddd id="38" ></ddd> 
    </bbb> 
    <ccc id="23" >qwerty</ccc> 
    <ccc id="24" ></ccc> 
</aaa> 

Ahora, utilizando el XPath:

//ccc[.='qwerty'] 

consigo las correctas, esperados resultados:

Name Value 
ccc  qwerty 

Ahora, utilizando el XPath :

//aaa[.='qwerty'] 

me sale inesperados resultados:

Name Value 
aaa  
aaa  qwerty 

Y lo que me interesa especialmente, es cómo seleccionar cualquier elemento con ese valor

XPath:

//*[.='qwerty'] 

me pongo muy extraño inesperados resultados:

Name Value 
aaa 
bbb 
ddd  qwerty 
bbb  qwerty 
aaa  qwerty 
ccc  qwerty 

Puede alguien explicar estos resultados, y cómo solucionar mis expresiones XPath para obtener resultados más esperados?

+0

Porque XPath '. = 'es diferente a XPath' text() = '. Consulte [** los nodos coincidentes de texto son diferentes a los valores de cadena coincidentes **] (http://stackoverflow.com/a/34595441/290085) para saber por qué. – kjhughes

Respuesta

126

La especificación XPath. define el valor de cadena de un elemento como la concatenación (en orden de documento) de todos sus descendientes de nodo de texto.

Esto explica los "resultados extraños".

resultados "mejor" se pueden obtener usando las expresiones a continuación:

//*[text() = 'qwerty'] 

Lo anterior selecciona cada elemento en el documento que tiene al menos un hijo texto-nodo con valor 'QWERTY'.

//*[text() = 'qwerty' and not(text()[2])] 

Los selecciona por encima de cada elemento en el documento que tiene un solo hijo texto-nodo y su valor es: 'QWERTY'.

+0

Gracias! Eso funciona .. No sabía sobre el texto() .. ¿Cuál es su definición? – developer

+3

@iHeartGreek: Me alegro de que funcione. ¿Qué hay de aceptar/subir la votación?'text()' es una de las posibles * pruebas de nodo * en XPath, que significa "¿es este un nodo de texto?". Otros nodos son 'comment()', 'processing-instruction()', o simplemente 'node()'. –

12

Trate

//*[text()='qwerty'] porque . es su actual elemento

+1

Gracias! Eso funciona .. No sabía sobre el texto() .. ¿Cuál es su definición? – developer

Cuestiones relacionadas