eXist-db serialize is expand-xincludes=no ignored?

2019-07-23 15:18发布

In eXist-db 4.4, Xquery 3.1, I am compressing a number of XML files to a .zip in a directory. The compression process uses serialize().

The XML files have some large xincludes which according to the documentation are automatically processed in serializing. I have attempted to 'turn off' the xinclude serialization in two places in the code (prologue declare and map), but the serializer is still outputting all xincludes:

declare option exist:serialize "expand-xincludes=no";
declare function zip:get-entries-for-zip() 
{
  (: get documents prefixed by 'MS609' :)
  let $pref := "MS609"

  (: get list of document names :)

  let $doclist := xmldb:get-child-resources($globalvar:URIdata)[starts-with(., $pref)]

  (: output serialized entries :)
  let $entries :=  
      for $n in $doclist
         return
            <entry name="{$n}" type='text' method='store'>
               {serialize(doc(concat($globalvar:URIdata, "/", $n)), map { "method": "xml", "expand-xincludes": "no"})}
            </entry>

   return $entries
};

The XML data with xincludes to reproduce this problem can be found here http://medieval-inquisition.huma-num.fr/downloads under the description "BM MS609 Edition (tei-xml)".

Many thanks in advance.

1条回答
淡お忘
2楼-- · 2019-07-23 16:00

The expand-xincludes serialization parameter is specific to eXist and, as such (or at least at present), cannot be set using the fn:serialize() function. Instead, use the util:serialize() function:

util:serialize($document, "expand-xincludes=no")

Alternatively, since you're ultimately interested in zipping the contents of a collection, you can skip the explicit serialization step, declare your serialization options in the query's prolog (or set it inline using util:declare-option()), and simply provide the compression:zip() function the URI path(s) to the collections/documents you want to zip. For example:

xquery version "3.1";

declare option exist:serialize "expand-xincludes=no";

let $sources := "/db/apps/my-app/my-data" (: or a sequence of paths to individual docs:) ! xs:anyURI(.)
let $preserve-collection-structure := false()
let $zip := compression:zip($sources, $preserve-collection-structure), 
return
    xmldb:store("/db", "my-data.zip", $zip)

For more on serialization options in eXist, see my earlier answer to a similar question: https://stackoverflow.com/a/49290616/659732.

查看更多
登录 后发表回答