12

我编写了一个 xslt 代码,它将 xml 文件转换为包含很多表的 html 文件,其中一个列包含消息(非常长的消息),但该行以“验证通过”或“验证失败”这两个词中的任何一个开头"

我的要求是,如果验证失败,则将整个表格行变为红色,如果验证通过,则将整个表格行变为绿色

 <xsl:choose>
  <xsl:when test="contains(@message,'Verification failed:')"><td bgcolor="#FF0000">   <xsl:value-of select="@Message"/></td></xsl:when>
  <xsl:when test="contains(@message,'Verification passed:')"><td bgcolor="#00FF00"><xsl:value-of select="@Message"/></td></xsl:when>   
  <xsl:otherwise><td> <xsl:value-of select="@Message"/></td></xsl:otherwise>
</xsl:choose> 
4

4 回答 4

22

不幸的是,你没有说出你期望你的“trim()”函数做什么。但是根据您对要求的描述,我猜 normalize-space() 已经足够接近了:

starts-with(normalize-space(message), 'Verification passed'))

XPath normalize-space() 函数与 Java trim() 方法的不同之处在于 (a) 它用单个空格替换内部空白字符序列,以及 (b) 它对空白的定义略有不同。

于 2012-09-17T14:31:54.937 回答
4

xslt中有trim之类的操作吗?

一、XSLT 1.0

不,在 XSLT 1.0 中执行“修剪”相当困难。

这是FXSLtrim的函数/模板:

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:import href="trim.xsl"/>

  <!-- to be applied on trim.xml -->

  <xsl:output method="text"/>
  <xsl:template match="/">
    '<xsl:call-template name="trim">
        <xsl:with-param name="pStr" select="string(/*)"/>
    </xsl:call-template>'
  </xsl:template>
</xsl:stylesheet>

在此 XML 文档上执行此转换时(您必须至少下载一些其他样式表模块,它们构成完整的导入树):

<someText>

   This is    some text   

</someText>

产生了想要的正确结果

'This is    some text'

II 在 XSLT 2.0 / XPath 2.0

仍然有点棘手,但很短:

     if (string(.))
       then replace(., '^\s*(.+?)\s*$', '$1')
       else ()

这是完整的相应转换

<xsl:stylesheet version="2.0"   xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output omit-xml-declaration="yes" indent="yes"/>

 <xsl:template match="/*">
     "<xsl:sequence select=
         "if (string(.))
           then replace(., '^\s*(.+?)\s*$', '$1')
           else ()
           "/>"
 </xsl:template>
</xsl:stylesheet>

当应用于同一个 XML 文档(上图)时,会产生相同的正确结果:

"This is    some text"
于 2012-09-17T12:04:25.113 回答
0

将 XSLT1 与 registerLangFunctions 一起使用

今天,在(复杂的)XSLT2 标准发布大约 10 年后,许多项目仍然使用(更快的)XSLT1。也许问题不仅在于“简单复杂”,而且 XSLT1 是 Perl、PHP、Python、PostgreSQL 和许多其他社区的事实。

因此,一个针对 Perl、PHP 和 Python 的解决方案:使用您的主要语言来执行trim另一个 XSLT1 中不存在的常用函数。

这里是 PHP 的一个例子: https ://en.wikibooks.org/wiki/PHP_Programming/XSL/registerPHPFunctions

于 2014-05-24T20:35:20.797 回答
-16
 <xsl:variable name="Colour">
 <xsl:choose>
 <xsl:when test="contains(@Message,'Verification failed:')">background-color:red;       </xsl:when>
 <xsl:when test="contains(@Message,'Verification passed:')">background-color:green</xsl:when>
 <xsl:otherwise> </xsl:otherwise>
 </xsl:choose>
 </xsl:variable>

 <tr style="{$Colour}">
 <td> <xsl:value-of select="@Time"/></td>
 <td>Line <xsl:value-of select="@Line"/></td>
 <td> <xsl:value-of select="@Type"/></td>
 <td> <xsl:value-of select="@Message"/></td>
 </tr>
于 2012-09-19T11:15:26.193 回答