用于转换大型 XML 文件的内存高效 XSLT

2023-12-07

这个问题与最近的回答 迈克尔·霍257k,这又与的回答 迪米特·诺瓦切夫.

当使用上述答案中的样式表时(通过迈克尔·霍257k),对于一个大的XML(大约60MB,下面是示例XML)并且转换成功进行。

当尝试另一个样式表时,与 michael.hor257k 的有点不同,并且旨在对元素进行分组(带有子元素)sectPr) 及其后续兄弟元素(直到下一个带有子元素的后续兄弟元素sectPr),递归地(即,将元素分组到输入 XML 的深度)。

示例输入 XML:

<body>
    <p/>
    <p>
        <sectPr/>
    </p>
    <p/>
    <p/>
    <tbl/>
    <p>
        <sectPr/>
    </p>
    <p/>
</body>

我尝试过的样式表:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

    <xsl:output method="xml" indent="yes"/>

    <xsl:template match="*">
        <xsl:copy>
            <xsl:apply-templates select="*[1] | *[sectPr]"/>
        </xsl:copy>
        <xsl:apply-templates select="following-sibling::*[1][not(sectPr)]"/>
    </xsl:template>

    <xsl:template match="*[sectPr]">
        <myTag>
            <xsl:copy>
                <xsl:apply-templates select="*[1] | *[sectPr]"/>
            </xsl:copy>
            <xsl:apply-templates select="following-sibling::*[1][not(sectPr)]"/>
        </myTag>
    </xsl:template>

</xsl:stylesheet>

出于好奇,我遇到了内存不足错误转换大约 60MB 的 XML。

我想知道,并且我认为我不理解 michael.hor257k 和 Dimitre Novaatchev 提供的 XSLT 背后的技巧,这不会导致内存异常。

我的样式表和上面提到的我得到 OutOfMemoryError 的答案之间的最大区别是什么。以及如何更新样式表以提高内存效率。


林加莫西 CS,

请添加<xsl:strip-space elements="*"/>声明,您从原始解决方案中删除了该声明。这会从源 XML 文档中去除任何仅包含空格的文本节点。

不剥离这些节点可能会显着增加节点的数量以及保存它们的内存 - 在您的情况下,保存 XML 文档所需的内存几乎是保存具有这些节点的 XML 文档所需内存的两倍被剥夺了。

我运行您的转换正常,但在删除节点后,它在 MS XslCompiledTransform 上运行速度提高了 20%。

然后我运行了你的转换——一次是在问题中发布的,第二次是添加了的<xsl:strip-space elements="*"/>与 Saxon 9.1J — 因为它还显示了转换的内存消耗。两次运行都取得了成功。在第一种情况下,处理的节点数是9525004 and 340MB使用了内存。转型经历了5.3秒。在第二种情况下,节点数为4336366 and 215MB使用了内存。转变发生在5.06sec

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

