XQuery使用Saxon 9-HE执行Java函数

时间:2018-09-04 13:39:07

标签: java xquery saxon

我试图按照此处的答案Saxon-HE Integrated Extension Functions | how and where?执行一些java方法并返回一个String,这与示例是一样的事情。

区别是我正在运行XQuery而不是XSLT。

问题是我收到一条错误消息,说运行XQuery时未定义名称空间。

问题是我可以将XSLT技巧用于XQuery吗?

现在的代码: 具体方法:

TransformerFactory factory = TransformerFactory.newInstance();
TransformerFactoryImpl tFactoryImpl = (TransformerFactoryImpl) factory;
config = tFactoryImpl.getConfiguration();

用于设置处理器的方法:

public void addFunctionLibrary(JavaSaxonLib tsj) {
    Processor processor = (Processor) config.getProcessor();
    ExtensionFunction javaCall = tsj;
    processor.registerExtensionFunction(javaCall);
}

测试ExtensionFunction的类:

public class JavaSaxonLib implements ExtensionFunction {

    String namespace = "";
    String nsURL = "";

    public JavaSaxonLib(String namespace, String nsURL) {
        this.namespace = namespace;
        this.nsURL = nsURL;
    }

    @Override
    public QName getName() {
        return new QName(nsURL, namespace);
    }

    @Override
    public SequenceType getResultType() {
        return SequenceType.makeSequenceType(ItemType.STRING, OccurrenceIndicator.ONE);
    }

    @Override
    public SequenceType[] getArgumentTypes() {
        return new SequenceType[] {};
    }

    @Override
    public XdmValue call(XdmValue[] arguments) throws SaxonApiException {
        String result = "Saxon is being extended correctly.";
        return new XdmAtomicValue(result);
    }
}

在主要方法中:

JavaSaxonLib jsl = new JavaSaxonLib(namespace, nsURL);
saxMan.addFunctionLibrary(jsl);

谢谢! :-)

1 个答案:

答案 0 :(得分:0)

最后!我设法使其正常工作。

棘手的部分是修改xquery以欺骗Saxon 9-HE以使用ExtensionFunction和Classloader执行Java方法。

太糟糕了,我们无法发送私人消息,就好像有人对完整答案感兴趣,我无法正确分享。