Я попытался последовать ответу отсюда Интегрированные функции расширения Saxon-HE | как и где? для выполнения некоторых методов 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);
Спасибо! : -)