2012-06-04 52 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左右夭折了。某人是否仍在爲此工作? –