Java 如何在维护安全性的同时提供XSLT实用程序

Java 如何在维护安全性的同时提供XSLT实用程序,java,xml,xslt,javax.xml,Java,Xml,Xslt,Javax.xml,我希望能够提供可以在XSL样式表中使用的转义实用程序。例如: 然而,就Java而言,我的理解是,在TransformerFactory上缺少以下设置可能是不安全的: factory.setFeature(xmlcontents.FEATURE\u SECURE\u PROCESSING,true); 所以我这样做了,但可以理解的是,这会阻止您使用“外部函数调用”,并导致以下运行时错误: FATAL: XPath syntax error at char 12 in {escape:new(

我希望能够提供可以在XSL样式表中使用的转义实用程序。例如:


然而,就Java而言,我的理解是,在TransformerFactory上缺少以下设置可能是不安全的:

factory.setFeature(xmlcontents.FEATURE\u SECURE\u PROCESSING,true);
所以我这样做了,但可以理解的是,这会阻止您使用“外部函数调用”,并导致以下运行时错误:

FATAL: XPath syntax error at char 12 in {escape:new()}:
    Cannot find a matching 0-argument function named 
{java:com.example.myservice.MyEscapeTool}new(). Note: external 
function calls have been disabled;
删除前面提到的FEATURE_SECURE_PROCESSING标志将修复该问题


我怎样才能包含一个可以在XSLT中调用的实用函数,而不导致安全性损失,从而能够公开任意Java类?

正如@MartinHonnen在他的评论中指出的那样,如果切换到使用Saxon,那么可以限制样式表仅使用“集成的扩展函数”它们在执行之前已在XSLT处理器中注册,而不允许样式表调用恰好位于类路径上的任何类/方法。

这听起来或多或少像是“你不能吃蛋糕,也不能吃蛋糕”Xalan从未支持XSLT 2。您可能需要考虑移动到像Sxon 9这样的XSLT 2处理器,在这里可以用XCLST编写用户定义函数,使用代码> xSL:函数< /代码>。Saxon还允许集成的扩展函数,而不是自反函数,您可以控制在Java中实现的函数,并将其公开给XSLT。