我有一个场景,我想要<的最后一行的值。功能>在目标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>
答案 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>
,这似乎是你想要的形式。