如何合并集合器的输出与由xslt和mule用逗号分隔的xml文件的数组

问题描述:

我需要将一个xml数组合并到一个xml文件中。以下是骡子Collection Aggregator的输出。如何合并集合器的输出与由xslt和mule用逗号分隔的xml文件的数组

输出:

[<?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> 

+0

你能在这里粘贴流XML?你如何阅读4个XML? – Abhay

,因为你正在使用Collection Aggregator你会得到XML的阵列,例如[XML1,XML2, ...如你所说。
所以,你需要提取每个有效载荷,并保存到一个变量和传递变量的XML值到您的XSL文件,将产生你预期的结果...你可以试一下的Collection Aggregator后如下: -

<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> 

下发生src成为response.xsl文件/主/资源文件夹和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节点值

+0

谢谢@anirban。它的工作:) –