基于子项拆分XML并遍历动态标签

sat*_*ati 1 xml mule anypoint-studio dataweave

在我的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>   
Run Code Online (Sandbox Code Playgroud)

现在,在我的数据编织中,我想要做的是通过此XML,并将任何设置为1的XML置于名为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>
Run Code Online (Sandbox Code Playgroud)

其余的行都像这样在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> 
Run Code Online (Sandbox Code Playgroud)

我不断碰到一个例外。

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

mac*_*val 5

所以基本上我要做的就是使用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))}}
        }
    )

    )}
}
Run Code Online (Sandbox Code Playgroud)