2012-06-04 35 views
3

我通常在JDK(JDK 7)中使用XSLT支持进行XSLT转换。最近我遇到了一个相当大的XML文档,并且将XSLT转换应用于此(甚至非常基本的转换)会导致使用大量内存。增量/流式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

尝试此链接 - http://www.devx.com/xml/Article/34677/1954 - 请参阅标题为“迭代2:分而治之JAXP XSLT转换”一节 – kjp

回答

2

首先,我强烈建议使用Xalan和Xerces的Apache版本,而不是JDK中捆绑的版本,这些版本非常麻烦。对于Xerces尤其如此。其次,如果您使用的是Java,那么您确实应该转向XSLT 2.0,这样可以大大提高开发效率。在实践中,这意味着撒克逊(撒克逊的家庭版是免费的)。

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

+0

>在实践中,这意味着撒克逊 - 我的印象是Xalan支持XSLT 2.0,是不是这种情况? –

+1

@dextermeyers:我不知道任何Xalan XSLT 2.0实现。作为WebSphere的一部分,IBM有一个商业XSLT 2.0实现。 –

+0

你当然是对的。我的错。 –

2

你有撒克逊尝试saxon:stream()扩展?

+0

感谢您的回复!看来这个功能只能在Saxon-EE中使用,这是类似于8000磅的东西。不幸的是,我无法让我们的经理接受这样的数额。 –

+0

@dextermeyers:我很惊讶萨克森花费8000磅。上次我检查它是在200到300磅的范围内。如果您的公司可以等待,在不久的将来会有一个标准的XSLT 3.0流式传输功能,并可能由多个供应商实施。 –

+0

我几年来一直在关注XSLT 3.0,但是像许多XML计划一样,它似乎已经在2007/2008左右夭折了。某人是否仍在为此工作? –