通过组合字段重新格式化 XML 负载
Reformat XML payload by combining fields
我有一个传入的有效负载,如下所示:
<?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.
中上面列出的所有三个字段
我的首选组合如下所示,带有一个新的 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
字段。
一旦你澄清,应该有人能够解决任何悬而未决的问题。
编辑:
好的,我已经更正了表达式以反映您提供的解释和我的新发现 eye-sight :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}
}
忽略预览中的任何错误,它们是误报。
这个表达式returns输出如下:
<?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>
我有一个传入的有效负载,如下所示:
<?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.
中上面列出的所有三个字段我的首选组合如下所示,带有一个新的 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
字段。
一旦你澄清,应该有人能够解决任何悬而未决的问题。
编辑: 好的,我已经更正了表达式以反映您提供的解释和我的新发现 eye-sight :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}
}
忽略预览中的任何错误,它们是误报。
这个表达式returns输出如下:
<?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>