1

我有一些以编程方式执行 XSLT 转换的现有 Java 代码 - 最初使用 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 和 Saxon 6.5.3 的 com.icl.saxon.TransformerFactoryImpl

有什么建议么?

4

2 回答 2

1

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

至于速度:正如撒克逊作者打趣的那样,Xalan 会根据样式表进行两种可能性之一:快速或正确。撒克逊人总是正确地做事,这在某些情况下意味着它更慢。部分问题在于,XSLT 1.0 规范定义了某些事情,使其行为方式很难正确优化(但如果将行为更改为不兼容则更容易)。

然而,不管怎样,我总是发现 Saxon 与更复杂的样式表一样快或更快。Xalan 对于更简单的来说通常更快。

最后,随着时间的推移,Saxon 已经进行了很多优化,因此请确保您使用更新的版本(Saxon 9.1)

于 2009-05-12T06:17:11.600 回答
1

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

但是他们也说这是默认设置。

于 2009-01-27T11:49:50.407 回答