Mule 根元素上的dataweave xml命名空间声明

Mule 根元素上的dataweave xml命名空间声明,mule,dataweave,Mule,Dataweave,我有一个dataweave脚本,可以生成一些xml %dw 1.0 %output application/xml skipNullOn="everywhere" %namespace soap http://www.w3.org/2003/05/soap-envelope %namespace ns http://www.mycompany/2015/07 --- { soap#Envelope: { soap#Header: { },

我有一个dataweave脚本,可以生成一些xml

%dw 1.0
%output application/xml skipNullOn="everywhere"
%namespace soap http://www.w3.org/2003/05/soap-envelope
%namespace ns http://www.mycompany/2015/07

---
{
    soap#Envelope: {
        soap#Header: {
        },
        soap#Body: {
            ns#GetVehDetails: {

                }
            }
        }
    }
}
它产生了这样的东西

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope">
  <soap:Header/>
  <soap:Body>
    <ns:GetVehDetails xmlns:ns="http://www.mycompany/2015/07">

如何更改dataweave脚本以在根元素处输出xml命名空间声明:

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" 
               xmlns:ns="http://www.mycompany/2015/07">
  <soap:Header/>
  <soap:Body>
    <ns:GetVehDetails>

这应该可以做到

%dw 1.0
%output application/xml skipNullOn="everywhere"
%namespace soap http://www.w3.org/2003/05/soap-envelope
%namespace ns http://www.mycompany/2015/07
---
{
    soap#Envelope @("xmlns:ns":'http://www.mycompany/2015/07'): {
        soap#Header: {
        },
        soap#Body: {
            ns#GetVehDetails: {

                }
            }
        }
    }
}

这应该能奏效

%dw 1.0
%output application/xml skipNullOn="everywhere"
%namespace soap http://www.w3.org/2003/05/soap-envelope
%namespace ns http://www.mycompany/2015/07
---
{
    soap#Envelope @("xmlns:ns":'http://www.mycompany/2015/07'): {
        soap#Header: {
        },
        soap#Body: {
            ns#GetVehDetails: {

                }
            }
        }
    }
}

这是一个旧的Dataweave问题,解决它的唯一方法如下:
您需要添加一个虚拟属性
@(ns#name:)
,其中的命名空间要位于最顶端的根标记的顶部,例如在本例中的
信封
标记

%dw 1.0
%output application/xml skipNullOn="everywhere"
%namespace soap http://www.w3.org/2003/05/soap-envelope
%namespace ns http://www.mycompany/2015/07

---
{
    soap#Envelope @(ns#name:""): {
        soap#Header: {
        },
        soap#Body: {
            ns#GetVehDetails: {

                }
            }
        }
    }

这是一个旧的Dataweave问题,解决它的唯一方法如下:
您需要添加一个虚拟属性
@(ns#name:)
,其中的命名空间要位于最顶端的根标记的顶部,例如在本例中的
信封
标记

%dw 1.0
%output application/xml skipNullOn="everywhere"
%namespace soap http://www.w3.org/2003/05/soap-envelope
%namespace ns http://www.mycompany/2015/07

---
{
    soap#Envelope @(ns#name:""): {
        soap#Header: {
        },
        soap#Body: {
            ns#GetVehDetails: {

                }
            }
        }
    }

不,您将在
GetVehDetails
上获得一个单独的命名空间定义。这是一个无效的dw脚本它在转换消息上无效,请尝试运行它。不,您将在
GetVehDetails
上获得一个单独的命名空间定义。这是一个无效的dw脚本它在转换消息上无效,请尝试运行它!这是一个故障安全解决方案还是有任何陷阱我需要知道?@AnirbanSenChowdhary此解决方案还包括ns:name=“”属性以及第一个属性。有解决方案吗?这是将名称空间置于信封级别顶部所必需的。。这实际上是Dataweave中的一个缺陷,通过这种方式,您可以将所有名称空间置于根元素的顶部。。。您可以在此处指定任何属性,而不是ns#name。。。这只是一个虚拟属性。。这是目前唯一的诀窍,你不能跳过虚拟属性..谢谢!这是一个故障安全解决方案还是有任何陷阱我需要知道?@AnirbanSenChowdhary此解决方案还包括ns:name=“”属性以及第一个属性。有解决方案吗?这是将名称空间置于信封级别顶部所必需的。。这实际上是Dataweave中的一个缺陷,通过这种方式,您可以将所有名称空间置于根元素的顶部。。。您可以在此处指定任何属性,而不是ns#name。。。这只是一个虚拟属性。。这是目前唯一的技巧,您不能跳过该虚拟属性。。