You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 08:03:17