如何使用MuleSoft DataWeave 2.0在XML中条件插入元素
问题:在DataWeave 2.0中匹配员工ID插入customString到XML
输入内容
输入XML
<?xml version='1.0' encoding='UTF-8'?> <HRPeopleMaster> <Employee> <EmployeeID>123456</EmployeeID> <LastName>surname1</LastName> <FirstName>abc</FirstName> </Employee> <Employee> <EmployeeID>56789</EmployeeID> <LastName>surname2</LastName> <FirstName>xyz</FirstName> </Employee> </HRPeopleMaster>
变量定义
var hroutput = [ {"customString": "10526","userId": "123456"},{"customString": "10551","userId": "45678"}]
需求说明
仅当vars.hroutput.userId与XML中Employee.EmployeeID完全匹配时,将对应的customString字段插入到该员工节点下;无匹配时,生成空的<customString/>元素,同时保留原XML中所有员工字段。
尝试的脚本及问题
尝试的DataWeave脚本:
{ HRPeopleMaster: { (payload.HRPeopleMaster.*Employee map ( employee , indexOfEmployee ) -> { Employee: { FirstName: employee.FirstName } ++ (customString: (hroutput.customString) filter (hroutput.userId contains employee.EmployeeID)) }) } }
出现的问题:
- 输出中出现重复的
customString元素 - 丢失了原XML中的
EmployeeID、LastName字段 - 匹配逻辑错误,只要
hroutput中有任意userId包含员工ID就会添加对应customString
解决方案
问题原因
- 过滤逻辑错误:原脚本中
hroutput.userId contains employee.EmployeeID是检查所有hroutput的userId是否包含员工ID,而非精确匹配单个对象,导致多个customString被添加。 - 字段丢失:脚本仅保留了
FirstName字段,没有保留原Employee节点的其他信息。 - 空元素处理缺失:未明确设置无匹配时的空元素生成逻辑。
正确的DataWeave脚本
%dw 2.0 output application/xml var hroutput = [ {"customString": "10526","userId": "123456"},{"customString": "10551","userId": "45678"}] --- { HRPeopleMaster: { (payload.HRPeopleMaster.*Employee map (employee) -> { Employee: employee ++ { customString: (hroutput filter ($.userId == employee.EmployeeID))[0].customString default "" } }) } }
脚本说明
- 保留原字段:
employee ++ {...}确保原Employee节点的所有字段(如EmployeeID、LastName、FirstName)都被保留,仅追加customString元素。 - 精确匹配:
hroutput filter ($.userId == employee.EmployeeID)过滤出与当前员工ID精确匹配的对象,取第一个结果(假设userId唯一)。 - 空元素处理:
default ""表示当无匹配结果时,将customString的值设为空字符串,XML输出会自动转换为<customString/>空元素。
最终输出
<?xml version='1.0' encoding='UTF-8'?> <HRPeopleMaster> <Employee> <EmployeeID>123456</EmployeeID> <LastName>surname1</LastName> <FirstName>abc</FirstName> <customString>10526</customString> </Employee> <Employee> <EmployeeID>56789</EmployeeID> <LastName>surname2</LastName> <FirstName>xyz</FirstName> <customString/> </Employee> </HRPeopleMaster>
内容的提问来源于stack exchange,提问作者Shree
相关产品推荐
相关产品推荐

