Como llegar nodo sin hijos en XQuery?
Pregunta
Así que tengo dos nodos de elementos que estoy esencialmente tratando de unirse. Quiero que el nodo de nivel superior para pasar la misma, pero los nodos secundarios que se sustituyen por las referencias cruzadas.
Teniendo en cuenta:
<stuff>
<item foo="foo" boo="1"/>
<item foo="bar" boo="2" />
<item foo="baz" boo="3"/>
<item foo="blah boo="4""/>
</stuff>
<list a="1" b="2">
<foo>bar</foo>
<foo>baz</foo>
</list>
Quiero bucle a través de "lista" y elementos de referencia cruzadas en "cosas" de este resultado:
<list a="1" b="2">
<item foo="bar" boo="2" />
<item foo="baz" boo="3"/>
</list>
Quiero hacer esto sin tener que saber de qué atributos podrían estar en la "lista". En otras palabras que no quiero tener que llamar explícitamente a cabo como
attribute a { $list/@a }, attribute b { $list/@b }
Solución
Uso:
$list1/item[@foo = $list2/item/@foo]
Esto selecciona todos los elementos <item>
en $list1
el valor de cuyo atributo foo
es igual al atributo foo
de uno de los elementos <item>
en $ list2.
Para copiar todos los atributos del elemento <list>
, hacer algo como esto
for $attr in /whateverIsthePathLeadingToList/list/@*
return
attibute {name($attr)} {$attr}
Otros consejos
Un poco más simple ... para crear un nuevo objeto a partir de una existente, pero sin sus hijos atributos de sólo
asumir:
dejó $ old_list: =
Esto crea una nueva lista de copiar sus atributos
<list>{$old_list/@*}</list>