用于转换大型 XML 文件的内存高效 XSLT 的相关文章

  • 如何轻松调试布局 Xml 警告/错误?

    我陷入了这个错误 Warning simplexml load string Entity line 46 parser error Comment not terminated in lib Varien Simplexml Config
  • jQuery - xpath 查找?

    如果您在 xml 中有下面的 xml 那么您会使用以下命令变得昏昏欲睡 xml find animal find dog find beagle text jQuery 中是否有类似的方法来使用 xpath xml xpathfind an
  • Camel Sql 大型数据集的消费者性能

    我正在尝试在 Ignite 缓存中缓存一些静态数据 以便更快地查询 因此我需要从 DataBase 读取数据 以便将它们插入到缓存集群中 但是行数约为 300 万 通常会导致 OutOfMemory 错误 因为 SqlComponent 试
  • 使用字符串数组填充 Spinner

    当谈到 Android 应用程序时 我属于新手联盟 我希望用数组或字符串填充 Spinner 它是一个转换器应用程序 下面是我的 XML 文件的摘录 我希望填充 Spinner
  • Xslt 到 xsl-fo 转换

    我想将 xslt 转换为 xsl fo 但我不太确定我能做到这一点 我尝试将 XML 列表转换为 xsl fo 列表 谁能告诉我在哪里可以找到我在谷歌上搜索了很长时间没有很多这样的例子 我的XML是这样的 p TEXT p ul li It
  • 使用 JAXB 编组 LocalDate

    我正在构建一系列链接类 我希望能够将其实例编组到 XML 以便我可以将它们保存到文件中并稍后再次读取它们 目前我使用以下代码作为测试用例 import javax xml bind annotation import javax xml b
  • 带属性的 XML 模式限制

    在XML Schema中 如何创建元素Age具有restriction允许在元素内部写入最大值为 10 最小值为 1 的整数Age还有元素Age有属性
  • 用于冒号分隔标签的 XML 解析器? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 使用 JAXB 编组只能包含多种子节点类型之一的 XML 节点(SharePoint 查询)

    我正在尝试创建 JAXB 带注释的类来生成基于 Microsoft SharePoint 的 XML查询模式 http msdn microsoft com en us library ms467521 28v office 14 29 a
  • C# MonoGame 有帮助吗? (Content.Load("入侵者");)

    我正在 MonoGame 中使用 Open GL 制作太空入侵者游戏 并且尝试加载已添加到内容文件夹中的纹理 这是一个名为 Invader 的 PNG 文件 我使用的代码是 invader Content Load
  • 如何使用scrapy抓取xml url

    你好 我正在使用 scrapy 来抓取 xml url 假设下面是我的 Spider py 代码 class TestSpider BaseSpider name test allowed domains www example com s
  • 为什么我的 C# Paint 方法内存不足?

    我是 C 新手 尝试通过编写一些简单的应用程序来熟悉语法和 NET 库 我最近进行的一个迷你项目是极地时钟就像这里发现的一样 https mbostock github io protovis ex clock html 我早期注意到的问题
  • 使用 C# 编辑 XML 文档

    我在解决如何将元素添加到 XML 文档中时遇到了一些麻烦 我想将热点信息添加到 xml 中 其中 Id 正确 因此 id 2 添加热点信息 这是我当前的 XML
  • & 在 xml 文件中算作一个还是多个字符?

    我正在使用的 XML 模式具有特定的字符串字符长度 所以我可能有一个类似的字符串 Jim Mary 在 C 中是 10 个字符 但是当它写入 xml 时 它会变成 Jim amp Mary 如果 XML 模式规定字符串最多只能有 10 个字
  • 具有挑战性的问题 - 使用 PHP 对 XML 数据进行排序

    我有 xml 文件 其中包含大量产品数据 我需要根据我的字段 ProductRange 的数据对我的产品进行排序 ProductRange urldecode GET Range XML 文件数据
  • 在 XSL 中测试 xs:decimal 的正确方法是什么?

    我试图根据传入的数据显示不同的信息 如果它是整数 我想只显示数字 如果它是小数 我想使用 0 00 模式 是的 我知道 有点混乱 但这就是开发规范 gt 对于这个特定部分 我有以下 XSL 但我无法看到 xsl when 错误消息 预期的表
  • 以 UTF8 而不是 UTF16 输出 DataTable XML

    我有一个 DataTable 我正在使用 WriteXML 创建一个 XML 文件 尽管我在以 UTF 16 编码导出它时遇到问题 并且似乎没有明显的方法来更改它 我了解 NET 在字符串内部使用 UTF 16 这是正确的吗 然后 我通过
  • 带有图层列表的自定义背景以显示对角线?

    我只想创建一个自定义背景 但我不知道如何使用 xml 而不是图像来做到这一点 这是 XML
  • 有人可以推荐一个免费的 xslt 工具吗? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何成功地用 XML 中的批处理替换文本

    我尝试使用批处理在 XML 页面中替换字符串 但无法成功完全替换它 我有这个批处理代码 echo off setlocal EnableDelayedExpansion set search logLevel 3 set replace l

