Come ottenere nodo senza figli in XQuery?
Domanda
Così ho due nodi di elementi che sto essenzialmente cercando di aderire. Voglio che il nodo di livello superiore per rimanere lo stesso, ma i nodi figlio per essere sostituiti da quelli riferimenti incrociati.
Data:
<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>
Voglio ciclo attraverso la "lista" e gli elementi di riferimenti incrociati a "roba" per questo risultato:
<list a="1" b="2">
<item foo="bar" boo="2" />
<item foo="baz" boo="3"/>
</list>
Voglio fare questo senza che sia necessario conoscere quali attributi potrebbe essere sulla "lista". In altre parole io non voglio avere a chiamarli fuori come esplicitamente
attribute a { $list/@a }, attribute b { $list/@b }
Soluzione
Usa:
$list1/item[@foo = $list2/item/@foo]
Questo seleziona tutti gli elementi <item>
in $list1
il valore di cui attributo foo
è uguale all'attributo foo
di uno degli elementi <item>
a $ lista2.
Per copiare tutti gli attributi dell'elemento <list>
, fare qualcosa di simile :
for $attr in /whateverIsthePathLeadingToList/list/@*
return
attibute {name($attr)} {$attr}
Altri suggerimenti
Un po 'più semplice ... per creare un nuovo oggetto da uno esistente, ma senza i suoi figli solo gli attributi
assumere:
sia $ old_list: =
Questo crea un nuovo elenco di copiare i suoi attributi
<list>{$old_list/@*}</list>