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 attribu开发者_运维知识库tes 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 }
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}
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>
精彩评论