我有一些现有的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
有什么建议吗?
答案 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)