En Xpath, quiero seleccionar elementos que igualen un valor específico.
Datos XML de muestra:
<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, usando XPath:
//ccc[.='qwerty']
Obtengo los resultados correctos y esperados :
Name Value
ccc qwerty
Ahora, usando XPath:
//aaa[.='qwerty']
Obtengo resultados inesperados :
Name Value
aaa
aaa qwerty
Y lo que me interesa especialmente es cómo seleccionar cualquier elemento con ese valor
XPath:
//*[.='qwerty']
Obtengo resultados inesperados muy extraños :
Name Value
aaa
bbb
ddd qwerty
bbb qwerty
aaa qwerty
ccc qwerty
¿Alguien puede explicar estos resultados y cómo corregir mis expresiones XPath para obtener los resultados más esperados?
. =
es diferente a XPathtext() =
. Ver los nodos de texto coincidentes es diferente a los valores de cadena coincidentes para saber por qué.Respuestas:
La especificación XPath. define el valor de cadena de un elemento como la concatenación (en el orden del documento) de todos sus descendientes de nodos de texto .
Esto explica los "resultados extraños".
Se pueden obtener resultados "mejores" utilizando las siguientes expresiones:
Lo anterior selecciona todos los elementos del documento que tienen al menos un hijo de nodo de texto con el valor 'qwerty'.
Lo anterior selecciona todos los elementos del documento que tienen solo un hijo de nodo de texto y su valor es: 'qwerty'.
fuente
text()
es una de las posibles pruebas de nodo en XPath, lo que significa "¿es este un nodo de texto?". Otros nodetests soncomment()
,processing-instruction()
o simplementenode()
.Tratar
//*[text()='qwerty']
porque.
es tu elemento actualfuente