eXist-DB / XQuery StringValue не может быть приведен к AnyURIValue (с использованием сжатия: zip) - PullRequest
0 голосов
/ 12 ноября 2018

В eXist 4.4 / XQuery 3.1 я создаю функцию для сжатия нескольких файлов xml в zip-файл, используя compression:zip.

У меня есть одна функция, которая собирает все URI для документов, подлежащих сжатию, schedule:get-document-uris-for-zip(xmlid as xs:string).Эта функция возвращает списки документов, подобные следующему:

/db/apps/deheresi/data/MS609-0001.xml
/db/apps/deheresi/data/MS609-0002.xml
/db/apps/deheresi/data/MS609-0003.xml
/db/apps/deheresi/data/MS609-0004.xml
/db/apps/deheresi/data/MS609-0005.xml
/db/apps/deheresi/data/MS609-0006.xml
/db/apps/deheresi/data/MS609-0007.xml
/db/apps/deheresi/data/MS609-0008.xml
/db/apps/deheresi/data/MS609-0009.xml
/db/apps/deheresi/data/MS609-0010.xml

Эта функция вызывается функцией сжатия следующим образом

declare function schedule:create-zip-by-batch()
{
  let $batch := doc(concat($globalvar:URIdocuments,"document_collections.xml"))

  for $entry in $batch//collection[@compile="y"]

    let $zipobject := compression:zip(schedule:get-document-uris-for-zip($entry/string(@xml:id)),false())

    let $zipstore := xmldb:store("/db/apps/deheresi/documents",
                                 "MS609_tei.zip", 
                                 $zipobject)

    return $zipstore
};

Это выдает ошибку cast следующим образом, ноЯ не могу определить, как решить эту проблему ...

org.exist.xquery.value.StringValue cannot be cast to org.exist.xquery.value.AnyURIValue

Заранее большое спасибо.

Редактировать - я добавляю сюда часть функции schedule:get-document-uris-for-zip(xmlid as xs:string), которая выводитсписок URI.URI создаются путем конкатенации строк:

       (: get names of documents which meet criteria :)
       let $list := xmldb:get-child-resources("/db/apps/deheresi/data")[starts-with(., $y/string(@filename)) and ends-with(., $y/string(@ext))]

        (: create URI for each document :)   
        return 
             for $n in $list
             return concat("/db/apps/deheresi/data/",$n)

1 Ответ

0 голосов
/ 12 ноября 2018

Вы правы, что нашли эту функцию немного запутанной. Параметр (специфичный для eXist) compression:zip() function $sources набирается так, как если бы он был достаточно гибким, как xs:anyType()+. Но на самом деле он довольно строг в отношении двух типов элементов, которые он принимает: последовательность URI (то есть типа xs:anyURI) или последовательность <entry> элементов:

<entry name="filename.ext" 
       type="collection|uri|binary|xml|text" 
       method="deflate|store"
    >data</entry>

См. https://exist -db.org / существующие / apps / fundocs / view.html? Uri = http://exist -db.org / xquery / сжатие # zip.2 .

Проблема с вашим кодом заключается в том, что вы передаете строки в параметре $sources и не приводите эти строки как xs:anyURI.

Вот пример рабочего кода:

xquery version "3.1";

let $prepare := 
    (
        xmldb:create-collection("/db", "test"),
        xmldb:store("/db/test", "test.xml", <test/>)
    )
let $zip := compression:zip("/db/test/test.xml" cast as xs:anyURI, false())
return 
    xmldb:store("/db/test", "test.zip", $zip)
...