XPST0003 Неполное выражение FLWOR: ожидание возврата.хотя я включил его - PullRequest
0 голосов
/ 16 мая 2019

Для потомков мне удалось выяснить правильную организацию команд, делающих то, что я хочу. цель состоит в том, чтобы обработать XML-файл, прежде чем включать его в существующую базу данных. Ниже приведен правильный фрагмент кода, за которым следует мой оригинальный вопрос и неправильный код.

declare variable $filename external;

(: find timestamp in filename :)
(: get package and file into variables :)
let $mydoc    := doc($filename)
let $datetime := file:last-modified($filename)
let $package  := substring-before($mydoc/testrun/testsuite/@name/data(), ".")
let $file     := substring-after($mydoc/testrun/testsuite/@name/data(), ".")

(: add file to database :)
(: insert package, file, and timestamp attributes to every testcase :)
return
  copy $mycopy := $mydoc
  modify (for $testcase in $mycopy//testcase
                    return insert nodes
                  (attribute package {$package}, 
                   attribute file {$file},
                   attribute xs:datetime {$datetime})
                                     into $testcase)
   return
     (db:replace("TestResults", file:name($filename), $mycopy)),
   (db:flush("TestResults"))

Я пытаюсь перенести файлы junit в BaseX. Я очищаю временную метку обновления файла, чтобы использовать ее для обновления тестовых случаев, чтобы отфильтровать последующие тесты по времени. Я также отмечаю контрольные примеры с помощью пакета java и файла, который был запущен. Пример файла Junit ниже

<testrun>
  <testsuite name="package.file">
    <testcase>bogus</testcase>
  </testsuite>
</testrun>

Мой XQuery ниже. Я пытаюсь прочитать новый выходной файл junit, обновить контрольные примеры, а затем добавить все это в базу данных. Кажется, что из-за правил XQUF я могу обновлять только элементы ДО того, как добавлю файлы в базу данных. Я предполагаю, что $ mydoc - это база данных в памяти того документа, который я обновляю. Текущая ошибка в том, что парсер запросов не может найти оператор return. Я знаю, что это не ошибка форматирования из-за моего редактора. Если есть более чистый способ сделать это, пожалуйста, дайте мне знать, я новичок в xml и xquery и basex. Спасибо

declare variable $filename external;
(: find timestamp in filename :)
(: get package and file into variables :)
let $mydoc    := doc($filename)
let $datetime := file:last-modified($filename)
let $package  := substring-before($mydoc/testrun/testsuite/@name/data(), ".")
let $file     := substring-after($mydoc/testrun/testsuite/@name/data(), ".")

(: add file to database :)
(:
 : so you cant insert a new document into a database and then update its newly added elements, so create a doc first? edit it? then add that?
 :)

(: insert package, file, and timestamp attributes to every testcase :)
for $testcase in $mydoc//testcase
insert nodes
    (attribute package {$package},
     attribute file {$file},
     attribute xs:datetime {$datetime}) into $testcase

return (db:replace("TestResults", $filename, $mydoc),
        db:flush("TestResults"))


(: db:replace("TestResults", $filename, $mydoc) :)
(:
 : return db:replace("TestResults", $filename, $mydoc)
 :)
(:
 : return db:replace{. , $mydoc}
 :)

1 Ответ

1 голос
/ 16 мая 2019

После "для $ x в XXXX" вам нужно либо другое предложение FLWOR, либо "выражение возврата".Вы не можете просто иметь выражение.

Синтаксис XQuery, особенно синтаксис обновления, немного неудобен в этом отношении.Он пытается выглядеть по-английски, но иногда терпит неудачу.«Return» выглядит как императивная команда, так что вы ожидаете, что сможете заменить другой императив, например, «вставить узлы»;но это все иллюзия.Вы можете написать «для $ x в XXX возвратных узлов вставки ....», несмотря на то, что он не читается как английский.

...