2010-09-14 40 views
19

Estoy usando XML y XQuerie. Usualmente uso una expresión XPath relativa a un nodo padre para recuperar su nodo hijo. Pero, no estoy seguro de cómo hacer el significado opuesto si tengo un nodo secundario, ¿cómo puedo recuperar su nodo padre?Cómo recuperar el nodo padre utilizando XQuery?

<node id="50> 
    <childnode1 childid="51" /> 
    <childnode2 childid="52" /> 
</node> 

Si tengo el nodo <childnode1 childid="51" />, ¿Cómo recupero su matriz: <node id="50>

+0

Buena pregunta (+1). Vea mi respuesta para algunas posibles soluciones. –

Respuesta

18

Respuesta corta:

.. 

Esto selecciona el padre del nodo actual (contexto).

más largo y más respuestas generales:

//node()[childnode1/@childid="51"] 

Esto selecciona cualquier nodo en el documento que tiene un elemento hijo llamado childnode1, que tiene un attibute childid, cuyo valor es '51'.

Se debe tratar de evitar una expresión que contenga la abreviatura //, porque puede ser muy ineficiente. Use '//' solo cuando la estructura del documento XML no se conozca de antemano.

Mejor respuesta:

ExpressionSelectingTheChildNode/.. 
3

utilizar .. para obtener la matriz, así:

../childnode1 

lo que si tiene alguna XML documento como este:

<a id="1"> 
    <b id="2"> 
    <c id="3"> 
     <d id="4"/> 
    </c> 
    <c id="5"/> 
    <c id="6"> 
     <d id="7"/> 
    </c> 
    </b> 
</a> 

luego XQuery

//../d[@id = "4"] 

volvería el nodo c con id de 3.

+0

Su expresión significa: * de todos los padres de nodos descendientes (lo mismo que todos los nodos que tienen un hijo) un hijo 'd' con el atributo' id' igual a '4' *. Entonces, no es lo que el OP está preguntando ... –

2

Aquí está un ejemplo más complejo de conseguir el nodo padre (..).

Q) Encuentra todas las situaciones donde el idioma más popular de un país es el menos popular de otro país, y ambos países enumeran más de un idioma. https://prod-c2g.s3.amazonaws.com/db/Winter2013/files/countries.xml

A)

for $b in doc("countries.xml")/countries/country/language 
for $c in doc("countries.xml")/countries/country/language 
where $b/../@name != $c/../@name 
and data($b) = data($c) 
and count($b/../language) > 1 
and count($c/../language) > 1 
and $b/@percentage = max($b/../language/@percentage) 
and $c/@percentage = min($c/../language/@percentage) 
return 
    <LangPair language="{data($b)}"> 
    <MostPopular>{data($b/../@name)}</MostPopular> 
    <LeastPopular>{data($c/../@name)}</LeastPopular> 
    </LangPair> 
0

Como alternativa, también puede hacer uso de la función fn:root() Xquery.

Cuestiones relacionadas