2011-03-11 8 views
8

En Java, desde un TransformerFactory para crear objetos para procesar XSLT, y tiene los métodos:Diferencia entre newTransformer y newTemplates en Java transformaciones XSLT

  • newTransformer que crea Transformer objeto, que puede transformar XML en consecuencia .
  • newTemplates que crea el objeto Templates que puede crear un Transformer.

La documentación para Transformer afirma explícitamente:

un transformador puede ser utilizado varias veces.

Mi aplicación procesa varios XML diferentes con el mismo XSLT. Al comienzo del programa utilizo newTransformer para crear un Transformer y luego lo reutilizo para todos los XML (asegurándome de que esté sincronizado, así que solo lo uso desde un hilo y llamando 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.

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

+2

'xsltprocessor' es una etiqueta más específica para tales preguntas. Reetiquetado – Flack

Respuesta

6

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

El rendimiento siempre depende de la implementación en lugar 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.

+0

+1 ¡Gracias por la información! –

4

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.

+0

¿Cómo compararías eso con lo que hace 'newTransformer', seguramente eso es lo que hace también? –

+0

Sí, pero no guarda la hoja de estilos compilada –

+0

Si reutiliza el objeto 'Transformer', solo compila la hoja de estilos una vez, por lo que en ese sentido' newTransfomer' compila y guarda la hoja de estilos compilada, al igual que 'newTemplates' (¿O entendí mal algo?) –

6

La principal diferencia es que Templates es seguro para subprocesos 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 Templates. Por lo tanto, la creación inicial de una instancia 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, yo diría que Templates le ruega su atención ...

+0

Correcto, pero ¿cómo puedo mejorar la invocación de TransformerFactory.newTransformer() en caso de que no tenga XSL para la plantilla? –

Cuestiones relacionadas