Java XSLT转换中newTransformer和newTemplates的区别

Java XSLT转换中newTransformer和newTemplates的区别,java,xml,xslt,saxon,Java,Xml,Xslt,Saxon,在Java中,从用于创建对象到处理XSLT的方法,它有以下方法: newTransformer创建Transformer对象,该对象可以将XML转换为结果 newTemplates可创建模板对象,该对象可创建转换器 该文件明确规定: 变压器可多次使用 我的应用程序使用相同的XSLT处理各种不同的XML。在程序开始时,我使用newTransformer创建一个Transformer,然后对所有XML重新使用它(确保它是同步的,所以我只从一个线程使用它;并在每次处理之前调用它的reset()方法

在Java中,从用于创建对象到处理XSLT的方法,它有以下方法:

  • newTransformer
    创建
    Transformer
    对象,该对象可以将XML转换为结果
  • newTemplates
    可创建
    模板
    对象,该对象可创建
    转换器
该文件明确规定:

变压器可多次使用

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

这样,我就不必为每一个XMLI进程重新编译XSLT


那么
newTemplates
Templates
对象的意义是什么呢?我是否应该改为使用它,并为每个XML创建一个新的
Transformer
对象?

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

主要区别在于
模板
是线程安全的,而
转换器
不是。此外,文档还表明,在创建
模板
实例的过程中,可以应用性能优化。因此,最初创建
模板
实例的成本可能更高,但其实际使用可以提高性能。如果您已经不得不手动管理同步和重置,我想说,
模板
正在引起您的注意……

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


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

xsltprocessor
是此类问题的一个更具体的标签。重新标记。您如何将其与
newTransformer
的功能进行比较,当然这也是它的功能?是的,但它不会保存已编译的样式表如果您重用
Transformer
对象,那么它只编译样式表一次,因此从这个意义上说
newTransformer
编译并保存已编译的样式表,正如
newTemplates
所做的(或者我误解了什么?)是正确的,但如果我没有XSL作为模板,如何改进TransformerFactory.newTransformer()的调用呢?