使用XSLT记录日志

使用XSLT记录日志,xslt,logging,Xslt,Logging,在XSLT转换过程中,如何以及在何处输出日志消息以用于调试和性能目的 我想最简单的方法是使用如下表达式: <xsl:text>message text</xsl:text> 消息文本 在代码中,如果需要,可以使用xsl:value of 但是这个方法将消息打印在输出文件的很多地方(在我的例子中是HTML页面),也就是调用它的地方,而不总是在同一个地方(比如日志文件) 这是唯一的方法还是有更好的解决方案?谢谢 一个简单的技巧是使用xsl:variable创建一个变量,然

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

我想最简单的方法是使用如下表达式:

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