在Java中,从TransformerFactory
创建对象来处理XSLT,它有以下方法:
newTransformer
创建Transformer
对象,可以将XML转换为结果。newTemplates
创建Templates
对象,可以创建Transformer
。 Transformer
的文档明确指出:
Transformer可以多次使用。
我的应用程序使用相同的XSLT处理各种不同的XML。在程序开始时,我使用newTransformer
创建一个Transformer
,然后为所有XML重用它(确保它已同步,所以我只在一个线程中使用它;并调用它的{{1}每次处理之前的方法。)。
这样我就不会为每个XML I进程重新编译XSLT。
那么reset()
和newTemplates
对象有什么意义呢?我应该使用它,并为每个XML创建一个新的Templates
对象吗?
答案 0 :(得分:6)
主要区别在于Templates
是线程安全的,Transformer
不是。{1}}。此外,文档意味着可以在创建Templates
实例期间应用性能优化。因此,Templates
实例的初始创建可能成本更高,但实际使用可以提供性能提升。如果您已经必须手动管理同步和重置,我会说Templates
正在请求您的注意......
答案 1 :(得分:6)
如果您在一个线程中运行,那么您可能不会注意到太多差异。
性能总是取决于实现而不是API规范。使用Saxon,当您重用Transformer时,它会保留使用doc()函数加载的文档的缓存。这可能是好的或坏的,这取决于下一个转换是否将访问相同的源文档。一般来说,我的建议是为每个转换使用一个新的Transformer,但当然使用相同的Templates对象。
答案 2 :(得分:4)
newTemplates()将样式表编译为可以重用的内部表示。它相当于将解释语言(如Python)编译为字节码并保存字节码,而不是每次运行时重新解释它。