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"

¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top