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 objetoTransformer
, que puede transformar XML en un resultado. -
newTemplates
que crea objetos deTemplates
que pueden crear unTransformer
.
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.