XSLT:仅选择最后一行

时间:2015-07-15 12:49:29

标签: xml xslt

我想选择并显示特定的行。我先向您展示我的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节点中工作,或者我是否需要考虑没有钥匙的解决方案。

感谢您的回答

0 个答案:

没有答案