JAXP XSLT document()函数问题

时间:2011-06-15 11:35:50

标签: java xml xslt xalan jaxp

我在使用XSLT转换的java应用程序下工作。我有很多document()调用,所以有可能有java.lang.OutOfMemory异常(我实际上有),因为在每次调用document()函数之后文档都被缓存了。

http://xml.apache.org/xalan-j/faq.html#faq-N102F9我读到有可能 增加堆内存大小,这不是我的解决方案。我也尝试使用似乎不支持的增量变换。

那么,使用document()函数时是否有可能在jaxp中关闭文档缓存?

3 个答案:

答案 0 :(得分:2)

与user1066037的答案一样,希望您可以切换到Saxon。 Saxon有一个名为saxon:discard-document的扩展名。它可以在PE或EE版本或Saxon-B中使用。在这里搜索“Saxon-B”:http://saxon.sourceforge.net/

来自撒克逊文件:

  

撒克逊:丢弃文档()

     

saxon:discard-document($ doc as document-node())==>文档节点()

     

此功能从Saxon的内部文档池中删除文档。   该文件暂时保留在内存中,但将会存在   所有引用时由Java垃圾收集器从内存中释放   到文档树中的节点已超出范围。这有   释放内存的好处,但缺点是,如果相同   文档在同一转换期间再次加载,它将是   从源文本中重新分析,并且将使用不同的节点标识符   分配。该函数返回提供的文档节点   一个参数,允许它在诸如的调用中使用   选择= “撒克逊:丢弃文档(文档( 'A.XML'))”。

如果您需要一个如何使用saxon:discard-document的示例,请告诉我,我可以发布一个。

答案 1 :(得分:1)

您提供的链接包含使用自定义处理指令禁用缓存的示例。您是否尝试过那里建议的解决方法?

答案 2 :(得分:1)

如果您有选择。

只需将Xalan与Saxon交换,一切都会快得多,你可以大幅减少内存消耗。

据我所知,Xalan 将文档加载到内存中,除非在最新版本中更改了某些内容。

撒克逊人有流媒体模式:http://www.saxonica.com/documentation/sourcedocs/streaming/streaming-templates.xml

希望有所帮助。