saxonica java xml xslt saxon

saxonica - Diferencia entre newTransformer y newTemplates en transformaciones Java XSLT



xslt download (3)

En Java, desde una TransformerFactory para crear objetos para procesar XSLT, y tiene los siguientes métodos:

  • newTransformer que crea el objeto Transformer , que puede transformar XML en un resultado.
  • newTemplates que crea objetos de Templates que pueden crear un Transformer .

La documentación para Transformer establece explícitamente:

Un transformador puede usarse varias veces.

Mi aplicación procesa varios XML diferentes con el mismo XSLT. Al comienzo del programa utilizo newTransformer para crear un Transformer luego lo reutilizo para todos los XML (asegurándome de que esté sincronizado, así que solo lo uso de un hilo y llamo a su método reset() antes de cada procesamiento).

De esta forma, no incurriré en el costo de volver a compilar el XSLT para cada proceso XML que procese.

Entonces, ¿qué sentido tienen las newTemplates Templates y el objeto Templates ? ¿Debería usar eso en su lugar, y crear un nuevo objeto Transformer para cada XML?


La principal diferencia es que las Templates son seguras para hilos y Transformer no lo es. Además, la documentación implica que las optimizaciones de rendimiento pueden aplicarse durante la creación de una instancia de Templates . Por lo tanto, la creación inicial de una instancia de Templates puede ser más costosa, pero su uso real puede ofrecer mejoras de rendimiento. Si ya tiene que administrar manualmente la sincronización y el reinicio, diría que las Templates le piden atención ...


newTemplates () compila la hoja de estilos en una representación interna que se puede reutilizar. Es el equivalente a compilar un lenguaje interpretado (como Python) para codificar por bytes y guardar el bytecode, en lugar de reinterpretarlo cada vez que lo ejecuta.


Si está ejecutando un solo hilo, probablemente no notará mucha diferencia.

El rendimiento siempre depende de la implementación y no de la especificación API. Con Saxon, cuando reutiliza un transformador, conserva la caché de documentos cargados mediante la función doc (). Eso puede ser bueno o malo dependiendo de si la próxima transformación va a acceder a los mismos documentos fuente. En general, mi consejo es usar un nuevo transformador para cada transformación, pero usando el mismo objeto de plantillas, por supuesto.