面对使用xslt解析xml的问题

时间:2013-02-05 08:48:57

标签: html xml xslt xslt-1.0

我正在尝试解析xml以生成html报告.xml的有问题的部分是给定的

<failure message="Management changes link count is not 3$HiHello" type="junit.framework.AssertionFailedError">junit.framework.AssertionFailedError: Management changes link count is not 3$HiHelloJI
at CustomProjects.CommonTemplates.verifyManagementChanges(Unknown Source)
at CustomProjects.EmersonTest.testEmerson_VerifyManagementChanges(Unknown Source)
</failure>

为解析它而编写的xslt是:

<xsl:choose>
        <xsl:when test="failure">
            <td>Failure</td>
            <td><xsl:apply-templates select="failure"/></td>
            <td><a href="ftp://10.32.1.66/seleniumScreenshotsFireFoxTest/{@name}.png" target="_blank">screenshot</a></td>
            <td><xsl:apply-templates select="failurelink"/></td>
        </xsl:when>
</xsl:choose>

<xsl:template match="failure">
  <xsl:call-template name="display-failures"/>
</xsl:template>

<xsl:template match="failurelink">
  <xsl:call-template name="display-failures-link"/>
</xsl:template>

<xsl:template name="display-failures">
  <xsl:param name="FailText" select="@message"/>
    <xsl:choose>
     <xsl:when test="not(@message)">N/A</xsl:when>
    <xsl:otherwise>
       <xsl:value-of select="substring-before($FailText,'$')"/>
    </xsl:otherwise>
</xsl:choose>
<!-- display the stacktrace -->
<code>
    <br/><br/>
    <xsl:call-template name="br-replace">
        <xsl:with-param name="word" select="."/>
    </xsl:call-template>
</code>
<!-- the later is better but might be problematic for non-21" monitors... -->
<!--pre><xsl:value-of select="."/></pre-->
</xsl:template>

<xsl:template name="display-failures-link">
<xsl:param name="linktext" select="@message"/>
 <xsl:choose>
    <xsl:when test="not(@message)">N/A</xsl:when>
    <xsl:otherwise>
       <xsl:value-of select="substring-after($linktext,'$')"/>
    </xsl:otherwise>
</xsl:choose>
<!-- display the stacktrace -->
<code>
    <br/><br/>
    <xsl:call-template name="br-replace">
        <xsl:with-param name="word" select="."/>
    </xsl:call-template>
</code>
<!-- the later is better but might be problematic for non-21" monitors... -->
<!--pre><xsl:value-of select="."/></pre-->
</xsl:template>

这里我从display-failures模板获得了所需的结果($ sign之前的字符串)但是在调用display-failures-link时我什么都没得到。(应该在$符号后得到字符串)。我不知道问题是sunstring函数还是其他问题。请告诉我这里我做错了什么。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:3)

这里的问题是你试图在XPath failurelink上应用模板,但你没有一个名为<failurelink>的元素,所以这个apply-templates找不到任何东西。

<xsl:apply-templates select="failurelink"/>

在同一类元素上应用两个不同模板的一种方法是使用模式:

<xsl:template match="failure">
  <xsl:call-template name="display-failures"/>
</xsl:template>

<xsl:template match="failure" mode="link">
  <xsl:call-template name="display-failures-link"/>
</xsl:template>

然后,您应用模板的区域将更改为:

<td>Failure</td>
<td><xsl:apply-templates select="failure"/></td>
<td><a href="ftp://10.32.1.66/seleniumScreenshotsFireFoxTest/{@name}.png" target="_blank">screenshot</a></td>
<td><xsl:apply-templates select="failure" mode="link"/></td>

但在你的情况下,还有更好的方法。只需删除第二个模板,然后执行以下操作:

将整个<xsl:choose>替换为:

<xsl:apply-templates select="failure" />

将您列出的第一个模板替换为:

<xsl:template match="failure">
   <td>Failure</td>
   <td><xsl:call-template name="display-failures"/></td>
   <td><a href="ftp://10.32.1.66/seleniumScreenshotsFireFoxTest/{../@name}.png" target="_blank">screenshot</a></td>
   <td><xsl:call-template name="display-failures-link"/></td>
</xsl:template>

并删除您列出的第二个模板。