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

如何使用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

解决方案

问题原因

  1. 过滤逻辑错误:原脚本中hroutput.userId contains employee.EmployeeID是检查所有hroutput的userId是否包含员工ID,而非精确匹配单个对象,导致多个customString被添加。
  2. 字段丢失:脚本仅保留了FirstName字段,没有保留原Employee节点的其他信息。
  3. 空元素处理缺失:未明确设置无匹配时的空元素生成逻辑。

正确的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 07:35:32