我试图按照此处的答案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);
谢谢! :-)
答案 0 :(得分:0)
最后!我设法使其正常工作。
棘手的部分是修改xquery以欺骗Saxon 9-HE以使用ExtensionFunction和Classloader执行Java方法。
太糟糕了,我们无法发送私人消息,就好像有人对完整答案感兴趣,我无法正确分享。