Разница между newTransformer и newTemplates в преобразованиях Java XSLT - PullRequest
8 голосов
/ 11 марта 2011

В Java от TransformerFactory для создания объектов для обработки XSLT, и он имеет методы:

  • newTransformer, который создает Transformer объект, которыйможет преобразовать XML в результат.
  • newTemplates, который создает Templates объект, который может создать Transformer.

Документация для Transformer явно заявляет:

Трансформатор может использоваться несколько раз.

Мое приложение обрабатывает различные XML-файлы с одним и тем же XSLT.В начале программы я использую newTransformer для создания Transformer, а затем повторно использую его для всех XML-файлов (убедитесь, что он синхронизирован, поэтому я использую его только из одного потока; и вызываю его метод reset() перед каждой обработкой.).

Таким образом, я не несу затрат на перекомпиляцию XSLT для каждого XML-процесса, который я обрабатываю.

Так в чем смысл newTemplates и Templatesобъект?Должен ли я использовать это вместо этого и создавать новый Transformer объект для каждого XML?

Ответы [ 3 ]

6 голосов
/ 12 марта 2011

Основное отличие состоит в том, что Templates является потокобезопасным, а Transformer - нет. Кроме того, документация подразумевает, что при создании экземпляра Templates могут применяться оптимизации производительности. Итак, первоначальное создание экземпляра Templates может быть более дорогостоящим, но его фактическое использование может повысить производительность. Если вам уже приходится вручную управлять синхронизацией и сбросом, я бы сказал, что Templates просит вашего внимания ...

6 голосов
/ 07 апреля 2011

Если вы работаете в одном потоке, вы, вероятно, не заметите большой разницы.

Производительность всегда зависит от реализации, а не от спецификации API.В Saxon при повторном использовании Transformer он сохраняет кэш документов, загруженных с помощью функции doc ().Это может быть хорошо или плохо в зависимости от того, будет ли следующее преобразование получать доступ к тем же исходным документам.Как правило, мой совет - использовать новый Transformer для каждого преобразования, но, конечно, использовать один и тот же объект Templates.

4 голосов
/ 12 марта 2011

newTemplates () компилирует таблицу стилей во внутреннее представление, которое можно использовать повторно.Это эквивалентно компиляции интерпретируемого языка (например, Python) для байт-кода и сохранению байт-кода, в отличие от его повторной интерпретации при каждом запуске.

...