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>
关键说明
writeDeclaredNamespaces="None":禁止DataWeave自动将声明的命名空间添加到根节点或其他节点- 在
nsA#parent节点上通过@()显式添加xmlns:nsA和xmlns:nsB属性,使用xmlns#前缀来正确生成命名空间声明属性 - 子节点
nsB#child会继承父节点的命名空间声明,无需额外添加
内容的提问来源于stack exchange,提问作者Vish
相关产品推荐
相关产品推荐

