使用XSLT进行日志记录

blu*_*ish 9 xslt logging

在XSLT转换期间,如何以及在何处输出日志消息以用于调试和性能目的

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

<xsl:text>message text</xsl:text>
Run Code Online (Sandbox Code Playgroud)

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

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

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

Nic*_*son 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>
Run Code Online (Sandbox Code Playgroud)

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

<!-- Entering my-element template -->
<p class='my-element'>...</p>
<!-- Leaving my-element template -->
Run Code Online (Sandbox Code Playgroud)

显然,您可以将所需的任何日志记录放入该输出中.我会考虑创建类似下面的内容并使用它来运行您的日志记录.这引用了一个名为"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>
Run Code Online (Sandbox Code Playgroud)

在样式表中使用此作为:

<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>
Run Code Online (Sandbox Code Playgroud)

这样做的一个好处是,您可以将其更改<xsl:comment><xsl:message>在更完整的环境中.它更冗长但更通用.