我通常在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?
答案 0 :(得分:2)
您是否尝试过Saxon的saxon:stream()
扩展程序?
答案 1 :(得分:2)
首先,我强烈建议使用Apache版本的Xalan和Xerces而不是JDK中捆绑的版本,这些版本非常错误。对于Xerces来说尤其如此。
其次,如果你正在使用Java,那么你真的应该转向XSLT 2.0,它可以大大提高开发效率。在实践中,这意味着撒克逊(萨克森的家庭版是免费的)。
Xalan中的增量转换实际上并没有阻止它将整个源文档构建为内存中的树;它所做的就是允许树与转换过程并行构建。如果您想要流式转换,Saxon-EE是您唯一的实用选择。 (请注意,saxon:stream()扩展只是Saxon提供的流功能的一小部分。)