6

长期以来,我一直在使用 Java 提供的默认 XML 库(Xerces2-J 和 Xalan-J)——偶尔在需要时直接使用这些库的最新版本。看来我遇到了这些库的一些限制——尤其是Xalan-J,它实际上不再被维护,并且近 6 年没有发布......

我需要提供一些自定义函数来在调用时从外部服务中提取信息,因此它们必须用 Java 实现。(即,我无法在 XSLT 本身内实现它们,如 XSLT 或 JavaScript 函数等。)我在使用Xalan-Java Extensions之前已经完成了这项工作。但是,提供这似乎是全部或全部允许:

我需要能够提供对 Java 扩展的访问——但不允许对 Java 进行任何任意调用(System.exit()例如,考虑对 的嵌入式调用),理想情况下,XSLT 作者甚至不需要知道它是 Java函数(xmlns:java="http://xml.apache.org/xalan/java"例如,通过使用)。理想情况下,我也可以保留TransformerFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);.

我可以(几乎)完全按照我的要求使用XPath.setXPathFunctionResolver,但这仅适用于直接 XPath 调用——而且我还没有找到一种方法来设置自定义 XPath 以供 Xalan 在 XSLT 中使用。(它还要求FEATURE_SECURE_PROCESSING不设置XPathFactoryTransformerFactory.)

所以我决定试一试 Saxon (Saxon-HE 9.5.1-1) - 我立即注意到 2 个问题:

  1. 在直接使用 XPath 时,XPath.setXPathFunctionResolver在 Saxon 下似乎没有任何影响。set调用没有问题地完成,但在撒克逊人下甚至从未调用resolveFunction过传入。XPathFunctionResolver(它只是在 Xalan 下“正常工作”。)Saxon 是否需要一些额外的配置 - 或者这可能是 HE 版本的限制?

  2. 我查看了http://www.saxonica.com/documentation/#!extensibility/integratedfunctions/ext-simple-J -根据作者的说法,即使在 HE 版本下也提供。它看起来也正是我所需要的——但是(就像XPathFunctionResolver在 Xalan 下一样),我看不到如何将它连接到 XSLT 处理中。 (这由问题本身的 SAXON 中的 XALAN 寄存器扩展功能回答。)

4

0 回答 0