eXist-db / xquery 将输出序列化为 csv

eXist-db / xquery serialize output to csv

在我的网站(eXist-db,Xquery 3.1)上,用户可以下载动态生成的文件。我已经成功地为 .pdf.xml.zip 文件实现了这个。

现在我试图将 .csv 输出序列化,但失败了。

我收到以下错误:

checking function parameter 1
The actual cardinality for parameter 1 does not match the cardinality declared in the function's signature: . Expected cardinality: zero or one, got 2.

错误是在函数local:download()中触发的let $binaryresult := util:string-to-binary($result,'UTF-8')

我想我可以将一系列字符串传递给序列化程序,然后序列化程序会有效地将每个项目输出到 .csv 文档中的一行(创建一行 return)。

显然我正在接近 .csv 的序列化错误,但一直无法弄清楚如何纠正这个问题。问题根本在于 "how to output data rows to a CSV with line returns".

declare option exist:serialize "method=text media-type=text/csv"; 
declare function local:output-csv()
{
  $output := (concat("title1", ",", "title2"),concat("data1a", ",", "data2a"),concat("data1b", ",", "data2b"))
  return $output
};
declare function local:download()
{
 let $filename := "search_results.csv"
 let $result := local:output-csv()
 let $binaryresult := util:string-to-binary($result,'UTF-8')
 return 
      response:stream-binary($binaryresult,'text/csv',$filename)
};

在此先感谢您的帮助。

我不熟悉 eXist-db,我不知道你是否需要一个字符串到二进制的函数来 return 像 CSV 这样的文本结果,但我认为你可以使用 string-join($output, '
')local:output-csv 函数中或在另一个函数中使用它与 util:string-to-binary(string-join($result, '
'), 'UTF-8') 以确保您将单个字符串而不是字符串序列传递给该函数。