(限制)XSLT中的Java扩展功能支持

zie*_*mer 6 java xml xslt saxon

我一直在使用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调用 - 而且我没有找到一种方法来设置Xalan在XSLT中使用的自定义XPath.(它还要求FEATURE_SECURE_PROCESSING不要设置XPathFactory,尽管我可能只能将它设置为TransformerFactory- 忽略如果在TransformerFactory上设置,TransformerFactory也会自动在XPathFactory上设置相同的标志.)

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

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

  2. 我查看了http://www.saxonica.com/documentation/#!extensibility/integratedfunctions/ext-simple-J - 即使在HE版本下也提供了作者.它看起来也正是我所需要的 - 但是(就像XPathFunctionResolver在Xalan下),我无法看到如何将其连接到XSLT处理中. (这可以通过问题本身的XALAN寄存器扩展函数来解决,就像在SAXON一样.)