返回第一个元素的id

时间:2015-08-31 13:52:24

标签: xml xslt

这是我的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>

1 个答案:

答案 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-eachand 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>