eXist-db compression:zip 函数是否添加 XML 声明

2023-11-29

我有一个 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 声明(句点)。

有一些解决方法吗?


当 zip 绑定的内容时,XML 声明会隐式引入到您的查询中<entry>元素被传递到compression:zip()功能。我建议使用显式设置序列化选项fn:serialize()功能。以下是示例代码,显示如何实现您所描述的结果:

xquery version "3.1";

let $node := <html><head/><body><div><h1>Hello World!</h1></div></body></html>
let $serialized := serialize($node, map { "method": "xml", "indent": true(), 
    "omit-xml-declaration": true() })
let $entries := <entry name="test.html" type="text" method="store">{$serialized}</entry>
let $filename := "test.zip"
return
    response:stream-binary(
        compression:zip($entries, true()),
        'application/zip',
        $filename
    )

将此查询保存到数据库中的某个位置,例如/db/apps/my-app/test.xq并通过将您的网络浏览器指向来调用它http://localhost:8080/exist/apps/my-app/test.xq将会导致您的浏览器下载test.zip。打开此 zip 文件将显示test.html缺少 XML 声明的文件:

<html>
    <head/>
    <body>
        <div>
            <h1>Hello World!</h1>
        </div>
    </body>
</html>

回到基础知识,XQuery 中 XML 声明的存在或不存在是通过omit-xml-declaration序列化参数。要全局省略整个查询的 XML 声明,您可以将这组声明放在查询的序言中:

declare namespace output="http://www.w3.org/2010/xslt-xquery-serialization";

declare option output:method "xml";
declare option output:omit-xml-declaration "yes";

或者,当在查询的一部分中进行本地序列化时,您可以将同一组参数传递给fn:serialize函数作为映射(上面代码示例中使用的方法):

fn:serialize($node, map { "method": "xml", "omit-xml-declaration": true() } )

(第二个选项参数还有一个 XML 语法。)

当前版本的 eXist (v4.0.0) 和最近的版本(可能自 v3.6.0 左右)支持上述所有选项,并且所有版本都支持更紧凑的eXist 特定的序列化工具, 使用exist:serialize选项表示为包含以下内容的字符串key=value pairs:

declare option exist:serialize "method=xml omit-xml-declaration=yes";

您可以在中设置 eXist 的默认序列化行为conf.xml配置文件。可以使用上述方法覆盖conf.xml 中的默认值。 eXist 中不同接口(例如 WebDAV 或 XML-RPC)上的序列化行为通常遵循 conf.xml 中设置的默认值,但可以在每个接口的基础上覆盖这些默认值;例如,请参阅有关 eXist 序列化的文档WebDAV接口.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

