Java XSLT转换中newTransformer和newTemplates之间的区别

时间:2011-03-11 20:46:07

标签: java xml xslt saxon

在Java中,从TransformerFactory创建对象来处理XSLT,它有以下方法:

  • newTransformer创建Transformer对象,可以将XML转换为结果。
  • newTemplates创建Templates对象,可以创建Transformer

Transformer的文档明确指出:

  

Transformer可以多次使用。

我的应用程序使用相同的XSLT处理各种不同的XML。在程序开始时,我使用newTransformer创建一个Transformer,然后为所有XML重用它(确保它已同步,所以我只在一个线程中使用它;并调用它的{{1}每次处理之前的方法。)。

这样我就不会为每个XML I进程重新编译XSLT。

那么reset()newTemplates对象有什么意义呢?我应该使用它,并为每个XML创建一个新的Templates对象吗?

3 个答案:

答案 0 :(得分:6)

主要区别在于Templates是线程安全的,Transformer不是。{1}}。此外,文档意味着可以在创建Templates实例期间应用性能优化。因此,Templates实例的初始创建可能成本更高,但实际使用可以提供性能提升。如果您已经必须手动管理同步和重置,我会说Templates正在请求您的注意......

答案 1 :(得分:6)

如果您在一个线程中运行,那么您可能不会注意到太多差异。

性能总是取决于实现而不是API规范。使用Saxon,当您重用Transformer时,它会保留使用doc()函数加载的文档的缓存。这可能是好的或坏的,这取决于下一个转换是否将访问相同的源文档。一般来说,我的建议是为每个转换使用一个新的Transformer,但当然使用相同的Templates对象。

答案 2 :(得分:4)

newTemplates()将样式表编译为可以重用的内部表示。它相当于将解释语言(如Python)编译为字节码并保存字节码,而不是每次运行时重新解释它。