XPST0003 不完整的 FLWOR 表达式:需要 'return'。即使我已经包含了它
XPST0003 Incomplete FLWOR expression: expecting 'return'. even though I have included it
为了后代,我设法找出正确的命令组织,做我想做的事。目标是在将 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}
:)
在 "for $x in XXXX" 之后,您需要另一个 FLWOR 子句,或者 "return expression"。你不能只有一个表情。
XQuery语法,尤其是update语法,在这方面有点笨拙。它试图查看 English-like,但有时会失败。 "Return" 看起来像命令式命令,因此您希望能够替换为不同的命令式,例如 "insert nodes";但这一切都是幻觉。你可以写 "for $x in XXX return insert nodes ....",尽管它读起来不像英文。
为了后代,我设法找出正确的命令组织,做我想做的事。目标是在将 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}
:)
在 "for $x in XXXX" 之后,您需要另一个 FLWOR 子句,或者 "return expression"。你不能只有一个表情。
XQuery语法,尤其是update语法,在这方面有点笨拙。它试图查看 English-like,但有时会失败。 "Return" 看起来像命令式命令,因此您希望能够替换为不同的命令式,例如 "insert nodes";但这一切都是幻觉。你可以写 "for $x in XXX return insert nodes ....",尽管它读起来不像英文。