You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 14:40:47