我有一个 XQuery 函数可以将一组 XML 文件转换为 HTML 并压缩它们。它在每个文件上运行一个 transform 来创建 元素。
从该函数开始:
declare function xport:make-sources( $path as xs:string) as item()* {
for $article in collection(xmldb:encode-uri($path))
let $docnum := $article/article/div[@class = 'content']/@doc/string()
return
<entry name="{concat($docnum,'.html')}" type='text' method='store'>
{transform:transform($article, doc("/db/EIDO/data/edit/xsl/doc-html.xsl"), <parameters/>)}
</entry>
} ;
给定输入,我运行 XQuery 来仅向我显示转换的结果...并且我看到了这一点(正是我所期望的):
<entry name="LS01.html" type="text" method="store">
<html>
<head>
<style>
body {
font-family: Arial;
}
article img {
width:50%;
}
...
您会注意到这个条目,并且所有条目都没有 XML 声明。
但现在让我们将它们放在一起并将这些条目发送到压缩。这一切都在 Web 应用程序内。完整的 XQuery 是这样的:
xquery version "3.0";
import module namespace transform = "http://exist-db.org/xquery/transform";
declare namespace xport = "http://www.xportability.com";
declare function xport:make-sources( $path as xs:string) as item()* {
for $article in collection(xmldb:encode-uri($path))
let $docnum := $article/article/div[@class = 'content']/@doc/string()
return
<entry name="{concat($docnum,'.html')}" type='text' method='store'>
{transform:transform($article, doc("/db/EIDO/data/edit/xsl/doc-html.xsl"), <parameters/>)}
</entry>
} ;
let $path := request:get-parameter("path", "")
let $filename := request:get-parameter("filename", "")
let $col := xport:make-sources($path)
return
response:stream-binary(
xs:base64Binary(compression:zip($col,true()) ),
'application/zip',
$filename
)
一切正常,我得到了所有已从 XML 转换为 HTML 的文档的 ZIP 文件。
但是,当我查看 ZIP 中的实际文件时,它有以下内容:
<?xml version="1.0" encoding="UTF-8"?>
<html>
<head>
XML 声明不在任何 ZIP 条目上。它不存在于条目列表中的任何位置(因为它不可能存在)。但拉上拉链的动作显然是添加了声明。我看不出有其他原因或办法。即使指定 omit-xml-declaration 或将 XSL 中的输出类型更改为文本或 HTML 也没有什么区别。这是当然的,因为上面显示了 zip 的条目列表,这表明声明不存在after转变。
ZIP 中的文件添加了 XML 声明(句点)。
有一些解决方法吗?