2017-02-14 15 views
0

Мне нужно объединить массив xml в один XML-файл. Ниже приведен вывод от Collection Aggregator в муле.Как объединить вывод сборщика-агрегатора с массивом xml-файлов, разделенных запятой, с помощью xslt и mule

Выход:

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

ответ

1

Поскольку вы используете 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"/> 

Затем вы можете установить любой фиктивный полезной нагрузки XML, прежде чем ваш трансформатор XSLT и передать полезную нагрузку 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/главная/ресурсы папку и файл 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 соответственно

UPDATE: - Альтернативный способ заключается в использовании функции String, после того, как 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. Работает :) –