Reputation: 5165
So I have two nodes of elements that I'm essentially trying to join. I want the top level node to stay the same but the child nodes to be replaced by those cross referenced.
Given:
<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>
I want to loop through "list" and cross reference elements in "stuff" for this result:
<list a="1" b="2">
<item foo="bar" boo="2" />
<item foo="baz" boo="3"/>
</list>
I want to do this without having to know about what attributes might be on "list". In other words I don't want to have to explicitly call them out like
attribute a { $list/@a }, attribute b { $list/@b }
Upvotes: 5
Views: 3367
Reputation: 3732
Slightly simplier ... to create a new object from an existing one, but without its children only attributes
assume :
let $old_list :=
This creates a new list copying its attributes
<list>{$old_list/@*}</list>
Upvotes: 4
Reputation: 243529
Use:
$list1/item[@foo = $list2/item/@foo]
This selects all <item>
elements in $list1
the value of whose foo
attribute is equal to the foo
attribute of one of the <item>
elements in $list2.
In order to copy all attributes of the <list>
element, do something like this:
for $attr in /whateverIsthePathLeadingToList/list/@*
return
attibute {name($attr)} {$attr}
Upvotes: 4