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 }
È stato utile?

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>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top