我long made do with the default XML libraries provided by Java(Xerces2-J和Xalan-J) - 偶尔并在需要时直接使用这些库的最新版本。看来我正在遇到这些库的一些限制 - 特别是with Xalan-J that is really no longer being maintained和without a release for almost 6 years ......
我需要提供一些自定义函数来在调用时从外部服务中提取信息,因此它们必须用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以便在XSLT中使用Xalan的。 (它还要求FEATURE_SECURE_PROCESSING
不要设置XPathFactory
,但我可能只能在TransformerFactory
上设置它 - 忽略如果在TransformerFactory上设置,TransformerFactory还会自动在使用的XPathFactory上设置相同的标志。)
所以我决定尝试撒克逊(Saxon-HE 9.5.1-1) - 我立即注意到2个问题:
直接使用XPath时,XPath.setXPathFunctionResolver
似乎在Saxon下没有任何影响。 set
调用完成没有问题,但传入的resolveFunction
上的XPathFunctionResolver
甚至从未在Saxon下调用过。 (它只是在Xalan下“正常工作”。)Saxon是否需要一些额外的配置 - 或者这可能是HE版本的限制?
我看过http://www.saxonica.com/documentation/#!extensibility/integratedfunctions/ext-simple-J - 即使在HE版本下也提供per the author。它看起来也正是我所需要的 - 但是(就像Xalan下的(这由{{3}回答在问题本身。)XPathFunctionResolver
一样),我看不出如何将它连接到XSLT处理。