在mule dataweave中组合来自不同父数组的JSON数组

在mule dataweave中组合来自不同父数组的JSON数组,mule,dataweave,Mule,Dataweave,我有一个类似下面的JSON { "packages": [ { "screenings": [ { "data": { "educationHistory": [ { "school": "Test educat

我有一个类似下面的JSON

{
    "packages": [
        {
            "screenings": [
                {
                    "data": {
                        "educationHistory": [
                            {
                                "school": "Test education 4"
                            },
                            {
                                "school": "Test education 4"
                            }
                        ]

                    }
                },
                {
                    "data": {
                        "educationHistory": [
                            {
                                "major": [
                                    "Business Admin."
                                ],
                                "school": "Test education 1"
                            },
                            {
                                "major": [
                                    "Business Admin."
                                ],
                                "school": "Test education 1"
                            }
                        ]

                    }
                }
            ]
        }
    ]
}
<ns0:EmploymentHistory>
    <ns0:Employer>
      <ns0:EmployerName>
        <school>Test education 4</school>
      </ns0:EmployerName>
    </ns0:Employer>
    <ns0:Employer>
      <ns0:EmployerName>
        <school>Test education 4</school>
      </ns0:EmployerName>
    </ns0:Employer>
    <ns0:Employer>
      <ns0:EmployerName>
        <school>Test education 1</school>
      </ns0:EmployerName>
    </ns0:Employer>
    <ns0:Employer>
      <ns0:EmployerName>
        <school>Test education 1</school>
      </ns0:EmployerName>
    </ns0:Employer>
</ns0:EmploymentHistory>
在dataweave中,我是这样写的

ns0#EmploymentHistory: {(
    payload.packages[0].screenings.data.educationHistory map {
        ns0#Employer: {
            ns0#EmployerName: $.school
        }
    }
)}
我得到这样的输出

<ns0:EmploymentHistory>
<ns0:Employer>
  <ns0:EmployerName>
    <school>Test education 4</school>
    <school>Test education 4</school>
  </ns0:EmployerName>
</ns0:Employer>
<ns0:Employer>
  <ns0:EmployerName>
    <school>Test education 1</school>
    <school>Test education 1</school>
  </ns0:EmployerName>
</ns0:Employer>
</ns0:EmploymentHistory>

测试教育4
测试教育4
测试教育1
测试教育1
我需要像下面这样的

{
    "packages": [
        {
            "screenings": [
                {
                    "data": {
                        "educationHistory": [
                            {
                                "school": "Test education 4"
                            },
                            {
                                "school": "Test education 4"
                            }
                        ]

                    }
                },
                {
                    "data": {
                        "educationHistory": [
                            {
                                "major": [
                                    "Business Admin."
                                ],
                                "school": "Test education 1"
                            },
                            {
                                "major": [
                                    "Business Admin."
                                ],
                                "school": "Test education 1"
                            }
                        ]

                    }
                }
            ]
        }
    ]
}
<ns0:EmploymentHistory>
    <ns0:Employer>
      <ns0:EmployerName>
        <school>Test education 4</school>
      </ns0:EmployerName>
    </ns0:Employer>
    <ns0:Employer>
      <ns0:EmployerName>
        <school>Test education 4</school>
      </ns0:EmployerName>
    </ns0:Employer>
    <ns0:Employer>
      <ns0:EmployerName>
        <school>Test education 1</school>
      </ns0:EmployerName>
    </ns0:Employer>
    <ns0:Employer>
      <ns0:EmployerName>
        <school>Test education 1</school>
      </ns0:EmployerName>
    </ns0:Employer>
</ns0:EmploymentHistory>

测试教育4
测试教育4
测试教育1
测试教育1

此xpath
payload.packages[0].screenings.data.educationHistory映射{
循环通过
筛选
教育历史

您需要使用后代选择器
,一次获取所有
教育历史
值。这将从父元素搜索整个树(在本例中为
有效负载.packages[0]
),并获取每个匹配的子元素(在本例中为
educationHistory
)。由于
educationHistory
在这两个实例中都是一个数组,因此这将返回一个数组,因此我们需要使用
展平
,因此我们有一个对象数组:

%dw 1.0
%output application/xml

%var employers = flatten payload.packages[0]..educationHistory
---
{
  EmploymentHistory: {
    (employers map {
      Employer: {
        EmployerName: {
          School: $.school
        }
      }
    })
  }
}
您可以找到有关后代选择器的信息。以下是MuleSoft的官方词汇:

[子体选择器]使用
的形式应用于上下文,并检索当前上下文下子树中所有匹配键:值对的值。无论这些字段组织在何种层次结构中,它们都位于输出中的同一级别