consulta XPath en el conjunto de nodos de trabajo como un SQL en donde
Pregunta
una muestra del documento XML:
<xml>
<list>
<item refid="1" />
<item refid="3" />
</list>
<catalogue>
<model id="1"><details /></model>
<model id="2"><details /></model>
<model id="3"><details /></model>
</catalogue>
</xml>
Me gustaría algo así como consulta // modelo [@ id = (// artículo / @ refid)] para obtener toda la "modelo" que tiene un ID de referencia en "lista"
Solución
Me gustaría algo así como la consulta // modelo [@id = (// artículo / @ refid)] para obtener todos "modelo" que tiene un referenciado id en "lista"
El problema principal aquí es su falta de confianza y no realmente hacer funcionar un motor de XPath para evaluar las expresiones que hemos llegado con.
Si se evalúa la expresión XPath usted propuso:
//model[ @id = (//item/@refid) ]
Se verá que selecciona exactamente los (dos) elementos model
, cuyos atributos id
son referenciados por el refid
atributos de elementos item
que son hijos de list
.
@ Jörn-Horstmann en su respuesta ya se ha explicado por qué obtener estos resultados.
Una observación menor es evitar generalmente usando el //
abreviatura . Hace que todo el documento que va a escanear y es muy ineficiente. En este caso me gustaría utilizar el equivalente pero probablemente más rápido para evaluar la expresión XPath:
/*/catalogue/model[@id = /*/list/item/@refid]
Otros consejos
Su expresión XPath ya debería devolver exactamente lo que quiere. Citando http://www.w3.org/TR/xpath/#booleans, quinto párrafo:
Si un objeto a comparar es un conjunto de nodos y el otro es una cadena, entonces la comparación será verdadera si y sólo si existe un nodo en el conjunto de nodos de tal manera que el resultado de realizar la comparación en el valor de cadena del nodo y la otra cadena es true