增量/流式XSLT转换?

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

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

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

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

更新:这个最近更新的问题密切相关: 什么是最高效的基于Java的流式XSLT处理器?

首先,我强烈建议使用Apache版本的Xalan和Xerces而不是JDK中捆绑的版本,这些版本非常缺陷。 对于Xerces来说尤其如此。

其次,如果你正在使用Java,那么你真的应该转向XSLT 2.0,它可以大大提高开发效率。 在实践中,这意味着撒克逊人(Saxon的家庭版是免费的)。

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

你在Saxon中尝试过saxon:stream()扩展吗?