Ошибка кардинальности XQuery при выводе результатов в текстовый файл - PullRequest
0 голосов
/ 30 ноября 2018

Используя XQuery 3.1 (в eXistDB 4.4), у меня есть функция, которая возвращает сериализованный вывод из 710 строк, разделенных следующим образом:

MS609-0001~ok~0001~1r~Deposition~De_Manso_Sanctarum_Puellarum_1~self~1245-05-27~Arnald_Garnier_MSP-AU~self
MS609-0002~ok~0002~1r~Deposition~De_Manso_Sanctarum_Puellarum_1~MS609-0001~1245-05-27~Guilhem_de_Rosengue_MSP-AU~MS609-0001
MS609-0003~ok~0003~1r~Deposition~De_Manso_Sanctarum_Puellarum_1~MS609-0001~1245-05-27~Hugo_de_Mamiros_MSP-AU~MS609-0001

Я получаю вышеуказанные сериализованные результаты в другой функции, которая должна хранить ихв каталоге /db/apps/deheresi/documents как плоский файл depositions.txt

let $x := schedule:deposition-textfile()

return xmldb:store(concat($globalvar:URIdb,"documents"), "deposition.txt", $x)

Но когда я выполняю действие xmldb:store, он возвращает ошибку:

Description: err:XPTY0004 checking function parameter 3 
in call xmldb:store(untyped-value-check[xs:string, 
concat("/db/apps/deheresi/", "documents")], "depositions.txt", $x): 

XPTY0004: The actual cardinality for parameter 3 does not 
match the cardinality declared in the function's signature: 
xmldb:store($collection-uri as xs:string, 
$resource-name as xs:string?, 
$contents as item()) xs:string?. 

Expected cardinality: exactly one, got 710. 

Как получить этисериализованные результаты в текстовый файл?

Заранее спасибо.

ОБНОВЛЕНИЕ: Я попытался обернуть сериализованный вывод в <result>, и это решает проблему количества элементов, НО записывает <result>элемент в файл в виде простого текста:

<result>MS609-0001~ok~0001~1r~Deposition~De_Manso_Sanctarum_Puellarum_1~self~1245-05-27~Arnald_Garnier_MSP-AU~self
MS609-0002~ok~0002~1r~Deposition~De_Manso_Sanctarum_Puellarum_1~MS609-0001~1245-05-27~Guilhem_de_Rosengue_MSP-AU~MS609-0001
MS609-0003~ok~0003~1r~Deposition~De_Manso_Sanctarum_Puellarum_1~MS609-0001~1245-05-27~Hugo_de_Mamiros_MSP-AU~MS609-0001</result>

Даже если я добавлю:

declare option exist:serialize "method=text";

Ответы [ 2 ]

0 голосов
/ 01 декабря 2018

Сообщение об ошибке кажется вполне понятным.Тип возврата schedule:deposition-textfile() недопустим для xmldb:store().Вы хотите одну строку, а не 710.

Либо измените тип возврата вашей функции, либо поищите в документации xQuery для xmldb:store, чтобы найти подходящую альтернативу для вашего возвращаемого типа.

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

Я не знаю функцию, которую вы вызываете, но, возможно, вам следует использовать string-join (), чтобы объединить 710 строк в одну, с разделителем новой строки.

...