代码之家  ›  专栏  ›  技术社区  ›  Vihung

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

  •  1
  • Vihung  · 技术社区  · 17 年前

    我有一些现有的Java代码,以编程方式进行XSLT转换——最初使用XLAN。我已经对它进行了重构,以便能够使用另一个(外部配置的)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
    -net.sf.saxon.transformerFactoryImpl for saxon 8.7,以及
    -适用于Saxon 6.5.3的com.icl.saxon.transformerFactoryImpl

    有什么建议吗?

    2 回复  |  直到 17 年前
        1
  •  1
  •   Stephen Denne    17 年前

    Saxon 7 docs 我想你可以 tf.setAttribute(net.sf.saxon.FeatureKeys.TREE_MODEL,Builder.TINY_TREE);

    不过,他们也表示,这是违约。

        2
  •  1
  •   StaxMan    16 年前

    实际上,当您给saxon一个streamsource时,默认情况下它应该在内部使用tinytree。

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

    然而,不管怎样,我总是发现saxon在处理更复杂的样式表时速度一样快。对于更简单的,xalan通常更快。

    最后,随着时间的推移,saxon已经被优化了很多,所以请确保使用更新的版本(saxon 9.1)

    推荐文章