【问题标题】:Incremental/streaming XSLT transformations?增量/流式 XSLT 转换?
【发布时间】:2012-06-08 11:38:29
【问题描述】:

我通常使用 JDK (JDK 7) 中的 XSLT 支持来进行 XSLT 转换。最近我遇到了一个相当大的 XML 文档,并且对其应用 XSLT 转换(即使是非常基本的转换)会导致使用大量内存。

我一直小心翼翼地处理所有流式处理,但似乎 JDK 中的 XSLT 引擎(似乎是经过修改的 Xalan)总是首先在内存中构建 DOM。显然这不是我想要的。

现在我发现单独提供的 Xalan(2007 年的 2.7.1!)确实有一个用于进行增量转换的 API。因此,虽然这似乎确实有效,但我实际上希望我的代码在股票 JDK 上运行,而不是告诉用户摆弄任何认可的文件夹。

在 Java 中进行增量 XSLT 转换以使我的代码与未修改/库存 JDK 安装兼容的最佳方法是什么?

更新: 这个最近更新的问题密切相关:What is the Most Efficient Java-Based streaming XSLT Processor?

【问题讨论】:

标签: java xml xslt xalan


【解决方案1】:

您是否尝试过撒克逊的saxon:stream() 扩展

【讨论】:

  • 感谢您的回复!似乎此功能仅在 Saxon-EE 中可用,大约为 8000 磅。不幸的是,我无法让我们的经理接受这样的金额。
  • @dextermeyers:我很惊讶撒克逊人花了 8000 英镑。上次我检查它的重量在 200 到 300 磅之间。如果您的公司可以等待,在不久的将来会有一个标准的 XSLT 3.0 流式传输功能,并且可能由多个供应商实施。
  • 我已经关注 XSLT 3.0 几年了,但与许多 XML 计划一样,它似乎在 2007/2008 年左右消失了。有人还在为它做工作吗?
  • @dextermeyers:我认为 XSLT 3.0 尚未在 2007 年启动。是的,W3C XSLT WG 正在积极开展 XSLT 3.0 工作。当前的草案(仍命名为 2.1)位于:w3.org/TR/xslt-21。未来几个月(甚至本月)可能会发布更新的草稿。
  • XSLT 3.0 中的流式处理工作正在进行中。有一段时间没有公开的工作草案了,但这并不意味着工作已经停止。但是,如果有更多的实施者参与,进展会更快。
【解决方案2】:

首先,我强烈建议使用 Xalan 和 Xerces 的 Apache 版本,而不是捆绑在 JDK 中的版本,因为它们有很多错误。对于 Xerces 来说尤其如此。

其次,如果您使用的是 Java,那么您真的应该迁移到 XSLT 2.0,它可以极大地提高开发效率。在实践中,这意味着 Saxon(Saxon 的家庭版是免费的)。

Xalan 中的增量转换实际上并没有阻止它将整个源文档构建为内存中的树。它所做的只是允许树与转换过程并行构建。如果您想要进行流式转换,Saxon-EE 是您唯一实用的选择。 (请注意,saxon:stream() 扩展只是 Saxon 提供的流媒体功能的一小部分)。

【讨论】:

  • >在实践中这意味着撒克逊 - 我的印象是 Xalan 支持 XSLT 2.0,不是吗?
  • @dextermeyers:我不知道有任何 Xalan XSLT 2.0 实现。 IBM 将商业 XSLT 2.0 实现作为 WebSphere 的一部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-07
  • 1970-01-01
  • 1970-01-01
  • 2020-05-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多