繁体   English   中英

不允许更新表达式 Basex

[英]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 试图符合标准,所以不允许这样做。

您有几种选择如何避免这种情况:

  1. 您只能使用变换表达式变换/添加主 memory 中的节点。
  2. 您只需调用local:ingest-job()而不是<results>{local:ingest-job()}</results> 这样你就没有非更新表达式。 但是,您将没有周围的results元素。
  3. 你打开MIXUPDATES

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM