gpt4 book ai didi

xpath - 带有 Saxon 的 Apache Camel Xpath 2.0 看起来在 RouteBuilder/Predicates 中不起作用

转载 作者:行者123 更新时间:2023-12-03 16:05:37 25 4
gpt4 key购买 nike

我正在使用包含 Camel 2.10.7 的 ServiceMix 4.5.3,并且我能够使用 Saxon 库使用如下选项端点进行 XSLT 2.0 转换:

...
to("xslt:stylesheet.xsl?transformerFactoryClass=net.sf.saxon.TransformerFactoryImpl")
...

但是,当我尝试像这样使用 xpath 函数时:
private Namespaces ourNS = new Namespaces("myns",
"urn:com:company:domain:namespace:myns/1");

// ... some code ...

// Make a predicate to filter according a header :
// The code attribute looks like: urn:phone:apple:iphone:4s
Predicate isNotSamePhoneBrand = PredicateBuilder.isNotEqualTo(
xpath("tokenize(/myns:Phone/@code, ':')[3]").namespaces(ourNS),
header("PhoneBrand"));

如果我执行上面的代码,它会说 tokenize() 函数是未知的。我猜这是因为它仍然使用 xalan (xpath 1.0) 而不是 Saxon。

我还尝试在 Camel 文档中附加 .saxon()
Predicate isNotSamePhoneBrand = PredicateBuilder.isNotEqualTo(
xpath("tokenize(/myns:Phone/@code, ':')[3]").namespaces(ourNS).saxon(),
header("PhoneBrand"));

但是他找不到撒克逊实现工厂会出错:
Caused by: javax.xml.xpath.XPathFactoryConfigurationException: No XPathFctory implementation found for the object model: http://saxon.sf.net/jaxp/xpath/om

在我的 OSGI 上下文中,我验证了 camel-saxonApache ServiceMix :: Bundles :: saxon9he (9.3.0.11_2)被部署。

我们计划很快升级到 ServiceMix 5,但我不知道这个问题是否仍然存在,4.5.3 版本的解决方案对我来说会更好。

最佳答案

在 Saxon 9.6 中,我们删除了将 Saxon 注册为 JAXP XPathFactory 接口(interface)实现的服务文件。它仍然实现了该接口(interface),只是在 JAR 文件 list 中没有这样的服务文件。这背后有很长的历史,但基本上有两个主要原因:(a) JDK 版本之间的不兼容使得无法生成适用于 JDK 5 到 JDK 8 的服务文件,以及 (b) 仅仅将 Saxon 放在类路径中如果没有编写或测试它们以使用 XPath 2.0,则会导致应用程序中断。

我想有一种解决方法,可以自己将服务文件添加到 SAXON Jar 文件 list 中(您可以从 9.5 版本中复制它)。

关于xpath - 带有 Saxon 的 Apache Camel Xpath 2.0 看起来在 RouteBuilder/Predicates 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28322554/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com