有人可以解释为什么以下不起作用。
这是xml:
<?xml version="1.0" ?>
<testsuites>
<testsuite errors="0" failures="0" name="test_ui_orchestration" tests="10" time="90.190"/>
<testsuite errors="1" failures="0" name="test_ui_tables" tests="13" time="1115.771"/>
<testsuite errors="0" failures="3" name="test_ui_dashboard" tests="18" time="116.397"/>
</testsuites>
我想计算测试总数,总通过和失败。我在获取失败总数(失败 + 错误)和通过总数(为简单起见:测试 - 失败)时遇到问题。我使用“with-param”调用相同的 xml 模板来计算传入不同值的总计,如下所示(“计算总和”注释中的部分):
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/testsuites">
<html>
<body>
<!-- Calculate sums start -->
<xsl:variable name="allSum">
<xsl:call-template name="testsSum">
<xsl:with-param name="numTests" select="testsuite/@tests"/>
</xsl:call-template>
</xsl:variable>
<xsl:variable name="failedSum">
<xsl:call-template name="testsSum">
<xsl:with-param name="numTests" select="testsuite/@failures"/>
</xsl:call-template>
</xsl:variable>
<xsl:variable name="errorSum">
<xsl:call-template name="testsSum">
<xsl:with-param name="numTests" select="testsuite/@errors"/>
</xsl:call-template>
</xsl:variable>
<xsl:variable name="failederrorSum">
<xsl:call-template name="testsSum">
<xsl:with-param name="numTests" select="testsuite/@failures + testsuite/@errors"/>
</xsl:call-template>
</xsl:variable>
<!-- Calculate sums ends -->
<h2>Test Results</h2>
<table border="1">
<tr bgcolor="#9acd32">
<th>Test Area</th>
<th>Total</th>
<th>Pass</th>
<th>Fail</th>
<th>Error</th>
<th>Fail and Error</th>
</tr>
<xsl:for-each select="testsuite">
<tr>
<td><xsl:value-of select="@name"/></td>
<td><xsl:value-of select="@tests"/></td>
<td><xsl:value-of select="@tests - (@failures + @errors)"/></td>
<td><xsl:value-of select="@failures"/></td>
<td><xsl:value-of select="@errors"/></td>
<td><xsl:value-of select="@failures + @errors"/></td>
<td> </td>
</tr>
</xsl:for-each>
<tr>
<td><b>All Tests</b></td>
<td><xsl:value-of select="$allSum"/></td>
<td>foo</td>
<!--
<td><xsl:value-of select="$passedSum"/></td>
-->
<td><xsl:value-of select="$failedSum"/></td>
<td><xsl:value-of select="$errorSum"/></td>
<td><xsl:value-of select="$failederrorSum"/></td>
<td></td>
</tr>
</table>
</body>
</html>
</xsl:template>
<xsl:template name="testsSum">
<xsl:param name="numTests"/>
<xsl:choose>
<xsl:when test="$numTests">
<xsl:variable name="recursive_result">
<xsl:call-template name="testsSum">
<xsl:with-param name="numTests" select="$numTests[position() > 1]"/>
</xsl:call-template>
</xsl:variable>
<xsl:value-of select="number($numTests[1]) + $recursive_result"/>
</xsl:when>
<xsl:otherwise><xsl:value-of select="0"/></xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
这将产生以下总和输出(完整输出在本文末尾):
41 3 1 0
虽然它应该是:
41 3 1 4
每个单独的总和都可以正常工作,找到相应的属性。但是,当我尝试添加两个属性并将其传递给 sum 模板时,它无法按预期工作。
它变得更糟。生成总通过测试的代码是:
<xsl:variable name="passedSum">
<xsl:call-template name="testsSum">
<xsl:with-param name="numTests"
select="testsuite/@tests - testsuite/@failures"/>
</xsl:call-template>
</xsl:variable>
启用上述代码后,我收到以下错误:
Failed to evaluate the expression of variable 'numTests'
我一直在网上搜索,了解到“with-param”的“选择”接受“定义参数值的 XPath 表达式”(来自 w3schools)。XPath 表达式可以包含算术运算 ( http://www.w3schools.com/xpath/xpath_operators.asp ),那么为什么上面会失败呢?
这是 xsl 转换的完整输出:
测试区域总通过失败错误失败和错误 -------------------------------------------------- -------------------- test_ui_orchestration 10 10 0 0 0 test_ui_tables 13 12 0 1 1 test_ui_dashboard 18 15 3 0 3 -------------------------------------------------- -------------------- 所有测试 41 foo 3 1 0
这是 xsl 转换的预期输出(用 * 标记的修改值):
测试区域总通过失败错误失败和错误 -------------------------------------------------- -------------------- test_ui_orchestration 10 10 0 0 0 test_ui_tables 13 12 0 1 1 test_ui_dashboard 18 15 3 0 3 -------------------------------------------------- -------------------- 所有测试 41 37* 3 1 4*