通过组合字段来重新格式化XML有效负载

问题描述

我有一个传入的有效负载,看起来像这样:

<?xml version="1.0" encoding="UTF-8"?>
<DATA_DS>
    <G_1>
        <ORDERED_QTY>1</ORDERED_QTY>
        <ORIGINAL_SOURCE_ORDER_NUMBER>ANAND1212</ORIGINAL_SOURCE_ORDER_NUMBER>
        <SOURCE_TRANSACTION_ID>12</SOURCE_TRANSACTION_ID>
        <SOURCE_TRANSACTION_SYstem>XYZ</SOURCE_TRANSACTION_SYstem>
        <REQUESTOR_NAME>Mickey Mouse</REQUESTOR_NAME>
        <CONTACT_EMAIL>mickey.mouse@disney.com</CONTACT_EMAIL>
        <CREATED_BY_EMAIL>donald.duck@disney.com</CREATED_BY_EMAIL>
        <ORDER_TYPE_CODE>SRO</ORDER_TYPE_CODE>
        <HDR_ORDER_TYPE>Single Recipient</HDR_ORDER_TYPE>
        <ORDER_DATE>2020-09-16T17:06:06.000+00:00</ORDER_DATE>
        <RECIPIENT_CNT>2</RECIPIENT_CNT>
        <ORDERCODE>INT-FirsT</ORDERCODE>
        <VERSION>AB</VERSION>
        <DESCRIPTION>Description for INT_FirsT version AB</DESCRIPTION>
        <CANCELLATION_REASON>Inventory No Stock</CANCELLATION_REASON>
    </G_1>
    <G_1>
        <ORDERED_QTY>1</ORDERED_QTY>
        <ORIGINAL_SOURCE_ORDER_NUMBER>ANAND1212</ORIGINAL_SOURCE_ORDER_NUMBER>
        <SOURCE_TRANSACTION_ID>11</SOURCE_TRANSACTION_ID>
        <SOURCE_TRANSACTION_SYstem>XYZ</SOURCE_TRANSACTION_SYstem>
        <REQUESTOR_NAME>Mickey Mouse</REQUESTOR_NAME>
        <CONTACT_EMAIL>mickey.mouse@disney.com</CONTACT_EMAIL>
        <CREATED_BY_EMAIL>donald.duck@disney.com</CREATED_BY_EMAIL>
        <ORDER_TYPE_CODE>SRO</ORDER_TYPE_CODE>
        <HDR_ORDER_TYPE>Single Recipient</HDR_ORDER_TYPE>
        <ORDER_DATE>2020-09-16T16:52:32.000+00:00</ORDER_DATE>
        <RECIPIENT_CNT>2</RECIPIENT_CNT>
        <ORDERCODE>INT-SECOND</ORDERCODE>
        <VERSION>CD</VERSION>
        <DESCRIPTION>Description for INT-SECOND version CD</DESCRIPTION>
        <CANCELLATION_REASON>Inventory No Stock</CANCELLATION_REASON>
    </G_1>
    <G_1>
        <ORDERED_QTY>3</ORDERED_QTY>
        <ORIGINAL_SOURCE_ORDER_NUMBER>ANOTHER234</ORIGINAL_SOURCE_ORDER_NUMBER>
        <SOURCE_TRANSACTION_ID>11</SOURCE_TRANSACTION_ID>
        <SOURCE_TRANSACTION_SYstem>XYZ</SOURCE_TRANSACTION_SYstem>
        <REQUESTOR_NAME>Minnie Mouse</REQUESTOR_NAME>
        <CONTACT_EMAIL>minnie.mouse@disney.com</CONTACT_EMAIL>
        <CREATED_BY_EMAIL>donald.duck@disney.com</CREATED_BY_EMAIL>
        <ORDER_TYPE_CODE>SRO</ORDER_TYPE_CODE>
        <HDR_ORDER_TYPE>Single Recipient</HDR_ORDER_TYPE>
        <ORDER_DATE>2020-09-16T16:52:32.000+00:00</ORDER_DATE>
        <RECIPIENT_CNT>1</RECIPIENT_CNT>
        <ORDERCODE>INT-FirsT</ORDERCODE>
        <VERSION>AB</VERSION>
        <DESCRIPTION>Description for INT-FirsT version AB</DESCRIPTION>
        <CANCELLATION_REASON>discontinued</CANCELLATION_REASON>
    </G_1>
</DATA_DS>

我需要为所有具有相同 ORIGINAL_SOURCE_ORDER_NUMBER的G_1条目组合ORDERCODE,VERSION和DESCRIPTION字段。在上面的示例中,前两个G_1将合并,第三个G_1将分离。序列中第一个G_1的所有其他字段都可以,但是我需要每个G_1上面列出的所有三个字段。

我的首选组合如下所示,带有一个新的ITEMS元素。

