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テンプレートから目的の結果($記号の前の文字列)を取得していますが、display-failures-linkを呼び出すと何も取得されません($記号の後に文字列を取得する必要があります)。サンストリング関数または他の何かと一緒に。ここで私が間違っていることを教えてください。

どんな助けでも大歓迎です。

4

1 に答える 1

3

ここでの問題は、 XPathfailurelinkで apply-templates を実行しようとしているのに、 という要素がない<failurelink>ため、apply-templates何も見つからないことです。

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

同じ種類の要素に 2 つの異なるテンプレートを適用する 1 つの方法は、モードを使用することです。

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

しかし、あなたの場合、さらに良いアプローチがあります。2 番目のテンプレートを削除して、次のようにします。

全体<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>

リストした 2 番目のテンプレートを削除します。

于 2013-02-05T09:05:43.853 に答える