如何合并集合器的输出与由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>
,因为你正在使用Collection Aggregator
你会得到XML的阵列,例如[XML1,XML2, ...如你所说。
所以,你需要提取每个有效载荷,并保存到一个变量和传递变量的XML值到您的XSL文件,将产生你预期的结果...你可以试一下的Collection Aggregator
后如下: -
<set-variable variableName="value1" value="#[message.payload[0][0].replace('<?xml version="1.0" encoding="UTF-8"?>','')]" doc:name="Variable"/>
<set-variable variableName="value2" value="#[message.payload[0][1].replace('<?xml version="1.0" encoding="UTF-8"?>','')]" 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('<?xml version="1.0" encoding="UTF-8"?>','')]" doc:name="Variable"/>
<set-variable variableName="value2" value="#[message.payload[0][1].replace('<?xml version="1.0" encoding="UTF-8"?>','')]" 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("\\[", "").replaceAll("\\]","") ]" doc:name="Set Payload"/>
<set-payload value="#[message.payload.replace('<?xml version="1.0" encoding="UTF-8"?>','')]" doc:name="Set Payload"/>
<set-payload value="#[message.payload.replace('>,','>')]" doc:name="Copy_of_Set Payload"/>
<set-payload value="#['<root>'+payload+'</root>']" doc:name="Set Payload"/>
这是字符串函数和正则表达式的组合表达式
为了除去逗号,使用
<set-payload value="#[message.payload.replace('>,','>')]" doc:name="Copy_of_Set Payload"/>
这会不会取代任何逗号在XML节点值
谢谢@anirban。它的工作:) –
你能在这里粘贴流XML?你如何阅读4个XML? – Abhay