在XSLT转换期间,我如何以及在哪里输出日志消息以进行调试和性能?
我想最简单的方法是使用这样的表达式:
<xsl:text>message text</xsl:text>
代码中的这里和那里,如果需要,使用xsl:value-of
。
但是这个方法在输出文件的很多地方打印消息(在我的情况下是HTML页面),也就是调用它的地方,而不是总是在同一个地方(比如日志文件)。
这是唯一的方法还是有更好的解决方案?谢谢!
答案 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
来执行相同的操作。然后你只需要在执行结束时输出这个变量,你就可以明确地选择显示日志的位置。