2009-01-23 28 views
1

我有一些現有的Java代碼以編程方式執行XSLT轉換 - 最初使用Xalan。我重構了它可以使用另一個(外部配置的)TransformerFactory。如何使用Xalan更改一些現有Java XSLT代碼以使用Saxon和TinyTree

我曾嘗試使用Saxon(v6.5.3和v8.7)工廠,但沒有看到任何性能改進 - 如果有任何撒克遜比Xalan更慢並且使用更多的內存。

我知道我可以使用Saxon TinyTree獲得一些性能優勢,但無法弄清楚如何使用此代碼實現。

我的代碼是這種形式;

TransformerFactory tf = (TransformerFactory) transformerFactoryClass.newInstance(); 
Transformer t = tf.newTransformer(pTransformFile); 
t.transform(new StreamSource(pSourceFile), new StreamResult(pTargetFile)); 

其中 'transformerFactoryClass' 是所配置的TransformerFactory類
的一個實例 - org.apache.xalan.processor.TransformerFactoryImpl爲的Xalan
- net.sf.saxon.TransformerFactoryImpl爲撒克遜8.7,並
- com.icl.saxon.TransformerFactoryImpl for Saxon 6.5.3

有什麼建議嗎?

+0

林面臨着同樣的問題是你能找到的方式來強制使用tinyTree的 – soody 2012-12-21 16:41:05

回答

1

Saxon 7 docs推斷可以tf.setAttribute(net.sf.saxon.FeatureKeys.TREE_MODEL,Builder.TINY_TREE);

但他們也說,這是默認。

1

實際上,當你給Saxon一個StreamSource時,它應該在默認情況下在內部使用TinyTree。關於速度:正如撒克遜作者所說的那樣,Xalan根據樣式表做了兩種可能性之一:快速或正確。撒克遜人總是正確地做事,在某些情況下,這意味着速度會變慢。部分問題在於,XSLT 1.0規範定義了某些事情的行爲難以正確優化(但如果將行爲更改爲不合規則更容易)。

但是,我總是發現撒克遜速度更快,速度更快,樣式表更加複雜。 Xalan通常更簡單。

最後,撒克遜已經優化了大量的時間,因此請務必使用一個較新版本(9.1撒克遜)