使用XSLT进行日志记录

时间:2011-01-31 09:35:25

标签: xslt logging

在XSLT转换期间,我如何以及在哪里输出日志消息以进行调试和性能

我想最简单的方法是使用这样的表达式:

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

代码中的这里和那里,如果需要,使用xsl:value-of

但是这个方法在输出文件的很多地方打印消息(在我的情况下是HTML页面),也就是调用它的地方,而不是总是在同一个地方(比如日志文件)。

这是唯一的方法还是有更好的解决方案?谢谢!

7 个答案:

答案 0 :(得分:10)

这正是<xsl:message>的设计目标。但是,输出位置完全取决于处理器。我只有Mac方便,但遗憾的是,Firefox和Safari都会抑制<xsl:message>输出。我希望MSIE能做同样的事情。

鉴于此,我认为您最好的选择是使用<xsl:comment>来生成日志。像下面这样的东西可以做到这一点:

<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>

这会在输出中给你这样的东西:

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

显然,您可以将所需的任何日志记录放入该输出中。我会考虑创建类似下面的内容并使用它来运行您的日志记录。这引用了一个名为“enable-logging”的全局参数来确定是否应该进行日志记录。

<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>

在样式表中将其用作:

<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>

以这种方式执行此操作的一个好处是,您可以在更完整的环境中将<xsl:comment>更改为<xsl:message>。它更冗长但更通用。

答案 1 :(得分:2)

如果您在oXygen或Stylus Studio等开发环境中,我建议使用xsl:message,如果您在浏览器中运行,则建议使用xsl:comment。你不应该真的在浏览器中调试你的XSLT代码 - 我所知道的浏览器是糟糕的XSLT调试工具。

答案 2 :(得分:1)

通过寻找这个问题的解决方案,我最终以类似于log4j的方式在XSLT中实现了一个日志记录机制,主要使用xsl:message和纯XSLT 2.x.我把这个页面中的一些答案作为输入。该库可在此处获取:https://github.com/ukuko/log4xslt

答案 3 :(得分:0)

为了记录而修改XSLT本身不可避免地会对性能产生影响,使用外部工具可能会更好。根据您的工作情况,有一些可用:

答案 4 :(得分:0)

您应该可以使用&lt; xsl:message&gt;我认为,虽然日志记录的位置依赖于实现。

答案 5 :(得分:0)

如果您使用 Xalan,您可以下载“Some Xalan Extensions”jar(Maven 上的 net.adamjenkins.sxe)。

它适用于 slf4j 并允许

<log:debug message="some message ${somexpath}"/>

<log:info select="./blahblahblah"/>

每个日志级别的等。

答案 6 :(得分:-1)

一个简单的黑客方法是使用xsl:variable创建一个变量,并为其设置concat()个新值,或设置一个xsl:template来执行相同的操作。然后你只需要在执行结束时输出这个变量,你就可以明确地选择显示日志的位置。