США объявил пространство имен саксонский em codigo java - PullRequest
0 голосов
/ 02 сентября 2018

Я пытаюсь использовать API xQuery для 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();
}

код очень прост - просто проверьте, эквивалентны ли две строки.

1 Ответ

0 голосов
/ 03 сентября 2018

Во-первых, я озадачен вашим фрагментом 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).

(На самом деле последние саксонские выпуски часто сообщают о предупреждении, если вы неправильно используете ключевое слово, подобное этому, но в данном конкретном случае это не срабатывает).

Таким образом, «return» - это законченное выражение, которое выбирает дочерние элементы с именем return, и единственное, что может прийти после полного выражения, - это либо конец ввода, либо инфиксный оператор, такой как and или union. Ключевое слово if не является ни одной из этих вещей, поэтому компилятор сообщает об ошибке синтаксиса. Решение состоит в том, чтобы удалить ключевое слово return.

Но это не единственная ошибка в вашем запросе. Не существует функции с именем String. Вы можете изменить его на string, и запрос будет работать, но написание string('xyz') - это просто скучный способ написания 'xyz', поэтому лучше полностью отказаться от вызова функции.

...