为现有XML根标签添加ns0命名空间前缀后属性丢失问题
问题:XML根标签添加命名空间前缀后丢失原有属性
我需要为现有XML的根标签添加命名空间及前缀ns0,使用了如下DataWeave代码进行操作,但输出结果中根标签的原有属性全部丢失。请参考以下输入示例与预期输出,求解决方法!
原DataWeave代码
%dw 2.0 output application/xml writeDeclaredNamespaces="All" ns ns0 http://Test.Sample.data/1.0 --- ns0#trans: payload.trans
原始XML输入
<?xml version='1.0' encoding='UTF-8'?> <trans xmlns:ns0="http://Test.Sample.data/1.0" id="1495144" TPId='4aec' change='0' count='1' dateStamp="2024-08-02T03:07:48" effectiveDate="2024-08-01" transId="12447055"> <data id="FF2AD08D621"> <StateFlag>0</StateFlag> <DCC>B</DCC> <LastName>MMNGorthy</LastName> <Name>Scott</Name> <Structure>NonProfit</Structure> <BusinessType>Engineering</BusinessType> <meams>AI</meams> <Count>0</Count> <CTier>000</CTier> <CTCond>111</CTCond> <CTPl>222</CTPl> <DO>1</DO> <AuthObject>0</AuthObject> </data> </trans>
预期输出(带ns0前缀且保留属性)
<?xml version='1.0' encoding='UTF-8'?> <ns0:trans xmlns:ns0="http://Test.Sample.data/1.0" id="1495144" TPId='4aec' change='0' count='1' dateStamp="2024-08-02T03:07:48" effectiveDate="2024-08-01" transId="12447055"> <data id="FF2AD08D621"> <StateFlag>0</StateFlag> <DCC>B</DCC> <LastName>MMNGorthy</LastName> <Name>Scott</Name> <Structure>NonProfit</Structure> <BusinessType>Engineering</BusinessType> <meams>AI</meams> <Count>0</Count> <CTier>000</CTier> <CTCond>111</CTCond> <CTPl>222</CTPl> <DO>1</DO> <AuthObject>0</AuthObject> </data> </ns0:trans>
解决方法
原代码ns0#trans: payload.trans仅提取了trans元素的子内容,没有保留其属性。要同时保留属性、子元素并添加命名空间前缀,可通过以下两种方式实现:
方法1:使用update操作符修改原元素
%dw 2.0 output application/xml writeDeclaredNamespaces="All" ns ns0 http://Test.Sample.data/1.0 --- payload update { case trans at .trans -> ns0#trans @(trans.*@): trans.* }
方法2:直接构造带属性的命名空间元素
%dw 2.0 output application/xml writeDeclaredNamespaces="All" ns ns0 http://Test.Sample.data/1.0 --- ns0#trans @(payload.trans.*@): payload.trans.*
代码说明
@(payload.trans.*@):复制原根标签trans的所有属性payload.trans.*:保留原根标签下的所有子元素ns0#trans:为根标签添加指定的命名空间前缀
这样处理后,输出的XML会同时保留原有属性和子内容,并且根标签带上ns0前缀。
内容的提问来源于stack exchange,提问作者Zak01
相关产品推荐
相关产品推荐

