长期以来,我一直在使用 Java 提供的默认 XML 库(Xerces2-J 和 Xalan-J)——偶尔在需要时直接使用这些库的最新版本。看来我遇到了这些库的一些限制——尤其是Xalan-J,它实际上不再被维护,并且近 6 年没有发布......
我需要提供一些自定义函数来在调用时从外部服务中提取信息,因此它们必须用 Java 实现。(即,我无法在 XSLT 本身内实现它们,如 XSLT 或 JavaScript 函数等。)我在使用Xalan-Java Extensions之前已经完成了这项工作。但是,提供这似乎是全部或全部允许:
- http://www.biglist.com/lists/lists.mulberrytech.com/xsl-list/archives/200911/msg00198.html
- http://marc.info/?l=xalan-j-users&m=123750821029013
- https://issues.apache.org/jira/browse/XALANJ-1850
我需要能够提供对 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
不设置XPathFactory
在TransformerFactory
.)
所以我决定试一试 Saxon (Saxon-HE 9.5.1-1) - 我立即注意到 2 个问题:
在直接使用 XPath 时,
XPath.setXPathFunctionResolver
在 Saxon 下似乎没有任何影响。set
调用没有问题地完成,但在撒克逊人下甚至从未调用resolveFunction
过传入。XPathFunctionResolver
(它只是在 Xalan 下“正常工作”。)Saxon 是否需要一些额外的配置 - 或者这可能是 HE 版本的限制?我查看了http://www.saxonica.com/documentation/#!extensibility/integratedfunctions/ext-simple-J -根据作者的说法,即使在 HE 版本下也提供。它看起来也正是我所需要的——但是(就像(这由问题本身的 SAXON 中的 XALAN 寄存器扩展功能回答。)XPathFunctionResolver
在 Xalan 下一样),我看不到如何将它连接到 XSLT 处理中。