Выражение обновления не разрешено 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>

текущий выход:

<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>
<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>

что здесь не так?


person Dharmendra Kumar Singh    schedule 28.10.2019    source источник


Ответы (1)


Поскольку сообщение об ошибке указывает, что вы смешиваете здесь обновляемые и необновляющие выражения. Вы избегаете этого в своей функции, используя db:output(), но делаете это в основной части:

<results>{local:ingest-job()}</results>

Это создает элемент results, и внутри него у вас есть функция обновления. Спецификация XQUF не позволяет этого, и поскольку BaseX пытается соответствовать стандартам, вам не разрешено это делать.

У вас есть несколько вариантов, как этого избежать:

  1. Вы только преобразуете/добавляете узлы в основную память, используя выражения преобразования.
  2. Вы просто вызываете local:ingest-job() вместо <results>{local:ingest-job()}</results>. Таким образом, у вас нет необновляемого выражения. Однако тогда у вас не будет окружающего элемента results.
  3. Вы включаете MIXUPDATES.

Эти параметры также описаны в вики BaseX.

person dirkk    schedule 29.10.2019
comment
Спасибо за ответ dirkk. если я просто вызываю local:ingest-job() вместо ‹results›{local:ingest-job()}‹/results›, то как я могу обернуть текущий вывод в элементы ‹results›. - person Dharmendra Kumar Singh; 29.10.2019
comment
Большое спасибо, drikk, если я включу MIXUPDATES, это сработает ‹results›{local:ingest-job()}‹/results›, и я удалил db: output из основной части. - person Dharmendra Kumar Singh; 29.10.2019
comment
Да, при использовании второго решения вы потеряете элемент результатов. Я отредактировал свой ответ, чтобы уточнить. Если вы довольны MIXUPDATES, тогда вы, безусловно, готовы к работе. Однако имейте в виду, что это нестандартное поведение и специфично для BaseX (т. е. вы не можете просто переключиться на другой процессор XQuery), а также есть несколько веских причин, по которым спецификация запрещает это (по сути, теперь вы покидаете область функционального программирования). ) - person dirkk; 29.10.2019