我正试图通过recipientList在我的路线中调用2个xsl变换。我有一个包裹在选择步骤中,另一个正常添加:
DateTimeFormatInfo format = new DateTimeFormatInfoImpl_es_MX();
format.dateFormatLong(); // d 'de' MMMM 'de' y
`
当与要转换的标头的交换命中第一个receiveList调用(Common.xsl)时,xml被转换并且它正常工作。当它遇到第二个呼叫时,我在控制台中得到以下内容:
from("direct:cosTransform")
.routeId(TransformerConstants.TRANSFORM_XSLT_ROUTE)
.process(exchange -> {
// Get the xml payload from the exchange body
final String xml = exchange.getIn().getBody(String.class);
// Determine LOB and set as header. If the LOB is invalid, the xslt step will fail.
final String lob = TransformerUtil.getLOBFromAcordXml(xml);
if (null == lob) {
throw new GeneralException("Could not derive the LOB from the ACORD Form. ACORD Form["
+ TransformerUtil.getAcordFormFromAcordXml(xml) + "]");
}
exchange.getIn().setHeader("lineOfBusiness", lob);
// Market should be NI or BI. If the market is invalid, the xslt step will fail.
final String market = TransformerUtil.getMarketFromAccordXml(xml);
if (!StringUtils.equals(market, TransformerConstants.BI_MARKET)
&& !StringUtils.equals(market, TransformerConstants.NI_MARKET)) {
throw new GeneralException("Missing or invalid market[" + market + "].");
}
exchange.getIn().setHeader("market", market);
})
.log("Executing an xsl transform for Market=${header.market} and LOB=${header.lineOfBusiness}")
.choice()
.when(header("market").isEqualTo("NI"))
.recipientList(simple("xslt:./xsl/${header.market}/Common.xsl?saxon=true&contentCache=false")).id("commonTransformNI")
.log("after common :${body}")
.endChoice()
.recipientList(simple("xslt:./xsl/${header.market}/${header.lineOfBusiness}.xsl?saxon=true&contentCache=false"))
.log("after lob : ${body}")
.choice().id("postTransform")
.when(header("market").isEqualTo("NI"))
.process(exchange -> {
String xml = exchange.getIn().getBody(String.class);
xml = TransformerUtil.setUniqueIds(xml);
exchange.getIn().setBody(xml);
})
.endChoice()
.end();
}
我已经尝试了一些测试,在第二次调用之后添加了一个模拟端点并检查了一条消息,使用日志消息来跟踪交换路由到达路径的距离,它似乎永远不会到达第二个调用时,它总是在前往第二个xslt步骤时抛出异常。即使我发送的交易所与when条件不匹配,也不会达到第二个xslt步骤。 xsl字符串中的路径是正确的,当我删除选择逻辑和第二个xslt步骤时,xsl运行正常,无论字符串是用于common.xsl文件还是业务线xsl文件
注意:由于xsl中的某些模板,我必须将转换拆分为它们自己的步骤,即我无法导入其中一个文件,因此转换必须单独调用
编辑:我已经实现了一个处理器来手动运行xslt。我仍然想深究这一点,即使使用.to调用和硬编码参数,我仍然会遇到同样的问题。是骆驼中的XSLT组件吗?