9

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

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

文档Transformer明确指出:

一个 Transformer 可以多次使用。

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

这样我就不会为我处理的每个 XML 重新编译 XSLT 的成本。

那么对象newTemplatesTemplates对象有什么意义呢?我应该改用它,并Transformer为每个 XML 创建一个新对象吗?

4

3 回答 3

7

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

于 2011-03-11T21:14:39.733 回答
6

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

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

于 2011-04-06T22:28:04.233 回答
4

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

于 2011-03-11T21:12:29.000 回答