随机推荐

  • 网络关闭时本地存储的上游数据不会在 JB 和 ICS 上的网络上发送(它们正在重新启动)

    这是我的场景 当网络中断时 GCM 客户端将设备到云的消息 上游 本地存储在本地队列中 其长度似乎为 20 尽管从未说明 当此队列已满时 消息将被本地丢弃 并且意图包含消息类型MESSAGE TYPE SEND ERROR 关于删除哪个 m
  • Sequelize 中的复数形式如何工作?

    使用时续集和阅读Sequelize 文档 我观察到有时型号名称使用单数 有时使用复数 有些通过关联自动添加到模型的方法具有单数形式 有些具有复数形式 1 Sequelize 如何计算复数 它只是在字符串后面附加一个 s 吗 2 如果我想使用
  • 使用 Google Caja 运行用户提供的 Javascript

    看来官方例子 use a caja js仅包含一个文件iframe从托管 caja 编译服务的服务器加载 URL 该服务又从某个 URL 获取输入 相关 API 可用here 然而 我真正想要的是安全地 并且重复地 运行用户提供的 Java
  • 如何实现 &Struct 的默认值?

    在多次阅读 Rust 书之后 我想我开始了解生命周期的要点 但对我来说 另一个问题是我们需要用来声明它们的语法 我发现这确实违反直觉 我将我的一段愚蠢的代码简化为这对结构 其中一个引用另一个 derive Debug Default pub
  • RemoteWebDriver 和 Grid - 是否可以获取服务器 IP?

    我使用 Selenium 2 和 Grid 中的 RemoteWebDriver 将测试划分到多个虚拟机上 假设我有两台 Linux 机器 在测试中我指定了在 Linux 机器上运行的功能 但我无法弄清楚正在使用这两台机器中的哪一台 有什么
  • SapUI5-平铺容器不工作

    由于某种原因 tilecontainer 无法工作 如果我放置一个列表而不是 Tiles 它工作正常 我正在尝试构建一个包含图块的简单应用程序 我是 SAPUI5 的新手 这是XML的代码
  • 如何从其父视图中删除带有圆角的 UIView?

    我正在为 3 2 及更高版本创建 iPad 应用程序 我的应用程序有一个覆盖视图 它具有半透明效果 使其下方的所有内容都变暗 在这个视图的中间 我在这个半透明的地方切了一个洞 让部分背景过滤器毫发无伤地通过 代码如下 void drawRe
  • 显示ArrayList的表

    我有一个main java有一个按钮 当您按下它时 它会调用一个方法并返回一个节点的 ArrayList 我想在表中显示 ArrayList Node 类中描述的 5 个字段 如何做到这一点 问题是显示一些列表类型的字段 Node java
  • Mercurial:检测到合并冲突时不会出现编辑器

    我想知道这里有人有在Ubuntu上运行mercurial的经验吗 我整个早上都在玩它 喜欢迄今为止所看到的一切 我遇到的一个问题是 当我进行合并并检测到冲突时 它不会自动在命令行编辑器中显示该文件以允许我解决冲突 它只是告诉我存在冲突 然后
  • 在 Spring 5 JPA findOne() 中获取 `Long 无法转换为 Example`

    我得到一个argument mismatch Long cannot be converted to Example
  • 如何让OpenCv显示两个颜色通道组合的图像?

    使用 OpenCV 从图像中获取一个颜色通道的输出并不困难 而且可以轻松完成 但是否有可能从图像的三种主要 BGR 颜色中 我想直接使用函数看到仅绿色和红色组合而不是蓝色的图像 因此 我可以通过将所有蓝色值设置为 0 来执行上述操作 然后查
  • Tomcat 7 不断给我一个 404。我做错了什么?

    这是我的第一个 servlet 这是它的代码 import javax servlet import javax servlet http import java io public class Ch1Servlet extends Htt
  • 按键事件无反应

    我正在QT上写文章 OpenGL已连接 工作正常 但keyPressEvent和mousePressEvent事件不响应击键 class MainWindow public QGLWidget Q OBJECT protected void
  • 为 EditText 实现文本观察器

    我有一个编辑文本 当我点击它时 它变得可聚焦 我将输入要输入到 EditText 中的输入文本 我想为 EditText 实现一个监听器 这样当我停止输入时 它应该自动将该文本保存到数据库中 而不是有一个按钮 如何让 EditText 有一
  • COM+ 组件调用其他 COM+ 组件 - “无法加载类型”

    我有两个 NET 程序集 它们注册为 COM 组件 并且我正在从常规控制台应用程序测试工具中测试它们 Dim objFirst As New MyFirstComponent COM initialisation Dim RC As Boo
  • 如何将 Glass Fish 服务器与适用于 Java EE 的 eclipse luna 结合使用?

    我认为当您安装适用于 Java EE 的 Glass Fish 工具时 Glass Fish 服务器会随 Eclipse 一起提供 然而 在尝试安装Glass Fish工具后 它说没有什么可更新的 好的 所以当我尝试启动服务器时 它会要求服
  • 变量声明和内存分配

    我想知道局部变量声明过程中是否分配了内存 假设我在函数内编写这段代码 整数a 10 内存已分配 值 10 已存储在其中 关于什么int a 这个声明语句会分配4个字节的内存吗 Thanks 局部变量通常存储在堆栈上 因此实际上分配了字节in
  • 关于理解绑定和继承的相关性

    今天我正在阅读 MDN 文档Function prototype bind 在该部分下用作构造函数的绑定函数有一个例子我不太理解 我在 Node js v 4 4 5 和 Google Chrome v58 0 3029 81 中运行了以下
  • Chromedriver 使用 Selenium 打开 1800-1900 页时显示 SBOX_FATAL_MEMORY_EXCEEDED 错误

    driver t webdriver Chrome driver t implicitly wait 5 driver t get Company intranet elem driver t find element by id j us
  • 用于转换大型 XML 文件的内存高效 XSLT

    这个问题与最近的回答 迈克尔 霍257k 这又与的回答 迪米特 诺瓦切夫 当使用上述答案中的样式表时 通过迈克尔 霍257k 对于一个大的XML 大约60MB 下面是示例XML 并且转换成功进行 当尝试另一个样式表时 与 michael h