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

Mule 4.4.0中如何将XML命名空间移至指定非根父节点

如何在DataWeave 2.0中把XML命名空间声明在指定非根父节点?

目标是生成如下XML,要求两个命名空间nsA和nsB都声明在nsA:parent节点上:

<?xml version='1.0' encoding='UTF-8'?>
<batch>
  <nsA:parent xmlns:nsA="http://www.testA.com/core" xmlns:nsB="http://www.testB.com/core">
    <nsB:child>ChildNodeValue</nsB:child>
  </nsA:parent>
</batch>

已尝试的方案

第一次尝试

脚本:

%dw 2.0
output application/xml
ns nsA http://www.testA.com/core
ns nsB http://www.testB.com/core

---
batch: {
    (payload map ((item, index) -> {
        nsA#parent:{
            nsB#child:"ChildNodeValue"
        }
    })
 )}

输出结果:

<?xml version='1.0' encoding='UTF-8'?>
<batch>
  <nsA:parent xmlns:nsA="http://www.testA.com/core">
    <nsB:child xmlns:nsB="http://www.testB.com/core">ChildNodeValue</nsB:child>
  </nsA:parent>
</batch>

问题:nsB命名空间被自动声明在子节点上,不符合要求。

第二次尝试(使用writeDeclaredNamespaces="All")

脚本:

%dw 2.0
output application/xml writeDeclaredNamespaces="All"
ns nsA http://www.testA.com/core
ns nsB http://www.testB.com/core

---
batch: {
    (payload map ((item, index) -> {
        nsA#parent:{
            nsB#child:"ChildNodeValue"
        }
    })
 )}

输出结果:

<?xml version='1.0' encoding='UTF-8'?>
<batch xmlns:nsA="http://www.testA.com/core" xmlns:nsB="http://www.testB.com/core">
  <nsA:parent>
    <nsB:child>ChildNodeValue</nsB:child>
  </nsA:parent>
</batch>

问题:两个命名空间都被声明在根节点batch上,不符合要求。

解决方案

通过显式在目标节点添加命名空间属性,并关闭DataWeave自动处理命名空间的功能来实现:

%dw 2.0
output application/xml writeDeclaredNamespaces="None"
ns nsA http://www.testA.com/core
ns nsB http://www.testB.com/core

---
batch: {
    (payload map ((item, index) -> {
        nsA#parent @(
            xmlns#nsA: "http://www.testA.com/core",
            xmlns#nsB: "http://www.testB.com/core"
        ): {
            nsB#child: "ChildNodeValue"
        }
    })
 )}

输出结果

<?xml version='1.0' encoding='UTF-8'?>
<batch>
  <nsA:parent xmlns:nsA="http://www.testA.com/core" xmlns:nsB="http://www.testB.com/core">
    <nsB:child>ChildNodeValue</nsB:child>
  </nsA:parent>
</batch>

关键说明

  1. writeDeclaredNamespaces="None":禁止DataWeave自动将声明的命名空间添加到根节点或其他节点
  2. 在nsA#parent节点上通过@()显式添加xmlns:nsA和xmlns:nsB属性,使用xmlns#前缀来正确生成命名空间声明属性
  3. 子节点nsB#child会继承父节点的命名空间声明,无需额外添加

内容的提问来源于stack exchange,提问作者Vish

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 23:52:56