eXist-db compression:zip 函数是否添加 XML 声明 的相关文章

  • 如何将XML文本转换为表格格式

    在下面的示例中 我们尝试将 XML 数据转换为 HTML 但这里我们面临着由于元素不一致而面临的挑战 如 和 Note 如果我们从 中删除 元素 则 xslt 代码可以正常工作 参考网址 https xsltfiddle liberty d
  • 通过xquery更改元素的值

  • = 和 != 的语义

    在 XQuery 中 foo bar foo bar 产生值true 这似乎是显而易见的 但我注意到 foo bar foo bar also yields true 我觉得这很令人惊讶 我知道我可以否定 with not x y 我注意到
  • 本机 xml 数据库中的唯一性插入

    我正在开发一个基于XML 的项目 我使用 Sedna 数据库来存储我的集合 其中包含 XML 文件及其 XSD 架构文件 我在这些方案中定义了主键 唯一键 但到目前为止我可以将重复值 通过 XQuery 更新插入命令 插入到主键字段中 为了
  • 如何高效替换XML的多个节点?

    我试图一次性替换单个文档的大约 500 个节点 并且我的数据库中有 5000 多个文档 我正在使用的代码与我之前问过的这个问题相关 Link https stackoverflow com questions 51998598 how to
  • 在 XQuery 中搜索两个图节点之间的路径

    我正在尝试创建一种算法 用于搜索并返回 xQuery 中图形中两个节点之间的路径 但到目前为止我没有运气 因为它只返回一个节点及其相邻节点 首先 我应该明确该图是一个有向图 每个节点可以有零个 一个或多个原点 在 XML 中 节点仅具有到其
  • TSQL:如何使用另一个相关表中的 xml 标记的值更新 xml 标记的值?

    如何使用另一个相关表中 xml 标记的值更新 xml 标记的值 像这样的东西 UPDATE v2 SET xml modify replace value of TAG1 text 1 with CAST v1 xml query TAG2
  • SQL:如何获取 XML 数据类型中的属性值?

    我的数据库中有以下 xml
  • 选择 xQuery 中的第 n 个子元素/选择下一个元素

    我无法找到好的 xQuery 教程 基本上我想做的是检索文本etc 从这个 html 节点 div class venue div class vitem p style padding 6px 0pt 0pt class label AD
  • 如何使用 xquery 从文本中删除表情符号

    我有一个 text 你好 我想使用以下命令从文本中删除表情符号xquery 我怎样才能做到这一点 预期结果 Hello 我尝试使用 replace text x00 xFFFF 但没有用 提前致谢 要替换表情符号 您可以利用 XPath 的
  • 使用 XQuery 连接 XML 节点

    我需要以下输出
  • 提高 SQL Server 中的 Xquery 性能

    我有一个 Azure SQL 数据库 其中有 1 个表和大量记录 超过 75 000 条 该表包含 XML 数据类型的列 此列如下所示
  • 参数的存在数据库基数

    我是exist db 和XQuery 的新手 在exist db中 我有这个站点地图 目录 registranten 包含目录 data 带有xml文件 和两个文件 regBasic xql 和 regSearch xql 我正在尝试使用脚
  • XML:如何将一个 xml 文件的内容加载到另一个文件中

    我只是希望能够从另一个 xml 文件动态写入 xml 文件的内容 A XML包含
  • XQuery 3.0 相当于 xquery 1.0 版本中的 group by

    我有以下代码 并且我的 saxon jar 文件无法读取 xquery 3 0 for item in doc order xml item group by d item dept order by d return
  • Oracle XMLQuery 正在破坏命名空间

    甲骨文版本11 2 下面是我在 XMLType 列上运行的 XMLQuery 的简化版本 当我运行查询时 它只是解析并重新创建存储的 XML tsxm 命名空间 不等于默认命名空间 被改变 该查询不执行任何操作 并且可以轻松重写 但真正的
  • XQuery 中的 element() 与 node()

    有人可以告诉我两者之间的确切区别吗node and element XQuery 中的类型 该文档指出element 是一个元素节点 而node 是任何节点 所以如果我理解正确的话element 是一个子集node 问题是我有一个像这样的
  • 学习 XQuery 的简单工具? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我开始玩XQuery 在 w3schools 1 上 这是一个很好的教程 我只是遇到一些问题 我无法测试网站上的内容 我在网上找到了一个X
  • SQL Server XML查询:查询多个同名子元素

    在上一个问题中 我想知道如何使用 SQL 来JOIN基于标识符的不同 XML 元素 如您所见 我获得了几个不错的解决方案here https stackoverflow com questions 60511464 sql server x
  • xQuery LIKE 运算符?

    有没有办法以与 SQL 相同的方式使用 XQuery 执行 LIKE 操作 我不想构造一些 startswith endswith 和 contains 表达式 我想要实现的目标的示例 for x in user where x first

