2011-01-31 22 views
9

¿Cómo y dónde podría mensajes de registro de salida para fines de depuración y rendimiento durante una transformación XSLT?Registrando con XSLT

supongo que el método más simple es el uso de expresiones como esta:

<xsl:text>message text</xsl:text> 

aquí y allá en el código, usando xsl:value-of si es necesario.

Pero este método imprime los mensajes en muchos lugares en el archivo de salida (página HTML en mi caso), que es donde se llama y no siempre en el mismo lugar (como un archivo de registro).

¿Es esta la única manera o hay una mejor solución? Gracias!

Respuesta

7

Esto es exactamente lo que está diseñado para <xsl:message>. Sin embargo, la ubicación de salida depende completamente del procesador. Solo tengo una Mac a mano pero, por desgracia, Firefox y Safari suprimen la salida <xsl:message>. Espero que MSIE haga lo mismo.

Dado que, creo que su mejor opción es utilizar <xsl:comment> para generar sus registros. Algo así como el siguiente debe hacer el truco:

<xsl:template match='my-element'> 
    <xsl:comment>Entering my-element template</xsl:comment> 
    <p class='my-element'><xsl:apply-templates/></p> 
    <xsl:comment>Leaving my-element template</xsl:comment> 
</xsl:template> 

que le daría algo como esto en la salida:

<!-- Entering my-element template --> 
<p class='my-element'>...</p> 
<!-- Leaving my-element template --> 

Claramente, se puede poner lo que el registro que desee en que esa salida. Consideraría crear algo como lo siguiente y usarlo para ejecutar su registro. Esto hace referencia a un parámetro global llamado 'habilitar-registrar' para determinar si el registro debe ocurrir o no.

<xsl:template name='create-log'> 
    <xsl:param name='message'/> 
    <xsl:if test="$enable-logging = 'yes'"> 
     <xsl:comment><xsl:value-of select='$message'/></xsl:comment/> 
    </xsl:if> 
</xsl:template> 

utilizar esto en su hoja de estilos como:

<xsl:template match='my-element'> 
    <xsl:call-template name='create-log'> 
    <xsl:with-param name='message'/>Entering my-element template</xsl:with-param> 
    </xsl:call-template> 
    <p class='my-element'><xsl:apply-templates/></p> 
    <xsl:call-template name='create-log'> 
    <xsl:with-param name='message'/>Leaving my-element template</xsl:with-param> 
    </xsl:call-template> 
</xsl:template> 

Uno de los beneficios de hacerlo de esta manera es que se puede cambiar <xsl:comment>-<xsl:message> cuando se encuentra en un entorno más completa. Es más detallado, pero más general.

-1

Un truco simple sería crear una variable con xsl:variable y solo concat() nuevos valores o establecer xsl:template que hace lo mismo. Entonces solo necesita generar esta variable al final de la ejecución y puede elegir explícitamente dónde mostrar el registro.

+1

Desafortunadamente, las variables son inmutables; no puede concatenar los valores al final de uno después de haberlo creado. – Flynn1179

+0

¡Gracias, es un buen punto! Como las variables no se pueden modificar, creo que necesito un conjunto de variables que concatenaré al final de la transformación. – bluish

0

La modificación de su XSLT para fines de registro inevitablemente tendrá un impacto en el rendimiento, probablemente sea mejor utilizar una herramienta externa. Hay unos pocos disponibles dependiendo de lo que está trabajando con:

+0

gracias! Estoy trabajando con XSLT 1.0, salida HTML y procesador IE XSLT. – bluish

0

Debería poder usar < xsl: mensaje > Creo que, aunque el proceso de registro depende de la implementación.

2

Sugeriría usar xsl:message si se encuentra en un entorno de desarrollo como oXygen o Stylus Studio, y si usa xsl:comment en el navegador. Realmente no debería estar depurando su código XSLT en el navegador; los navegadores que conozco son pésimos como herramientas de depuración XSLT.

+0

+1 para una respuesta correcta y exhaustiva. –

1

Al buscar una solución a este problema, terminé implementando un mecanismo de registro en XSLT de manera similar a log4j, usando principalmente xsl: message y XSLT puro 2.x. Tomé algunas de las respuestas en esta página como entradas. La biblioteca está disponible aquí: https://github.com/ukuko/log4xslt