eXist-db中的返回类型错误

时间:2016-04-29 11:44:04

标签: exist-db

我刚刚意识到我的记录器在负责生成epub的函数的情况下非常活跃。问题是它按预期工作。因此,我想知道这里发生了什么。

错误:

java:org.exist.xquery.XPathException, exerr:ERROR The actual return type does not match the sequence type declared in the function's signature: epub-util:render-epub(node()+, xs:string) xs:base64Binary. Expected cardinality: exactly one, got 0.

... epub适当地提供给客户。

对于exerr:ERROR,我检查了$EXIST_HOME/webapp/WEB-INF/logs/exist.log中的常规日志。没有发现相关错误。

疑似功能:

declare function epub-util:render-epub($entries as node()+, $name as xs:string) as xs:base64Binary {
    let $zip-file    := compression:zip($entries, true())
    let $archiveName := $name
    return
        response:stream-binary($zip-file, 'application/epub+zip', lower-case(replace($archiveName, ' ', '-')) || '.epub')
};

我在Ubuntu Server 14.04上运行eXist,eXist-db是3.0.RC1。

2 个答案:

答案 0 :(得分:2)

根据response:stream-binary()的eXist-db函数文档,此函数返回item(),而不是xs:base64binary。用item()替换返回类型应该可以解决错误。

答案 1 :(得分:2)

if (text) { sendTextMessage(sender, 'Response 1'); res.sendStatus(200); } else { queryDB( sendTextMessage(sender, 'Response 2'); res.sendStatus(200); ) } 是一个非常特殊的函数,它本质上直接将字节写入 servlet 输出流,因此它只能在REST接口中使用。

它只能将字节流写入HTTP代理,例如,你的网络浏览器。无法将此数据存储在变量中。

我同意,即使response:stream-binary()不是一件好事,它应该是item(),但不存在。

将此表达式作为xquery脚本中的最后一个函数调用的常见用例。我们在JFreechart库中使用的类似构造。