2009-01-23 24 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撒克逊)