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

问题描述 投票:1回答:1

我试着按照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);

谢谢 ! :-)

java xquery saxon
1个回答
0
投票

最后!我设法让它发挥作用。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.