eXist-DB / XQuery StringValue 无法转换为 AnyURIValue(使用 compression:zip)
eXist-DB / XQuery StringValue cannot be cast to AnyURIValue (using compression:zip)
在 eXist 4.4/XQuery 3.1 中,我正在构建一个函数,使用 compression:zip
将多个 xml 文件压缩成一个 zip。
我有一个函数可以收集要压缩的文档的所有 URI,schedule:get-document-uris-for-zip(xmlid as xs:string)
。此函数 returns 列出如下文件:
/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
非常感谢。
编辑 - 我在此处添加了输出 URI 列表的函数 schedule:get-document-uris-for-zip(xmlid as xs:string)
的一部分。 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)
您认为此功能有点令人困惑,这是对的。 (eXist 特定的)compression:zip()
函数 $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/exist/apps/fundocs/view.html?uri=http://exist-db.org/xquery/compression#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)
在 eXist 4.4/XQuery 3.1 中,我正在构建一个函数,使用 compression:zip
将多个 xml 文件压缩成一个 zip。
我有一个函数可以收集要压缩的文档的所有 URI,schedule:get-document-uris-for-zip(xmlid as xs:string)
。此函数 returns 列出如下文件:
/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
非常感谢。
编辑 - 我在此处添加了输出 URI 列表的函数 schedule:get-document-uris-for-zip(xmlid as xs:string)
的一部分。 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)
您认为此功能有点令人困惑,这是对的。 (eXist 特定的)compression:zip()
函数 $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/exist/apps/fundocs/view.html?uri=http://exist-db.org/xquery/compression#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)