xml在转换为xslt时获取最后一行值

时间:2017-11-14 11:04:13

标签: xml xslt

我有一个场景,我想要<的最后一行的值。功能>在目标html文件中标记(passstatus,failstatus,errorstatus)等。我尝试使用last()方法得到它,但它不适用于我,请帮我解决问题。谢谢你的帮助。

这是我的xml文件

<TestSuite>
    <TestCase>
        <name>checkLoginPage</name>
        <function>
            <method>test</method>
            <status>ERROR</status>
            <reason>Traceback (most recent call last):</reason>
            <passstatus>0</passstatus>
            <failstatus>0</failstatus>
            <errorstatus>1</errorstatus>
            <method>test1</method>
            <status>FAIL</status>
            <reason>Traceback (most recent call last):</reason>
            <passstatus>0</passstatus>
            <failstatus>1</failstatus>
            <errorstatus>1</errorstatus>
        </function>
    </TestCase>
</TestSuite>

这是我的xslt文件

<table border="1" id="result_table">
    <tr bgcolor="#777">
        <th align="left">TestFile/TestCase</th>
        <th align="left">Pass</th>
        <th align="left">Fail</th>
        <th align="left">Error</th>
    </tr>
    <xsl:for-each select="/*/function">
        <xsl:if test="status='FAIL'">
            <tr bgcolor="#6c6">
                <td>
                    <xsl:value-of select="name"/>.
                    <xsl:value-of select="method"/>
                </td>
                <td>
                    <xsl:value-of select="/*[last()]/passstatus"/>
                </td>
                <td>
                    <xsl:value-of select="failstatus"/>
                </td>
                <td>
                    <xsl:value-of select="errorstatus"/>
                </td>
            </tr>
        </xsl:if>

这是我期望从转换中获得的目标文件,

<html xmlns:foo="http://www.foo.org/" xmlns:bar="http://www.bar.org">
   <head>
      <style>
  td {
    border: 1px solid #777;
    padding: 2px;

}


</style>
   </head>
   <body>
      <table border="1" id="result_table">
         <tr bgcolor="#777">
            <th align="left">TestFile/TestCase</th>
            <th align="left">Pass</th>
            <th align="left">Fail</th>
            <th align="left">Error</th>
         </tr>
         <tr bgcolor="#6c6">
            <td>checkLoginPage.test2</td>
            <td>2</td>
            <td>1</td>
            <td>0</td>
         </tr>

      </table>
   </body>
</html>

1 个答案:

答案 0 :(得分:3)

由于您已在评论中接受我的建议以更改XML格式,因此我们考虑使用此格式的重组XML输入:

<TestSuite>
  <TestCase>
    <name>checkLoginPage</name>
    <function>
      <method>test</method>
      <status>ERROR</status>
      <reason>Traceback (most recent call last):</reason>
      <passstatus>0</passstatus>
      <failstatus>0</failstatus>
      <errorstatus>1</errorstatus>
    </function>
    <function>
      <method>test1</method>
      <status>FAIL</status>
      <reason>Traceback (most recent call last):</reason>
      <passstatus>0</passstatus>
      <failstatus>1</failstatus>
      <errorstatus>1</errorstatus>
    </function>
  </TestCase>
</TestSuite>

(我实际上考虑的是与“函数”不同的元素名称,但上面是评论中讨论的内容。)

然后,问题变成了如何仅选择每个<function>中的最后一个(按文档顺序)<TestCase>元素进行转换,但现在这很简单:您可以使用涉及{{的谓词1}}功能,就像你最初尝试做的那样。例如,

last()

当应用于产生

的重组输入(如本答案中所示)
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:output method="xml" indent="yes" omit-xml-declaration="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:template match="/">
    <table border="1" id="result_table">
      <tr bgcolor="#777">
        <th align="left">TestFile/TestCase</th>
        <th align="left">Pass</th>
        <th align="left">Fail</th>
        <th align="left">Error</th>
      </tr>
      <!-- here's the key XPath expression: -->
      <xsl:for-each select="/TestSuite/TestCase/function[last()]">
        <xsl:if test="status='FAIL'">
      <tr bgcolor="#6c6">
        <td><xsl:value-of select="ancestor::TestCase/name"/>.<xsl:value-of select="method"/></td>
        <td><xsl:value-of select="passstatus"/></td>
        <td><xsl:value-of select="failstatus"/></td>
        <td><xsl:value-of select="errorstatus"/></td>
      </tr>
        </xsl:if>
      </xsl:for-each>
    </table>
  </xsl:template>

</xsl:stylesheet>

,这似乎是你想要的形式。