对非常大的文件进行XSLT转换

时间:2009-11-06 20:30:40

标签: .net xml oracle xslt

我们正在使用XSLT生成数据报告。数据当前作为XML文档存储在Oracle中(不使用XMLTYPE,而是使用普通CLOB)。我们选择正确的XML文档并创建一个文档:

<DATABASE>
   <XMLDOCUMENT> ... </XMLDOCUMENT>
   <XMLDOCUMENT> ... </XMLDOCUMENT>
   ...
</DATABASE>

在某些情况下,完整的XML文档包含+100000个文档。这意味着一个巨大的XML文档首先被加载到内存中,导致各种内存问题。

我们如何防止这种情况发生?我们在.NET 2.0中使用XslCompiledTransform类。

我知道解析XML文档有两种形式:DOM和SAX。但据我了解,SAX方式不可能与XSLT结合使用。 DOM解析方法强制我们将整个内容加载到内存中。

我们有什么选择?首先将完整的文档写入磁盘有帮助吗? Oracle是否在大型XSLT转换方面做得更好?

4 个答案:

答案 0 :(得分:4)

根据您想要进行的转换类型,STX可能是XSLT的替代方法:

  

XML的流式转换   (STX)是一次转换   XML文档的语言。 STX是   打算作为高速,低内存   消费替代XSLT,使用   W3C XQuery 1.0和XPath 2.0数据   模型。由于STX不需要   它构建了一个内存中的树   适用于资源   约束情景。

答案 1 :(得分:1)

有一个名为VTD-XML的第三个XML处理模型可以克服DOM的大部分内存问题,本机支持你应该看的XPath ...... XSLT对它的支持正在进行中......

答案 2 :(得分:1)

这可能会有所帮助。 XMLMax xml编辑器可以将xsl样式表应用于与xpath表达式匹配的每个片段,并将所有匹配的输出写入单个文件,封装在用户指定的根目录中。它没有文件大小限制。 google xmlmax编辑器。

答案 3 :(得分:0)

据我所知,CLOB可以流式传输。当然,将流式传输到本地文件系统是其中一个选项。但是,随着大多数XSLT引擎在DOM上执行操作,您将遇到同样的问题。我建议将文件拆分为较小的块(在您的情况下为XMLDCOUMENT)。这可以在没有XSLT的情况下完成,但只需要一些简单的正则表达式。然后在每个块上运行XSLT转换。当然,这比在内存中完成所有操作要慢,但如果文档太大,这将使您免于内存问题。