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

DataWeave重复键过滤:XML中指定Pronoun值的提取优化方案

可靠获取Workday XML中Pronoun对应Value的方案

问题背景

需要从给定的Workday XML响应里,找到<wd:Integration_Field_Override_Data>节点下,包含<wd:ID>值为Pronoun的对应<wd:Value>。现有代码靠ID的顺序(取第1个ID判断)来过滤,一旦ID生成顺序变了,逻辑就失效了,得换个更稳的实现方式。

原始XML数据

<?xml version="1.0" encoding="UTF-8"?>
<wd:Get_Workers_Response xmlns:wd="urn:com.workday/bsvc" wd:version="v33.0">
   <wd:Response_Data>
      <wd:Worker>
         <wd:Worker_Data>
            <wd:Worker_ID>1129</wd:Worker_ID>
            <wd:User_ID>126</wd:User_ID>
            <wd:Integration_Field_Override_Data>
               <wd:Field_Reference>
                  <wd:ID wd:type="WID">916f7f9977422e610e634</wd:ID>
                  <wd:ID wd:type="Integration_Document_Field_Name" wd:parent_type="Integration_Document_Name" wd:parent_id="INT005 - OVERRIDE SERVICE - WORKER">Position as of Hire</wd:ID>
               </wd:Field_Reference>
               <wd:Value>0086186</wd:Value>
            </wd:Integration_Field_Override_Data>
            <wd:Integration_Field_Override_Data>
               <wd:Field_Reference>
                  <wd:ID wd:type="WID">916f7f969d1b57422e610e734</wd:ID>
                  <wd:ID wd:type="Integration_Document_Field_Name" wd:parent_type="Integration_Document_Name" wd:parent_id="INT005 - OVERRIDE SERVICE - WORKER">Probation Period Outcome</wd:ID>
               </wd:Field_Reference>
            </wd:Integration_Field_Override_Data>
            <wd:Integration_Field_Override_Data>
               <wd:Field_Reference>
                  <wd:ID wd:type="WID">438411e0d12510b6d9a0000</wd:ID>
                  <wd:ID wd:type="Integration_Document_Field_Name" wd:parent_type="Integration_Document_Name" wd:parent_id="INT005 - OVERRIDE SERVICE - WORKER">Pronoun</wd:ID>
               </wd:Field_Reference>
               <wd:Value>He/They</wd:Value>
            </wd:Integration_Field_Override_Data>
         </wd:Worker_Data>
      </wd:Worker>
   </wd:Response_Data>
</wd:Get_Workers_Response>

现有问题代码

现有过滤逻辑依赖ID数组的索引位置,稳定性极差:

var pronounData = (worker.Worker_Data.*wd#Integration_Field_Override_Data filter((item, index) -> item.Field_Reference..*ID[1] == 'Pronoun')) default null

取值代码:

pronoun: pronounData[0].Value

可靠实现方案

不再卡ID的顺序,改成遍历所有<wd:ID>元素匹配Pronoun,还能结合wd:type属性进一步精准匹配,避免其他类型ID值巧合重复的情况。

基础改进版

直接检查所有ID里是否有值为Pronoun的项:

var pronounData = (worker.Worker_Data.*wd#Integration_Field_Override_Data filter(
    (item) -> exists(item.Field_Reference..*ID[. == 'Pronoun'])
)) default null

精准匹配版(推荐)

指定匹配wd:type="Integration_Document_Field_Name"的ID,逻辑更严谨:

var pronounData = (worker.Worker_Data.*wd#Integration_Field_Override_Data filter(
    (item) -> exists(item.Field_Reference..*ID[. == 'Pronoun' and @wd:type == 'Integration_Document_Field_Name'])
)) default null

取值代码优化

保留原有取值逻辑,添加默认值避免空指针:

pronoun: pronounData[0].Value default ''

用这套方案,不管<wd:ID>元素的顺序怎么变,都能准确拿到对应Pronoun的Value,最终预期输出为He/They。

内容的提问来源于stack exchange,提问作者Deeps

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 20:01:03