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 }
¿Fue útil?

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>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top