这是我的XML文件:
<TestLog>
<TestLogItem id="0">
<Message>Message 1</Message>
</TestLogItem>
<TestLogItem id="1">
<Message>Message 2</Message>
</TestLogItem>
<TestLogItem id="2">
<Message>Message 3</Message>
</TestLogItem>
<TestLogItem id="3">
<Message>End of TestCase1</Message>
</TestLogItem>
<TestLogItem id="4">
<Message>Message p</Message>
</TestLogItem>
<TestLogItem id="5">
<Message>Message m</Message>
</TestLogItem>
<TestLogItem id="6">
<Message>Message s</Message>
</TestLogItem>
<TestLogItem id="7">
<Message>Message u</Message>
</TestLogItem>
<TestLogItem id="8">
<Message>Message a</Message>
</TestLogItem>
<TestLogItem id="9">
<Message>End of TestCase 2</Message>
</TestLogItem>
</TestLog>
我使用一个键,它将TestLogItem上的所有TestLogItem都包含在'End of TestCase'中。现在我想返回在TestCase结束后的@id(例如:在TestCase1结束后返回'4')。 我不知道这样做。 这是我目前的XSLT:
<?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"/><!-- key which locates the end of each TestCase -->
<xsl:template match="/TestLog">
<html>
<xsl:for-each select="TestLogItem[contains(Message, 'TestCase')]"><!-- for-each loop which condition is the equivalent of testing each TestCase -->
<xsl:variable name="number_TC" select="substring(Message, 19, 7)"/>
<tr><!-- for each line -->
<xsl:choose><!-- The test -->
<xsl:when test="key('k',@id)[contains(TypeDescription, 'Error')]">
<td bgcolor="#FF0000">
Test <xsl:value-of select="$number_TC"/><!-- display of the variable which is the number of the TestCase -->
</td>
<td bgcolor="#FF0000"> NOK </td>
<td bgcolor="#FFFF00">
<xsl:for-each select="key('k',@id)[contains(TypeDescription, 'Error')]">
<xsl:value-of select="Message"/>
<xsl:text> // </xsl:text>
</xsl:for-each>
</td>
<td bgcolor="#FF0000"> <xsl:value-of select="Time"/></td>
</xsl:when>
</xsl:choose>
</tr>
</xsl:for-each>
</html>
</xsl:template>
</xsl:stylesheet>
答案 0 :(得分:1)
您似乎并未在此处使用key
...而且您似乎也不需要。{/ p>
这是您的XSLT的简化版本,似乎可以满足您的需求。
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/TestLog">
<html>
<xsl:for-each select="TestLogItem/Message[contains(text(),'End of TestCase') and boolean(../following-sibling::TestLogItem/@id)]">
<xsl:value-of select="." />'s following-sibling has ID: <xsl:value-of select="../following-sibling::TestLogItem/@id" />
</xsl:for-each>
</html>
</xsl:template>
</xsl:stylesheet>
我们的想法是选择TestLogItem
个包含&#39; End of TestCase&#39; 和的following::sibling
TestLogItem带有ID。输出:
<html>End of TestCase1's following-sibling has ID: 4</html>
如果您要删除for-each
(and boolean(../following-sibling::TestLogItem/@id)
)上的第二个条件,您将获得此输出(稍为重新格式化以便于阅读):
<html>End of TestCase1's following-sibling has ID: 4
End of TestCase 2's following-sibling has ID: </html>