如何将集合聚合器的输出与使用xslt和mule

时间:2017-02-14 00:57:09

标签: xml xslt mule

我需要将一个xml数组合并到一个xml文件中。以下是骡子中Collection Aggregator的输出。

输出:

[<?xml version="1.0" encoding="UTF-8"?><log>
        <age>nameorder3</age>
        <name>tetsMessage3</name>
    </log>, <?xml version="1.0" encoding="UTF-8"?><log>
        <age>nameorder2</age>
        <name>tetsMessage2</name>
    </log>, <?xml version="1.0" encoding="UTF-8"?><log>
        <age>nameorder1</age>
        <name>tetsMessage1</name>
    </log>]

预期输出:

<root>
<log>
    <age>nameorder3</age>
    <name>tetsMessage3</name>
</log>
<log>
    <age>nameorder2</age>
    <name>tetsMessage2</name>
</log>
<log>
    <age>nameorder1</age>
    <name>tetsMessage1</name>
</log>

1 个答案:

答案 0 :(得分:1)

因为,你正在使用Collection Aggregator,你将获得xml的数组,如[xml1,xml2,...等等。如上所述。
因此,您需要提取每个有效负载并保存到变量中并将这些变量的xml值传递到您的XSL文件中,这将生成您的预期结果...您可以在Collection Aggregator后尝试以下内容: - < / p>

<set-variable variableName="value1" value="#[message.payload[0][0].replace('&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;','')]" doc:name="Variable"/>
<set-variable variableName="value2" value="#[message.payload[0][1].replace('&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;','')]" doc:name="Variable"/>

然后,您可以在Xslt转换器之前设置任何虚拟xml有效负载,并将xml有效负载从每个变量传递到xsl文件: -

<set-payload value="#[message.payload[0][0]]" doc:name="Set Payload"/>
<mulexml:xslt-transformer xsl-file="response.xsl" maxIdleTransformers="2" maxActiveTransformers="5" doc:name="XSLT" mimeType="application/xml">
       <mulexml:context-property key="value1" value="#[flowVars.value1]" /> 
       <mulexml:context-property key="value2" value="#[flowVars.value2]" /> 
</mulexml:xslt-transformer>

将您的response.xsl文件放在 src / main / resources 文件夹下,您的xsl文件可以如下: -

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output omit-xml-declaration="yes" indent="yes" />

   <xsl:param name="value1" />
   <xsl:param name="value2" />

<xsl:template match="/">
 <root>
 <xsl:value-of select="$value1"/>
 <xsl:value-of select="$value2"/>

 </root>
</xsl:template>

</xsl:stylesheet>  

因此,Collection Aggregator之后的完整代码将是: -

 <collection-aggregator failOnTimeout="true" doc:name="Collection Aggregator"/>
<!-- <logger message="#[message.payload[0]]   #['\n']  #[message.payload[1]]" level="INFO" doc:name="Logger"/> -->
<set-variable variableName="value1" value="#[message.payload[0][0].replace('&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;','')]" doc:name="Variable"/>
<set-variable variableName="value2" value="#[message.payload[0][1].replace('&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;','')]" doc:name="Variable"/>
<set-payload value="#[message.payload[0][0]]" doc:name="Set Payload"/>
<mulexml:xslt-transformer xsl-file="response.xsl" maxIdleTransformers="2" maxActiveTransformers="5" doc:name="XSLT" mimeType="application/xml">
     <mulexml:context-property key="value1" value="#[flowVars.value1]" /> 
     <mulexml:context-property key="value2" value="#[flowVars.value2]" /> 
</mulexml:xslt-transformer>

请注意,我仅以2 xml有效负载为例,您需要对组合的有效负载阵列中的所有xml执行此操作。

现在从您的示例中有3 xml,因此您需要在流变量中存储3 xml并相应地设计xsl模板

<强>更新: - 另一种方法是在collection-aggregator

之后使用字符串函数
  <collection-aggregator failOnTimeout="true" doc:name="Collection Aggregator"/>
  <set-payload value="#[message.payload.toString().replaceAll(&quot;\\[&quot;, &quot;&quot;).replaceAll(&quot;\\]&quot;,&quot;&quot;) ]" doc:name="Set Payload"/>
  <set-payload value="#[message.payload.replace('&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;','')]" doc:name="Set Payload"/>
 <set-payload value="#[message.payload.replace('&gt;,','&gt;')]" doc:name="Copy_of_Set Payload"/>
  <set-payload value="#['&lt;root&gt;'+payload+'&lt;/root&gt;']" doc:name="Set Payload"/>

这是字符串函数和正则表达式

的组合

要删除逗号,请使用

<set-payload value="#[message.payload.replace('&gt;,','&gt;')]" doc:name="Copy_of_Set Payload"/>

这不会替换xml节点值中的任何逗号