根据子项拆分 XML 并迭代动态标签

Split XML based on a child and iterate over a dynamic tag

在我的 Mule 流程中,我将调用一个存储过程,它会输出我 XML 类似这样的响应

<RESULT xmlns="some_stored_proc:Response">
   <ROOT_TAG>
      <RESULTSET_1>
         <ROW>
            <A>0.1</A>
            <B>0.4</B>
            <C>1.0</C>
            <hasError>1</hasError>
        </ROW>
        <ROW>
            <A>0.1</A>
            <B>0.4</B>
            <C>1.0</C>
            <hasError>1</hasError>
        </ROW>
    </RESULTSET_1>
<RESULTSET_2>
         <ROW>
            <A>0.3</A>
            <B>0.2</B>
            <C>1.1</C>
            <hasError>0</hasError>
        </ROW>
        <ROW>
            <A>0.1</A>
            <B>0.4</B>
            <C>1.0</C>
            <hasError>0</hasError>
        </ROW>
    </RESULTSET_2>  
<RESULTSET_3>
         <ROW>
            <A>1.1</A>
            <B>2.4</B>
            <C>1.8</C>
            <hasError>0</hasError>
        </ROW>
        <ROW>
            <A>0.1</A>
            <B>0.4</B>
            <C>1.0</C>
            <hasError>0</hasError>
        </ROW>
    </RESULTSET_3>  
</ROOT_TAG> 
</RESULT>   

现在在我的 dataweave 中,我想做的是通过这个 XML 并将任何设置为 1 的内容带到名为 ISSUES

的根标签下
<ISSUES>
     <ROW>
        <A>0.1</A>
        <B>0.4</B>
        <C>1.0</C>
        <hasError>1</hasError>
    </ROW>
    <ROW>
        <A>0.1</A>
        <B>0.4</B>
        <C>1.0</C>
        <hasError>1</hasError>
    </ROW>
</ISSUES>

其余的 ROW 像这样放在 DOCUMENT 下

    <DOCUMENT>
         <ROW>
            <A>0.3</A>
            <B>0.2</B>
            <C>1.1</C>
            <hasError>0</hasError>
        </ROW>
        <ROW>
            <A>0.1</A>
            <B>0.4</B>
            <C>1.0</C>
            <hasError>0</hasError>
        </ROW>
         <ROW>
            <A>1.1</A>
            <B>2.4</B>
            <C>1.8</C>
            <hasError>0</hasError>
        </ROW>
        <ROW>
            <A>0.1</A>
            <B>0.4</B>
            <C>1.0</C>
            <hasError>0</hasError>
        </ROW>
    </DOCUMENT> 

我一直遇到一个异常。

注意: 根据输入大小和作为数据库存储过程输入的组大小,可以有任意数量的 <RESULTSET_n> 标签。所以这个标签将是动态的。

基本上我所做的就是使用 groupBy 函数将您的文档拆分为有效和无效,我将每个部分转换为预期的数据结构

%dw 2.0
output application/xml
import * from dw::core::Objects
---
{ 
    RESULT: {( 
payload.RESULT.ROOT_TAG 
    groupBy ((value, key) -> (key as String match /RESULTSET_([0-9]+)/)[1] == "1")
    pluck ((value, key, index) -> 
        key as String match {
            case "true" -> 
                { ISSUES: {(valueSet(value))}}
            case "false" -> 
                { DOCUMENT: {(valueSet(value))}}
        }
    )

    )}
}