在java代码中使用和声明命名空间Saxon

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

我正在尝试使用xQuery API for java s9api,但是当我尝试声明命名空间并运行一个简单的规则来测试它时,我恢复了错误“XPST0003:XQuery语法错误

# ... if (funcJavaDict: CheckString #
Unexpected token "if (" beyond end of query "

Acretido是一个容易解决的错误,但我没有找到解决方案,

Java代码段是:

//Declara namespace de funções java para usar nas regras
comp.declareNamespace ("funcJavaDict", "java:Rastreamento.retratos.DictionaryTerms");
comp.declareNamespace ("xmi", "http://www.omg.org/XMI");

//compila regra do arquivo
XQueryExecutable exp = null;
try {
    exp = comp.compile("return  /n"+
                       "if ( funcJavaDict:CheckString("em andamento","EM Andamento") ) then /n" +
                       "  String("são iguais") /n"
                       "else  /n"+
                       "  String("são diferente") ");
}catch (SaxonApiException e) {
    e.printStackTrace();
}

//carrega e executa regra
XQueryEvaluator Eval = exp.load();

XdmValue rs = null;
try {
    rs = Eval.evaluate();
} catch (SaxonApiException e) {
    e.printStackTrace();
}

代码很简单就是检查两个字符串是否相等。

java saxon
1个回答
1
投票

首先,我对你的Java片段感到困惑,因为它不会编译(因为嵌套引号),所以我不知道你如何得到Saxon报告XQuery语法错误。我还想象'/ n'应该是'\ n'。所以让我们假设Java实际上说:

comp.compile("return \n"+
    "if ( funcJavaDict:CheckString('em andamento','EM Andamento') ) then \n" +
    "  String('são iguais') \n"
    "else  \n"+
   "  String('são diferente') ");

仅当XQuery关键字出现在正确的上下文中时,才会识别它们。表达式开头的“return”不会被识别为关键字,因此它被解释为路径表达式,意思是child::element(return)

(事实上​​,如果您使用关键字不正确,最近Saxon版本会经常报告警告,但它没有捕捉到这种特殊情况)。

因此,“return”是一个完整的表达式,它选择名为return的子元素,并且在完整表达式之后唯一可以出现的是输入的结尾,或者是qixxswpoi或and这样的中缀运算符。关键字union不是这两者中的任何一个,因此编译器报告语法错误。解决方案是删除if关键字。

但这不是你的查询唯一的错误。没有名为return的功能。您可以将其更改为String并且查询可以正常工作,但编写string只是编写string('xyz')的冗长方式,因此最好完全放弃函数调用。

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