XSLT 1.0 不支持直接调用 Java/.NET 函数,需依赖处理器扩展机制;Saxon 可通过 ExtensionFunctionDefinition 注册 Java 静态方法并调用,.NET 的 XslCompiledTransform 则完全不支持自定义扩展函数,仅限 COM 对象且限制极多;推荐将逻辑移出 XSLT,预处理数据后再用标准 XSLT 转换。
标准 XSLT 1.0 规范不支持任意外部语言函数调用。所谓“调用 Java 方法”,实际依赖于特定 XSLT 处理器的扩展机制,不是跨平台能力。Saxon、Xalan、.NET 的 XslCompiledTransform 各自实现不同,且多数已弃用或严格限制此类功能。
Saxon 支持通过 ExtensionFunctionDefinition 注册 Java 方法,但必须在 Java 侧完成注册,不能在 XSLT 里声明。XSLT 中仅能通过命名空间前缀调用已注册函数,且函数签名需严格匹配。
public static,参数和返回类型需映射为 XPath 类型(如 XdmValue、String、double)xmlns:my="http://example.com/myfunctions"
my:formatDate($date, 'yyyy-MM-dd'),前提是该函数已在 Saxon 的 Processor 实例中注册XTDE1425: Cannot find a matching 2-argument function named {http://example.com/myfunctions}formatDate()
Processor processor = new Processor(); Configuration config = processor.getUnderlyingConfiguration(); config.registerExtensionFunction(new MyFormatDateFunction()); // 必须提前注册
XslCompiledTransform 在 .NET Framework 2.0+ 中**完全移除了对 IXsltContext 和自定义函数的支持**。它只允许通过 XsltArgumentList 传入 XsltArgumentList.AddExtensionObject() 注册 COM 对象(仅限旧版 Windows COM 组件),且要求组件实现 IDispatch,现代 .NET 类(如 public static class Utils)无法使用。
ArgumentExcep
tion: Extension object must implement IDispatch
XdmValue 或参数传入 XSLT,而非在 XSLT 中实时调用真正可维护、可测试、跨平台的方案,是把逻辑移出 XSLT:
format-date()、parse-json()),或切换到支持脚本的处理器(如 Saxon-JS 浏览器端运行,但无 Java 调用能力)硬要绑定语言运行时,等于把 XSLT 变成黑盒胶水层,调试困难、迁移受限、安全策略常拦截——这些细节往往在上线后才暴露。