2009-11-06 46 views
2

我們使用XSLT生成我們的數據報告。數據當前以XML文檔形式存儲在Oracle中(不使用XMLTYPE,而使用正常的CLOB)。我們選擇正確的XML文檔,並創建一個單一的文件:非常大的文件上的XSLT轉換

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

在某些情況下,完整的XML文檔中包含100000頁的文件。這意味着一個巨大的XML文檔首先被加載到內存中,導致各種內存問題。

我們如何防止這種情況發生?我們在.NET 2.0中使用XslCompiledTransform類。

我知道有兩種解析XML文檔的形式:DOM和SAX。但據我所知,SAX方式不可能與XSLT結合使用。 DOM解析方法迫使我們將整個東西加載到內存中。

我們有什麼選擇?首先將整個文檔寫入磁盤有幫助嗎? Oracle是否在大型XSLT轉換方面做得更好?

+2

XMLDOCUMENT內容有多複雜? XSLT轉換有多複雜?也許值得將XSLT改爲更輕的重量? – 2009-11-06 21:01:49

+0

問題是我們打算將其用作通用報表引擎。不知道XSLT的複雜程度如何。它可以是簡單的CSV導出,也可以是平均值等的計算。 – 2009-11-08 12:23:53

+1

SAX可用作一些XSLT處理器的輸入,例如。撒克遜[http://saxon.sourceforge.net/]。但是,在一般情況下,XSLT處理器將構建整個數據的內部表示,這些數據將隨着輸入數據的大小在內存中線性增長。有可能使用特定於給定處理器的優化以流模式運行轉換。另一種解決方案可能是限制所選元素的數量並在數次處理數據。您可能還需要通過多個步驟切換轉換。 – 2009-11-13 17:17:06

回答

0

據我所知,CLOB可以流式傳輸。當然,將其流式傳輸到本地文件系統是其中一種選擇。但是,隨着大多數XSLT引擎在DOM上執行操作,您將遇到同樣的問題。我建議將文件拆分成更小的塊(在你的案例中是XMLDCOUMENTs)。這可以在沒有XSLT的情況下完成,但只需要一些簡單的正則表達式。然後在每個單獨的塊上運行XSLT轉換。當然,這將比在內存中執行所有操作要慢,但是如果文檔太大,將會避免內存問題。

1

有一個名爲VTD-XML第三XML處理模型,它克服大多數DOM的內存問題,並原生支持XPath,你應該看看...... XSLT支持的是在路上...

4

根據在什麼樣的,你想要做的變換,STX可能是XSLT的替代:

流轉換爲XML (STX)是一通改造 語言XML文檔。 STX是 ,用作替代XSLT的高速,低內存消耗 ,使用 的W3C XQuery 1.0和XPath 2.0數據 模型。由於STX不需要構建內存樹 ,因此 適合用於約束場景中的資源 。

1

這可能有所幫助。 XMLMax XML編輯器可以將xsl樣式表應用於與xpath表達式匹配的每個片段,並將所有匹配輸出寫入單個文件,並封裝在用戶指定的根目錄中。它沒有文件大小限制。谷歌xmlmax編輯器。