![](/img/trans.png)
[英]Getting no updating expression error using XQuery XQUF in BaseX to make an unknown/variable number of updates in one function
[英]No updating expression allowed Basex
我正在使用 BaseX 版本 8.6.6 我在更新数据库时遇到错误
表达式必须全部更新或返回空序列
下面是代码:
declare %private %updating function local:ingest-job()
{
let $contentpath := 'D:\2019\bloomsbury-ingest-content\TEI.zip'
let $archive := file:read-binary($contentpath)
for $entry in archive:entries($archive)[fn:ends-with(., '.xml')]
let $rootNode := fn:name(fn:parse-xml(archive:extract-text($archive, $entry))/*)
return
let $docId := fn:parse-xml(archive:extract-text($archive, $entry))/*/@xml:id/string()[$rootNode='TEI']
let $cid := fn:replace($docId,'[a-zA-z-]','')
let $jobID := fn:concat($cid,'-',fn:string(fn:format-dateTime(fn:current-dateTime(), '[Y0001][M01][D01][H01][m01][s01][f01]')))
let $jobChunk := <job>
<job-info>
<id>{$jobID}</id>
<cid>{$cid}</cid>
</job-info>
</job>
return
(
db:add('testdb',$jobChunk,fn:concat('/jobs/',$jobID,'.xml')),
db:output( <result><status>Success</status><message>Job created</message><jobid>{$jobID}</jobid></result>)
)
};
<results>{local:ingest-job()}</results>
当前 output:
<result>
<status>Success</status>
<message>Job created</message>
<jobid>9781784604387-2019102816303069</jobid>
</result>
<result>
<status>Success</status>
<message>Job created</message>
<jobid>9781784604417-2019102816303069</jobid>
</result>
预期 output:
<results>
<result>
<status>Success</status>
<message>Job created</message>
<jobid>9781784604387-2019102816303069</jobid>
</result>
<result>
<status>Success</status>
<message>Job created</message>
<jobid>9781784604417-2019102816303069</jobid>
</result>
</results>
这里出了什么问题?
由于错误消息表明您在此处混合了更新和非更新表达式。 您避免在 function 中使用db:output()
执行此操作,但您在主要部分执行此操作:
<results>{local:ingest-job()}</results>
这构造了results
元素,在其中你有一个更新的 function。 XQUF 规范不允许这样做,因为 BaseX 试图符合标准,所以不允许这样做。
您有几种选择如何避免这种情况:
local:ingest-job()
而不是<results>{local:ingest-job()}</results>
。 这样你就没有非更新表达式。 但是,您将没有周围的results
元素。BaseX wiki 中也描述了这些选项。
如果您想避免使用自定义 MIXUPDATES 选项,一种通用方法是使用您的函数来收集保存所需的所有信息,但将实际执行推迟到您的顶级调用。
对于您的代码,可能类似于:
(: info required to save job for $doc map{jobID, jobChunk} :)
declare %private function local:ingest-job($doc as document-node()) as map(*)
{
let $docId :=$doc/*/@xml:id/string()[fn:name($doc/*)='TEI']
let $cid := fn:replace($docId,'[a-zA-z-]','')
let $jobID := fn:concat($cid,'-',fn:string(fn:format-dateTime(fn:current-dateTime(), '[Y0001][M01][D01][H01][m01][s01][f01]')))
let $jobChunk := <job>
<job-info>
<id>{$jobID}</id>
<cid>{$cid}</cid>
</job-info>
</job>
return map{
jobID: $jobID,
jobChunk: $jobChunk
}
};
let $contentpath := 'D:\2019\bloomsbury-ingest-content\TEI.zip'
let $archive := file:read-binary($contentpath)
let $docs:=archive:entries($archive)[fn:ends-with(., '.xml')]!fn:parse-xml(archive:extract-text($archive, .))
let $jobs:=$docs!local:ingest-job(.)
return (
$jobs!db:add('testdb', ?jobChunk, fn:concat('/jobs/',?jobID,'.xml')),
update:output(<results>{
$jobs!<result><status>Success</status><message>Job created</message><jobid>{?jobID}</jobid></result>
}</results>)
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.