随机推荐

  • 具有 Windows 身份验证的 cx_Oracle

    我想让 cx Oracle 与 Windows 操作系统身份验证一起使用 但惨败 我知道使用 pyodbc 你可以使用trusted connection yes 但我必须使用 Oracle 客户端 11g 12c 它似乎与 pyodbc
  • 多窗口 OpenGL/过剩

    我想知道如何打开多个 OpenGL Glut 窗口 我的意思是同时多个窗口 不是子窗口和 不更新同一个窗口 虽然我相信上面的答案是准确的 但它比需要的要复杂一些 并且当以后必须处理窗口之间的移动时 例如 在窗口中绘制时 可能会很困难 这是我
  • 与基元进行比较 -> Integer / int

    是不是写得比较好 int primitive1 3 primitive2 4 Integer a new Integer primitive1 Integer b new Integer primitive2 int compare a c
  • 如何使用 VS Package 在解决方案资源管理器中获取所选项目的项目类型 Guid

    我创建了简单的 VS 包 用于在解决方案资源管理器的上下文菜单中添加新项目 我需要检查所选项目的项目类型 GUID 我怎样才能得到这个 例如 一个解决方案包含三种不同类型的项目 如 WindowFormsApplication MVC 项目
  • Python文件常见的头格式是什么?

    我在有关 Python 编码指南的文档中发现了以下 Python 源文件的标头格式 usr bin env python Foobar py Description of what foobar does author Barack Oba
  • WebMvcConfigurerAdapter 不起作用

    这是我正在处理的 WebConfig 代码 package hello config import org springframework context annotation Configuration import org spring
  • 删除 NSdictionary 中的重复项

    有没有办法从 NSDictionary 中删除重复的 键值 对 编辑 我的描述具有误导性 我有重复的对 例如键1 值1键1 值1键2 值2键1 值1 etc 反转键值不是一个好主意 因为并非所有值都可以是键 你可以这样做 dict 是原始字
  • Google App Script 中同时多次提交

    我使用 Google App Script 创建了一个表单 并发送了 Google 电子表格中的所有数据 我的 GS 代码 function doGet e return HtmlService createTemplateFromFile
  • 无法远程运行针对 Safari 11 的测试(ssh、CI)

    当我尝试通过 ssh 手动或通过 Jenkins 其中 Safari 所在的机器是远程从机 运行测试时 我在针对 Safari 11 运行 Ruby RSpec 测试时遇到问题 执行测试时 我收到以下错误 Selenium WebDrive
  • Python Flask - request.json 返回 None 类型而不是 json 字典

    我正在编写一个非常简单的演示 web 应用程序 我似乎无法从中传递 json 对象js to python using ajax 我已经尝试了一些有类似问题的人的建议 例如使用 get json 代替 json 传递对象而不使用JSON s
  • 无法使用 SQL 创建具有小数位的数字列

    下面的SQL CREATE TABLE TESTTABLE TESTFIELD dec 6 2 抛出错误 SQL0104 令牌 无效 有效令牌 AS NO FOR NOT FILE WITH CCSID CHECK LOGGED UNIQU
  • 格式化sectionNameKeyPath NSFetchedResultsController - Swift

    我正在尝试格式化我的sectionNameKeyPath对于我的核心数据获取 使用存储的NSDate属性 它正在全面工作 并根据以下内容将记录拉动 排序到各个部分NSDate但我不知道如何格式化它以按 dd mm yyyy 显示它 我知道如
  • CSS 动画、自动幻灯片上的淡入淡出不透明度

    我想制作一个幻灯片 其中图片通过淡入淡出不透明度进行过渡 它只是在屏幕上变暗并切换到下一张图片 我让它工作 但添加了其他浏览器 webkit 它停止工作 似乎找不到我的错误 幻灯片仍然有效 这是代码 Fading animation in
  • 我的 Android Studio 从 3.4 更新到 3.5 后不断崩溃

    从今天起我就一直面临这个问题 昨天我将 Android Studio 从 3 4 更新到 3 5 它运行良好 但从今天开始 它在启动时崩溃 当我启动时 它显示启动屏幕 然后尝试加载项目并突然关闭或崩溃 而不显示任何错误消息 我应该怎么办 是
  • Delphi XE4 - 八进制常数像十进制常数一样工作

    今天我正在对我的队友进行代码审查 它是普通的旧 Delphi 版本 XE4 我检测到这样的代码 cWin CountryIdsSet array 0 243 of integer 499 688 040 它是十进制 ID 列表 但其中之一
  • C- 使用位域时结构的大小以及它如何存储在内存中

    void main struct bitfield signed int a 3 unsigned int b 13 unsigned int c 1 struct bitfield bit1 2 14 1 clrscr printf d
  • C++ 子模式匹配

    谁能告诉我一个关于在 C C 中使用正则表达式 regex h 来搜索和 或提取正则表达式中的子模式的示例 在 javascript 中 它会是这样的 var str the string contains 123 dots and 344
  • While 循环,每个其他循环的语句?

    我有一个 while 循环 每个循环显示一个 li li 在列表中 有没有办法告诉 php 每个其他循环都应该回显 li style background 222 li 在我的 CSS 中 我将另一种颜色 111 设置为默认值 以便我的网站
  • 如何使用python通过beautifulsoup中的lxml从网页中提取img src?

    我是 python 新手 正在从事亚马逊的网页抓取项目 我在如何使用 BeautifulSoup 通过 lxml 从产品页面中提取产品 img src 时遇到问题 我尝试使用以下代码来提取它 但它没有显示 img 的 url 这是我的代码
  • eXist-db compression:zip 函数是否添加 XML 声明

    我有一个 XQuery 函数可以将一组 XML 文件转换为 HTML 并压缩它们 它在每个文件上运行一个 transform 来创建 元素 从该函数开始 declare function xport make sources path as