Apache camel 使用camel-saxon时XSLT编译失败

Apache camel 使用camel-saxon时XSLT编译失败,apache-camel,xslt-2.0,saxon,jbossfuse,apache-servicemix,Apache Camel,Xslt 2.0,Saxon,Jbossfuse,Apache Servicemix,我在我的项目中使用Fuse 6.1和camel 2.12版本,并面临以下问题。我试图将java.util.HashMap传递给xslt,并访问映射以检索xslt中的一组值。为此,我正在构建一个映射,并将其放在bean的头中,然后通过XSLT访问它。我创建了一个测试用例来运行这个路由,一切都很好,能够在XSLT中访问映射,如果我的类路径中有net.sf.saxon/saxon/8.9.0.4,XSLT可以很好地编译并生成预期的XML,但是如果我尝试在fuse 6.1中部署具有camel-saxon

我在我的项目中使用Fuse 6.1和camel 2.12版本,并面临以下问题。我试图将java.util.HashMap传递给xslt,并访问映射以检索xslt中的一组值。为此,我正在构建一个映射,并将其放在bean的头中,然后通过XSLT访问它。我创建了一个测试用例来运行这个路由,一切都很好,能够在XSLT中访问映射,如果我的类路径中有net.sf.saxon/saxon/8.9.0.4,XSLT可以很好地编译并生成预期的XML,但是如果我尝试在fuse 6.1中部署具有camel-saxon特性的相同路由,它会失败,并出现以下错误。后来,我在pom文件中实现了net.sf.saxon jar文件,并将其替换为camel-saxon依赖项,同一路由的测试用例失败了。问题是如何使用camel-saxon特性使其运行

这是我的路线


XSLT:
获取以下错误:
位于org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
[main]XSLTerroListener错误找不到名为{java.util.HashMap}get()的匹配双参数函数。注意,直接调用Java方法在Saxon HE下不可用;
net.sf.saxon.trans.XPathException:找不到名为{java.util.HashMap}get()的匹配双参数函数。请注意,在Saxon HE下,对Java方法的直接调用不可用

我花了很多时间来寻找解决方案,却找不到任何解决方案。有人能帮我解决这个问题吗?从fuse卸载camel-saxon特性并使用net.sf.saxon jar有意义吗

Fuse 6.1附带Saxon HE(9.5.1.2_1),这是一个免费库,对XSTL的支持有限

您可以阅读有关Saxon的其他版本,您需要支付$$$才能获得:

旧版本的Saxon 8.9可能有更多的功能,它们在9.x中删除了这些功能,并且只在付费的$$$版本中提供

相反,您可以先在Camel消息中设置这些头,然后从xslt文件中访问这些头,如本文所述,在将参数输入到xslt中以进行处理一节中

来自Saxon 9.2(2009年8月发布)的产品被重新包装;免费版本的Saxon不支持对Java扩展函数的调用(因此出现了一条错误消息,完全解释了发生的情况)。支持此功能的最后一个开源版本是Saxon-B9.1,如果您愿意,当然欢迎您继续使用它


重新打包的原因主要是商业性的:我们认为,如果我们能够让更多的用户转向付费版本,我们只能继续投资开发开源版本,而这一策略被证明是成功的,这就是开放源码版本今天仍在开发的原因。

我建议您的评论“对XSTL的支持有限”过于宽泛。他提供了XSLT W3C标准中定义的除模式感知处理(source:)之外的所有功能。感谢易卜生的快速响应。我们可以使用8.9版本而不是camel-saxon功能吗?您认为这里有什么问题吗?谢谢Michael。似乎我们不能使用旧版本。将单个字段作为参数传递给XSLT。
<route id="newCustomerMapToXmlTransformationRoute">
            <from uri="direct:newCustomerMapToXmlTransformation" />
            <to uri="customerIdGenerationProcessor" /> 
            <to uri="xslt:xslt/flatFileToCustomer.xsl?transformerFactory=tFactory&amp;failOnNullBody=false" />
            <removeHeader headerName="customerProfileMap" />
        </route>

XSLT: 
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xd="http://www.oxygenxml.com/ns/doc/xsl"
    xmlns:Map="java.util.HashMap"  exclude-result-prefixes="Map" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0">

<xsl:variable name="sourceName" select="Map:get($customerProfileMap,'aaaa')"/>
</xsl:stylesheet>

Getting following error: 
        at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) 
[                          main] XsltErrorListener              ERROR Cannot find a matching 2-argument function named {java.util.HashMap}get(). Note that direct calls to Java methods are not available under Saxon-HE; 
net.sf.saxon.trans.XPathException: Cannot find a matching 2-argument function named {java.util.HashMap}get(). Note that direct calls to Java methods are not available under Saxon-HE