我想选择并显示特定的行。我先向您展示我的xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="TestLogTest.xsl" type="text/xsl"?>
<TestLog>
<TestLogItem id="0">
<Message>Zero</Message>
<TypeDescription>Normal</TypeDescription>
</TestLogItem>
<TestLogItem id="1">
<Message>One</Message>
<TypeDescription>Normal</TypeDescription>
</TestLogItem>
<TestLogItem id="2">
<Message>Two</Message>
<TypeDescription>Error</TypeDescription>
</TestLogItem>
<TestLogItem id="3">
<Message>Three</Message>
<TypeDescription>Normal</TypeDescription>
</TestLogItem>
<TestLogItem id="4">
<Message>******** TestCase PA-343 is finished *********</Message>
<TypeDescription>Normal</TypeDescription>
</TestLogItem>
<TestLogItem id="5">
<Message>Five</Message>
<TypeDescription>Normal</TypeDescription>
</TestLogItem>
<TestLogItem id="6">
<Message>Six</Message>
<TypeDescription>Normal</TypeDescription>
</TestLogItem>
<TestLogItem id="7">
<Message>******** TestCase PA-450 is finished *********</Message>
<TypeDescription>Normal</TypeDescription>
</TestLogItem>
</TestLog>
步骤是TestCases的一部分,这意味着一个TestCase包含几个步骤,但步骤和TestCase是兄弟姐妹。所以首先我使用这个xsl文件在xml文件中下了一个订单:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:key name="k" match="TestLogItem[string(Message)]" use="following-sibling::TestLogItem[contains(Message, 'TestCase')][1]/@id"/>
<xsl:template match="/TestLog">
<table border="2">
<th>Step</th>
<th>Test</th>
<th>Result</th>
<xsl:for-each select="TestLogItem">
<xsl:variable name="bingo" select="substring(Message, 19, 7)"/>
<xsl:variable name="position" select="@id"/>
<xsl:for-each select="key('k',@id)">
<tr>
<xsl:choose>
<xsl:when test="contains(TypeDescription, 'Error')">
<td bgcolor="#FF0000"><xsl:value-of select="@id"/></td>
<td bgcolor="#FF0000"><xsl:value-of select="$bingo"/></td>
<td bgcolor="#FF0000"> Error </td>
</xsl:when>
<xsl:otherwise>
<td><xsl:value-of select="@id"/></td>
<td><xsl:value-of select="$bingo"/></td>
<td> OK </td>
</xsl:otherwise>
</xsl:choose>
</tr>
</xsl:for-each>
</xsl:for-each>
</table>
</xsl:template>
</xsl:stylesheet>
这给了我这个xml:
<?xml version="1.0" encoding="UTF-8"?>
<table border="2">
<th>Step</th>
<th>Test</th>
<th>Result</th>
<tr>
<td>0</td>
<td>PA-343</td>
<td>OK</td>
</tr>
<tr>
<td>1</td>
<td>PA-343</td>
<td>OK</td>
</tr>
<tr>
<td bgcolor="#FF0000">2</td>
<td bgcolor="#FF0000">PA-343</td>
<td bgcolor="#FF0000">Error</td>
</tr>
<tr>
<td>3</td>
<td>PA-343</td>
<td>OK</td>
</tr>
<tr>
<td>4</td>
<td>PA-450</td>
<td>OK</td>
</tr>
<tr>
<td>5</td>
<td>PA-450</td>
<td>OK</td>
</tr>
<tr>
<td>6</td>
<td>PA-450</td>
<td>OK</td>
</tr>
</table>
现在我想只选择每个TestCase的最后一步(这里是步骤3和6)并显示是否有错误:
<table>
<tr>
<td>PA-343</td>
<td>Error</td>
</tr>
<tr>
<td>PA-450</td>
<td>OK</td>
</tr>
</table>
但问题是我使用的是xsl:for-each和密钥,而且我不知道我是否还需要在xsl:for-each节点中工作,或者我是否需要考虑没有钥匙的解决方案。
感谢您的回答