Вы можете указать стратегию агрегации при разделении.Я не мог заставить XsltAggregationStrategy работать с преобразователем xalan xslt по умолчанию, поэтому я добавил camel-saxon в мои зависимости и добавил свойство transformerFactoryClass, чтобы XsltAggregationStrategy использовал его.Я также должен был предоставить конструктор arg для указания имени файла xslt.
<bean id="xsltAggregationStrategy" class="org.apache.camel.util.toolbox.XsltAggregationStrategy">
<constructor-arg value="aggregation.xslt" />
<property name="transformerFactoryClass" value="net.sf.saxon.TransformerFactoryImpl"/>
</bean>
<route>
<from uri="direct:start"/>
<!-- refer to the aggregation strategy to be used -->
<split strategyRef="xsltAggregationStrategy">
<!-- split the body -->
<xpath>//entry</xpath>
... rest of the route to get the additional stuff
</split>
<log message="Aggregated message ${body}"/>
</route>
Я не думаю, что XsltAggregationStrategy будет делать то, что вы хотите.Я не использовал его раньше, поэтому попробовал, и его поведение для агрегирования:
1-й вызов, извлеките тело из нового сообщения и просто сохраните его.2-й и последующие вызовы, сохраните старое тело (то есть то, что до сих пор агрегировано), поместите новое тело сообщения в свойство (по умолчанию new-exchange) и выполните перевод xslt с помощью предоставленного файла xslt.
Так для вашего примераесли вы разделите ваш оригинальный документ на // запись, вы получите 3 сообщения.
Сообщение 1 содержит
<entry>
<entryId>1</entryId>
<fieldToEnrich1></fieldToEnrich1>
<fieldToEnrich2></fieldToEnrich2>
<fieldToEnrich3></fieldToEnrich3>
</entry>
Возможно, вы обогатите его до
<entry>
<entryId>1</entryId>
<fieldToEnrich1>value1</fieldToEnrich1>
<fieldToEnrich2>value2</fieldToEnrich2>
<fieldToEnrich3>value3</fieldToEnrich3>
</entry>
Это помещается прямо в агрегированное тело сообщения.Xslt не запускается против него.
Сообщение 2 имеет
<entry>
<entryId>2</entryId>
<fieldToEnrich1></fieldToEnrich1>
<fieldToEnrich2></fieldToEnrich2>
<fieldToEnrich3></fieldToEnrich3>
</entry>
Снова вы обогащаете его до
<entry>
<entryId>2</entryId>
<fieldToEnrich1>value1</fieldToEnrich1>
<fieldToEnrich2>value2</fieldToEnrich2>
<fieldToEnrich3>value3</fieldToEnrich3>
</entry>
В объединенном теле сообщения все еще есть
<entry>
<entryId>1</entryId>
<fieldToEnrich1>value1</fieldToEnrich1>
<fieldToEnrich2>value2</fieldToEnrich2>
<fieldToEnrich3>value3</fieldToEnrich3>
</entry>
Он также получает свойство с именем new-exchange, установленное в
<entry>
<entryId>2</entryId>
<fieldToEnrich1>value1</fieldToEnrich1>
<fieldToEnrich2>value2</fieldToEnrich2>
<fieldToEnrich3>value3</fieldToEnrich3>
</entry>
. Вы можете использовать xslt, например, чтобы объединить их, в указанном выше маршруте имя должно быть aggregation.xslt.
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:param name="new-exchange"/>
<xsl:template match="/">
<body>
<xsl:copy-of select="//entry" />
<xsl:copy-of select="$new-exchange/entry" />
</body>
</xsl:template>
</xsl:stylesheet>
Что приведет к
<body>
<entry>
<entryId>1</entryId>
<fieldToEnrich1>field 1 for entry id 1</fieldToEnrich1>
<fieldToEnrich2>field 2 for entry id 1</fieldToEnrich2>
<fieldToEnrich3>field 3 for entry id 1</fieldToEnrich3>
</entry>
<entry>
<entryId>2</entryId>
<fieldToEnrich1>field 1 for entry id 2</fieldToEnrich1>
<fieldToEnrich2>field 2 for entry id 2</fieldToEnrich2>
<fieldToEnrich3>field 3 for entry id 2</fieldToEnrich3>
</entry>
</body>
Третье сообщение также будет добавлено.Но в итоге вы получите только часть тела исходного документа.Я не вижу простого способа включить весь исходный документ, если вы используете встроенную версию XsltAggregationStrategy.Тебе, наверное, лучше написать свою.