【问题标题】:XPST0003 Incomplete FLWOR expression: expecting 'return'. even though I have included itXPST0003 不完整的 FLWOR 表达式:期待“返回”。即使我已经包含它
【发布时间】:2019-05-15 22:07:36
【问题描述】:

为了后代,我设法找出正确的命令组织,按照我的意愿去做。目标是在将 xml 文件包含在现有数据库中之前对其进行处理。正确的代码 sn-p 如下,后面是我原来的问题和不正确的代码。

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 是我正在更新的一个文档的内存数据库。当前的错误是查询解析器找不到返回语句。我知道这不是我的编辑器造成的格式错误。如果有更简洁的方法可以做到这一点,请告诉我,我是 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}
 :)

【问题讨论】:

  • insert 不在预期存在于 FLWOR 表达式中的那组关键字中(当然,预期以 return 结尾。它不是 let,而是 @ 987654327@ 等...所以这看起来像是一个直截了当的抱怨,即解析器看到的是非 FLWOR 语法,而 FLWOR 没有先正确结束。
  • 当然,我在这里很生疏,所以我愿意更正,但我希望你把你的 FLWOR inside 你的更新表达式,而不是另一个一路走来。
  • 如果您可以提交答案,我会将您的答案标记为正确,但谢谢您,这似乎是这种情况下的问题

标签: xml xquery basex


【解决方案1】:

在“for $x in XXXX”之后,您要么需要另一个 FLWOR 子句,要么需要一个“返回表达式”。你不能只有一个表情。

XQuery 语法,尤其是更新语法,在这方面有点笨拙。它试图看起来像英语,但有时会失败。 “返回”看起来像一个命令式命令,因此您希望能够替换一个不同的命令式,例如“插入节点”;但这一切都是错觉。你可以写“for $x in XXX return insert nodes ....”尽管它读起来不像英文。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-12
    • 1970-01-01
    • 1970-01-01
    • 2021-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多