<G_1>
    <ORDERED_QTY>1</ORDERED_QTY>
    <ORIGINAL_SOURCE_ORDER_NUMBER>ANAND1212</ORIGINAL_SOURCE_ORDER_NUMBER>
    <SOURCE_TRANSACTION_ID>12</SOURCE_TRANSACTION_ID>
    <SOURCE_TRANSACTION_SYstem>XYZ</SOURCE_TRANSACTION_SYstem>
    <REQUESTOR_NAME>Mickey Mouse</REQUESTOR_NAME>
    <CONTACT_EMAIL>mickey.mouse@disney.com</CONTACT_EMAIL>
    <CREATED_BY_EMAIL>donald.duck@disney.com</CREATED_BY_EMAIL>
    <ORDER_TYPE_CODE>SRO</ORDER_TYPE_CODE>
    <HDR_ORDER_TYPE>Single Recipient</HDR_ORDER_TYPE>
    <ORDER_DATE>2020-09-16T17:06:06.000+00:00</ORDER_DATE>
    <RECIPIENT_CNT>2</RECIPIENT_CNT>
    <ITEMS>
        <ITEM>
            <ORDERCODE>INT-FirsT</ORDERCODE>
            <VERSION>AB</VERSION>
            <DESCRIPTION>Description for INT_FirsT version AB</DESCRIPTION>
        </ITEM>
        <ITEM>
            <ORDERCODE>INT-SECOND</ORDERCODE>
            <VERSION>CD</VERSION>
            <DESCRIPTION>Description for INT-SECOND version CD</DESCRIPTION>
        </ITEM>
    </ITEMS>
    <CANCELLATION_REASON>Inventory No Stock</CANCELLATION_REASON>
</G_1>

解决方法

您必须提供期望的示例输出,我假设您想生成JSON

%dw 2.0
output application/json
---
payload.DATA_DS.*G_1 groupBy $.ORIGINAL_SOURCE_ORDER_NUMBER

您输入的样本数据中没有ORDERCODE字段。

一旦您弄清楚,某人应该能够解决所有未解决的问题。

编辑: 好的,我已经更正了该表达式以反映您提供的解释以及我新发现的视力:D

尝试以下表达式:

%dw 2.0
output application/xml
// Get an array with all the G_1 values
var grouppedData = payload.DATA_DS.*G_1
  // Group the data by the original source order number 
  groupBy $.ORIGINAL_SOURCE_ORDER_NUMBER
  // Get just the values
  pluck $
---
// Iterate over every single unique original source order number
DATA_DS: grouppedData reduce (e,acc={}) -> do {
    // Create a local variable to store the common fields
    var common = e[0] -- ["ORDERCODE","VERSION","DESCRIPTION"]
    // Create a local variable to store the items
    var items = e reduce (item,items={}) -> (
        items ++ {item: {
            ORDERCODE: item.ORDERCODE,VERSION: item.VERSION,DESCRIPTION: item.DESCRIPTION
        }}
    )
    ---
    acc ++ {GS_1: common ++ items: items}
}

忽略预览中的任何错误,它们都是误报。

此表达式返回以下输出:

<?xml version='1.0' encoding='UTF-8'?>
<DATA_DS>
  <GS_1>
    <ORDERED_QTY>1</ORDERED_QTY>
    <ORIGINAL_SOURCE_ORDER_NUMBER>ANAND1212</ORIGINAL_SOURCE_ORDER_NUMBER>
    <SOURCE_TRANSACTION_ID>12</SOURCE_TRANSACTION_ID>
    <SOURCE_TRANSACTION_SYSTEM>XYZ</SOURCE_TRANSACTION_SYSTEM>
    <REQUESTOR_NAME>Mickey Mouse</REQUESTOR_NAME>
    <CONTACT_EMAIL>mickey.mouse@disney.com</CONTACT_EMAIL>
    <CREATED_BY_EMAIL>donald.duck@disney.com</CREATED_BY_EMAIL>
    <ORDER_TYPE_CODE>SRO</ORDER_TYPE_CODE>
    <HDR_ORDER_TYPE>Single Recipient</HDR_ORDER_TYPE>
    <ORDER_DATE>2020-09-16T17:06:06.000+00:00</ORDER_DATE>
    <RECIPIENT_CNT>2</RECIPIENT_CNT>
    <CANCELLATION_REASON>Inventory No Stock</CANCELLATION_REASON>
    <items>
      <item>
        <ORDERCODE>INT-FIRST</ORDERCODE>
        <VERSION>AB</VERSION>
        <DESCRIPTION>Description for INT_FIRST version AB</DESCRIPTION>
      </item>
      <item>
        <ORDERCODE>INT-SECOND</ORDERCODE>
        <VERSION>CD</VERSION>
        <DESCRIPTION>Description for INT-SECOND version CD</DESCRIPTION>
      </item>
    </items>
  </GS_1>
  <GS_1>
    <ORDERED_QTY>3</ORDERED_QTY>
    <ORIGINAL_SOURCE_ORDER_NUMBER>ANOTHER234</ORIGINAL_SOURCE_ORDER_NUMBER>
    <SOURCE_TRANSACTION_ID>11</SOURCE_TRANSACTION_ID>
    <SOURCE_TRANSACTION_SYSTEM>XYZ</SOURCE_TRANSACTION_SYSTEM>
    <REQUESTOR_NAME>Minnie Mouse</REQUESTOR_NAME>
    <CONTACT_EMAIL>minnie.mouse@disney.com</CONTACT_EMAIL>
    <CREATED_BY_EMAIL>donald.duck@disney.com</CREATED_BY_EMAIL>
    <ORDER_TYPE_CODE>SRO</ORDER_TYPE_CODE>
    <HDR_ORDER_TYPE>Single Recipient</HDR_ORDER_TYPE>
    <ORDER_DATE>2020-09-16T16:52:32.000+00:00</ORDER_DATE>
    <RECIPIENT_CNT>1</RECIPIENT_CNT>
    <CANCELLATION_REASON>Discontinued</CANCELLATION_REASON>
    <items>
      <item>
        <ORDERCODE>INT-FIRST</ORDERCODE>
        <VERSION>AB</VERSION>
        <DESCRIPTION>Description for INT-FIRST version AB</DESCRIPTION>
      </item>
    </items>
  </GS_1>
</DATA_DS>