如何用XQuery更新节点全部属性并保留子节点?
替换XML节点属性同时保留子节点的实现方法
问题场景
现有带属性和子节点的原始节点:
<node attr1="value1" attr2="value2"><child1/><child2/></node>
需要用另一个节点的属性完全替换它的属性,同时保留子节点。用于替换的节点:
<node attr1="value1_new" attr3="value3_new"/>
最终期望结果:
<node attr1="value1_new" attr3="value3_new"><child1/><child2/></node>
错误操作
直接替换整个节点会导致子节点丢失:
let $replacement := <node attr1="value1_new" attr3="value3_new"/> replace node /node[1] with $replacement
正确实现
方法一:Copy-Modify 语法
复制原始节点后,先清空原有属性,再插入新属性:
let $replacement := <node attr1="value1_new" attr3="value3_new"/> copy $orig := /node[1] modify ( -- 删除原节点所有属性 delete node $orig/@*, -- 添加替换节点的所有属性 insert node $replacement/@* into $orig ) return $orig
方法二:直接构造新节点
创建与目标节点同名的新元素,组合替换节点的属性和原节点的子节点:
let $target := /node[1] let $replacement := <node attr1="value1_new" attr3="value3_new"/> return element {node-name($target)} { $replacement/@*, $target/node() }
这两种方式都能实现完全替换属性(删除原节点中不存在于替换节点的属性),同时完整保留所有子节点。
内容的提问来源于stack exchange,提问作者haael
相关产品推荐
相关产品推荐

