使用XSLT记录日志
在XSLT转换过程中,如何以及在何处输出日志消息以用于调试和性能目的 我想最简单的方法是使用如下表达式:使用XSLT记录日志,xslt,logging,Xslt,Logging,在XSLT转换过程中,如何以及在何处输出日志消息以用于调试和性能目的 我想最简单的方法是使用如下表达式: <xsl:text>message text</xsl:text> 消息文本 在代码中,如果需要,可以使用xsl:value of 但是这个方法将消息打印在输出文件的很多地方(在我的例子中是HTML页面),也就是调用它的地方,而不总是在同一个地方(比如日志文件) 这是唯一的方法还是有更好的解决方案?谢谢 一个简单的技巧是使用xsl:variable创建一个变量,然
<xsl:text>message text</xsl:text>
消息文本
在代码中,如果需要,可以使用xsl:value of
但是这个方法将消息打印在输出文件的很多地方(在我的例子中是HTML页面),也就是调用它的地方,而不总是在同一个地方(比如日志文件)
这是唯一的方法还是有更好的解决方案?谢谢 一个简单的技巧是使用
xsl:variable
创建一个变量,然后只给它添加concat()
新值,或者设置一个xsl:template
,它也会做同样的事情。然后,您只需要在执行结束时输出这个变量,就可以显式地选择显示日志的位置。为了记录日志而修改XSLT本身不可避免地会影响性能,您最好使用外部工具。根据您的工作内容,有几种可用的:
- 这正是
设计的目的。但是,输出位置完全取决于处理器。我手头只有一台Mac电脑,但不幸的是,Firefox和Safari都抑制了
输出。我希望MSIE也会这样做
有鉴于此,我认为最好的办法是使用
生成日志。下面类似的内容应该可以做到这一点:
<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 -->
显然,您可以将任何您想要的日志记录放入该输出中。我会考虑创建一些类似的东西,并使用它来运行日志记录。这引用一个名为“启用日志记录”的全局参数来确定是否应该进行日志记录
<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>
输入我的元素模板
离开我的元素模板
这样做的一个好处是,在更完整的环境中,您可以将
更改为
。它更详细,但更一般。我认为您应该能够使用,尽管日志记录的位置取决于实现。如果您在开发环境(如oXygen或Stylus Studio)中,我建议使用xsl:message
,如果您在浏览器中运行,则使用xsl:comment
。您不应该真的在浏览器中调试XSLT代码——我所知道的浏览器作为XSLT调试工具非常糟糕 通过寻找这个问题的解决方案,我最终以类似于log4j的方式在XSLT中实现了一个日志机制,主要使用xsl:message和纯XSLT2.x。我将本页中的一些答案作为输入。该库在此处可用:如果您使用Xalan,可以下载“一些Xalan扩展”jar(maven上的net.adamjenkins.sxe)
它与slf4j配合使用,并允许
<log:debug message="some message ${somexpath}"/>
或
每个日志级别的etc。不幸的是,变量是不可变的;创建后不能将值连接到一个值的末尾。谢谢,这是一个很好的观点!由于变量无法修改,我想我需要一组变量,我将在转换结束时连接这些变量。谢谢!我正在使用XSLT1.0、HTML输出和IE XSLT处理器。
<log:info select="./blahblahblah"/>