是否可以使用 mule 中的 Dataweave 或 Damapper 从基于订单项的复杂输入 xml 生成多个 XML?

Is it possible to generate multiple XML from a complex input xml based on line items using Dataweave or Damapper in mule?

我试图根据输入 XML 中的行项目创建多个平面 XML。这可能只是在 mule 中使用 Dataweave 或 Datamapper 吗?

谢谢

请看上面的例子

<?xml version="1.0" encoding="utf-8"?>
<XmlInterchange>
     <InterchangeInfo>
       <Payload>
         <WhsDockets>
            <WhsDocket>
               <Identifier>1</Identifier>
                <DocketDetail>
                </DocketDetail>
                 <DocketLines>
                   <Product>7CAGL3G00</Product>
                   <Description>AGL_7C_0</Description>
                   <QuantityFromClientOrder>7.00</QuantityFromClientOrder>
                   <QuantityActuallyOrdered>7.00</QuantityActuallyOrdered>
                   <ProductUQ>SKD</ProductUQ>
                    <Confirmation>
                         <Lines>
                              <Line>
                               <PartAttribute1>4440_100</PartAttribute1>
                               <PartAttribute2>96489</PartAttribute2>
                               <PartAttribute3>700029611    -   700029710  #4</PartAttribute3>
                               <Quantity>100.000</Quantity>
                               <QuantityUQ>UNT</QuantityUQ>
                               </Line>
                               <Line>
                               <PartAttribute1>4440_100</PartAttribute1>
                               <PartAttribute2>96489</PartAttribute2>
                               <PartAttribute3>700029511    -   700029610 #3</PartAttribute3>
                               <Quantity>100.000</Quantity>
                               <QuantityUQ>UNT</QuantityUQ>
                               </Line>
                         </Lines>   
                    </Confirmation>
                  </DocketLines>
            <WhsDocket>
          <WhsDockets>
       <Payload>
     </InterchangeInfo>
</XmlInterchange>

目标

<?xml version="1.0"?><p1:StockMovementDataRequest xmlns:p1="urn:ams.com.au:test:3pl:am:SAP_AM_I_005:StockMovement" xmlns:a="http://www.test.com.au/EnterpriseService/">
<Header>
    <From>warehouse</From>
    <To>client</To>
    <DateTimeStamp>2016-04-13T11:55:30.263+10:00</DateTimeStamp>
</Header>
<StockMovementData>
    <Serialised_Material>YES</Serialised_Material>
    <From_Location>warehouse</From_Location>
    <To_Location>client</To_Location>
    <Material>7CAGL3G00</Material>
    <Serial>700029611   -   700029710 #4</>
    <Quantity>7.00</Quantity>
</StockMovementData>
 <StockMovementData>
    <Serialised_Material>YES</Serialised_Material>
    <From_Location>warehouse</From_Location>
    <To_Location>client</To_Location>
    <Material>7CAGL3G00</Material>
    <Serial>700029511   -   700029610 #3</>
    <Quantity>7.00</Quantity>
</StockMovementData>

或使用订单项

创建多个XML

单个 DataWeave 转换只能输出一个 xml 文件,请记住 XML 可以有 ONLY ONE ROOT element。如果您的转换导致多个根元素,DataWeave 也会抛出错误。所以你不能以你在问题中提到的格式生成单个 xml 。但是,如果您可以将所有输出元素包装到某个根元素中,那么您就可以创建该输出。

添加更新展示,如何迭代和生成元素-

我们需要借助全局函数来创建长度等于订购数量的动态数组 -

在你的 mule xml -

下方添加 global function
<configuration doc:name="Configuration">
     <expression-language>
         <global-functions>

            def getArrayOfLength(value){
                int i = 0;
                int[] arrRet = [];
                while(i &lt; value){
                    arrRet.add(i);
                    i++;
                }
                return arrRet;
            }   

         </global-functions>
     </expression-language>
 </configuration>

然后我们将在我们的数据编织中使用这个函数,我将使用一个简单的输入 xml 如下所示,并将在 -

中输出名称元素的次数
<?xml version='1.0' encoding='UTF-8'?>
<root>
    <name>Manik</name>
    <times>7</times>
</root>

然后是dataweave代码-

%dw 1.0
%output application/xml
---
{
  root: {
        (getArrayOfLength(payload.root.times) map ((key,index) -> name: payload.root.name))
    }
}

所以我们要做的是,通过传入时间值来调用我们的全局函数,例如。 7. 这个全局函数会return一个从0开始到value-1的数组列表。然后我们使用 map 遍历这个数组,但我们没有使用这个数组中的任何东西,相反,我们可以只使用我们的原始有效负载来创建将在输出中重复 N 次的映射。

这是输出 -

<?xml version='1.0' encoding='windows-1252'?>
<root>
  <name>Manik</name>
  <name>Manik</name>
  <name>Manik</name>
  <name>Manik</name>
  <name>Manik</name>
  <name>Manik</name>
  <name>Manik</name>
</root>

希望这能让您了解如何做并帮助您针对您的用例扩展它。