Oxygen XML中Saxon HE Java扩展函数初始化错误求助
问题解决:Saxon-HE扩展函数初始化错误
你的核心问题是扩展函数的返回类型定义与实际返回值不匹配,导致Saxon在加载扩展类时抛出初始化错误,直接中断转换流程。
错误原因分析
Java代码中getResultType方法返回SequenceType.VOID,声明该函数不返回任何结果,但call方法实际返回了StringValue类型的字符串序列,这种定义与实现的矛盾触发了Saxon的初始化异常。
修正方案
1. 修正Java代码的返回类型定义
将getResultType的返回值改为SequenceType.SINGLE_STRING,与实际返回的字符串类型匹配:
package TestPackage; import net.sf.saxon.expr.XPathContext; import net.sf.saxon.lib.ExtensionFunctionCall; import net.sf.saxon.lib.ExtensionFunctionDefinition; import net.sf.saxon.om.Sequence; import net.sf.saxon.om.StructuredQName; import net.sf.saxon.trans.XPathException; import net.sf.saxon.value.SequenceType; import net.sf.saxon.value.StringValue; public class TestClass extends ExtensionFunctionDefinition { @Override public StructuredQName getFunctionQName() { return new StructuredQName("ex-ns", "http://www.example.com/test-class", "function"); } @Override public SequenceType[] getArgumentTypes() { return new SequenceType[] { SequenceType.SINGLE_STRING }; } @Override public SequenceType getResultType(SequenceType[] suppliedArgumentTypes) { // 修正为返回单字符串类型,与实际返回值匹配 return SequenceType.SINGLE_STRING; } @Override public ExtensionFunctionCall makeCallExpression() { return new ExtensionFunctionCall() { @Override public Sequence call(XPathContext context, Sequence[] arguments) throws XPathException { String str1 = "Hello "; String str2 = "!"; String first = arguments[0].head().getStringValue(); String result = str1.concat(first).concat(str2); return StringValue.makeStringValue(result); } }; } }
2. 确认XSLT中的函数调用正确性
你已经修正了XSLT中的命名空间和前缀,ex-ns:function($first-name)的前缀与xmlns:ex-ns="http://www.example.com/test-class"完全一致,这部分无需调整。
验证修正效果
重新编译Java类并打包成jar,添加到Saxon的类路径后执行转换:
- 输入XML中的
<name first="example"/>会被转换为<name>Hello example!</name> - XSLT中的
<xsl:message>Doc here!</xsl:message>会正常输出,说明转换流程已正常启动
内容的提问来源于stack exchange,提问作者Jason Coleman
相关产品推荐
相关产品推荐

