代码之家  ›  专栏  ›  技术社区  ›  jbrehr

exist db serialize is expand xincludes=否被忽略?

  •  1
  • jbrehr  · 技术社区  · 5 年前

    在现有的DB4.4、XQuery3.1中,我正在将一些XML文件压缩到一个目录中的.zip文件中。压缩过程使用 serialize() .

    XML文件有一些大的 xincludes 哪一个 according to the documentation 在序列化中自动处理。我试图在代码中的两个位置“关闭”xinclude序列化( prologue declare map ,但序列化程序仍在输出所有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
    };
    

    使用xincludes来重现这个问题的XML数据可以在这里找到。 http://medieval-inquisition.huma-num.fr/downloads 在“BM MS609版本(TEI XML)”描述下。

    非常感谢。

    1 回复  |  直到 5 年前
        1
  •  1
  •   Joe Wicentowski    5 年前

    这个 expand-xincludes serialization parameter 是特定于现有的,因此(或至少目前)不能使用 fn:serialize() 功能。相反,使用 util:serialize() function :

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

    或者,由于您最终对压缩集合的内容感兴趣,可以跳过显式序列化步骤,在查询的prolog中声明序列化选项(或使用 util:declare-option() ,并简单地提供 compression:zip() function 要压缩的集合/文档的URI路径。例如:

    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)
    

    有关现有序列化选项的详细信息,请参阅我以前对类似问题的回答: https://stackoverflow.com/a/49290616/659732 .