XPST0003 FLWOR表达式不完整:预期为“返回”。即使我包括了它

时间:2019-05-15 22:07:37

标签: xml xquery basex

为了后代,我设法避免命令的正确组织按我的意愿去做。目标是在将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 个答案:

答案 0 :(得分:1)

在“用于XXXX中的$ x”之后,您需要另一个FLWOR子句或“返回表达式”。你不能只是有一个表情。

在这方面,XQuery语法(尤其是更新语法)有点尴尬。它试图看起来像英语,但有时会失败。 “返回”看起来像是命令式命令,因此您希望能够替代其他命令式命令,例如“插入节点”。但这全是幻想。您可以编写“对于$ x,在XXX返回插入节点....”,尽管它的读法不像英语。