如何使用Xalan更改现有的Java XSLT代码以使用Saxon和TinyTree

时间:2009-01-23 14:21:04

标签: java xslt saxon xalan

我有一些现有的Java代码以编程方式执行XSLT转换 - 最初使用Xalan。我已经重构它以便能够使用另一个(外部配置的)TransformerFactory。

我尝试过使用Saxon(v6.5.3和v8.7)工厂,但是没有看到任何改进的性能 - 如果Saxon比较慢并且使用的内存比Xalan更多。

我知道我可以使用Saxon TinyTree获得一些性能优势,但无法弄清楚如何使用此代码。

我的代码是格式;

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

其中'transformerFactoryClass'是配置的TransformerFactory类的实例 - Xalan的org.apache.xalan.processor.TransformerFactoryImpl - Saxon 8.7的net.sf.saxon.TransformerFactoryImpl和
- 撒克逊人6.5.3的com.icl.saxon.TransformerFactoryImpl

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

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

然而,他们也说这是默认的。

答案 1 :(得分:1)

实际上,当你给Saxon一个StreamSource时,它应默认在内部使用TinyTree。

关于速度:正如撒克逊作者所讽刺的那样,Xalan根据样式表做出两种可能性之一:快速或正确。撒克逊总是正确地做事,在某些情况下意味着它更慢。问题的一部分是XSLT 1.0规范定义某些事物的行为方式非常难以正确优化(但如果将行为更改为不合规则更容易)。

然而,对于它的价值,我总是发现Saxon与更复杂的样式表一样快或更快。对于较简单的Xalan,Xalan通常更快。

最后,Saxon已经过一段时间的优化,因此请确保使用更新的版本(Saxon 9.1)