我需要将一个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>
答案 0 :(得分:1)
因为,你正在使用Collection Aggregator
,你将获得xml的数组,如[xml1,xml2,...等等。如上所述。
因此,您需要提取每个有效负载并保存到变量中并将这些变量的xml值传递到您的XSL文件中,这将生成您的预期结果...您可以在Collection Aggregator
后尝试以下内容: - < / p>
<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>
将您的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('<?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节点值中的任何逗号