【问题标题】:XSLT compilation failure with camel-saxonCamel-saxon 的 XSLT 编译失败
【发布时间】:2018-09-29 06:35:42
【问题描述】:

我正在为我的项目使用 Fuse 6.1 和 camel 2.12 版本并面临以下问题。我正在尝试将 java.util.HashMap 传递给我的 xslt 并访问 map 以检索我的 XSLT 中的一堆值。为此,我正在构建一个映射并将其放在 bean 中的 in 标头中并访问它 XSLT。我创建了一个测试用例来运行这条路线,一切正常,能够在 XSLT 中访问地图,如果我的类路径中有 net.sf.saxon/saxon/8.9.0.4,XSLT 正在编译并生成预期的 XML,但如果我尝试在具有骆驼撒克逊功能的 fuse 6.1 中部署相同的路线,但失败并出现以下错误。后来我意识到并用 pom 文件中的骆驼撒克逊依赖替换了 net.sf.saxon jar 文件,并且同一路由的测试用例失败了。问题是如何使用骆驼撒克逊功能使其运行。

这是我的路线

<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

我花了很多时间寻找解决方案,但找不到任何解决方案。谁能帮我解决这个问题?从 fuse 中卸载 camel-saxon 功能并使用 net.sf.saxon jar 是否有意义?

【问题讨论】:

    标签: apache-camel xslt-2.0 saxon jbossfuse apache-servicemix


    【解决方案1】:

    从 Saxon 9.2(2009 年 8 月发布)开始,产品被重新包装;免费版 Saxon-HE 不支持调用 Java 扩展函数(因此错误消息完全解释了发生了什么)。支持此功能的最后一个开源版本是 Saxon-B 9.1,如果您愿意,当然欢迎您继续使用。

    重新打包的原因主要是商业性的:我们认为只有让更大比例的用户群转向付费版本,我们才能继续投资开发开源版本,这一策略得到了证明成功,这就是为什么今天继续开发开源版本的原因。

    【讨论】:

    • 谢谢迈克尔。好像我们不能使用旧版本。将单个字段作为参数传递给 XSLT。
    【解决方案2】:

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

    您可以阅读其他版本的撒克逊语,需要支付 $$$ 才能获得:http://saxon.sourceforge.net/

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

    您可以先在 Camel 消息中设置这些标头,然后从 xslt 文件中访问这些标头,如此处所述,在 Getting Parameters into the XSLT to work with 部分

    【讨论】:

    • 我建议您的评论“对 XSTL 的支持有限”过于宽泛。 HE 提供了 XSLT W3C 标准中定义的所有功能,除了模式感知处理(来源:saxon.sourceforge.net)。
    • 感谢 Ibsen 的快速响应。我们可以使用 8.9 版本来代替 camel-saxon 功能吗?您看到这里有什么问题吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-15
    • 2021-10-07
    • 2020-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多