在其他地方获得的属性值我跑CruiseControl.NET,我试图构建一个XSL样式表,提取有关从XML生成日志打破单元测试的某些信息。对于每一个损坏的单元测试,我想在XSL获得单元测试的名字,类名,其中所述单元测试驻留,并且失败消息。目前,我可以获得单元测试名称和失败消息,但我无法获取类名。我想这是因为单元测试的类名称仅包含在XML生成日志的不同区域,并且我在XSL一个小白。这里是我的XSL样式表的削减的样本:XSL到XML文档
<!-- Unit tests -->
<xsl:template match="/">
<table border="1" width="100%">
<tr>
<th align="left">Class</th>
<th align="left">Method</th>
<th align="left">Message</th>
</tr>
<xsl:apply-templates select="/cruisecontrol/build/*[local-name()='TestRun']/*[local-name()='Results']/*[local-name()='UnitTestResult']"/>
</table>
</xsl:template>
<!-- Failed uint test -->
<xsl:template match="*[local-name()='UnitTestResult'][@outcome='Failed']">
<tr>
<td>
<xsl:apply-templates select="/cruisecontrol/build/*[local-name()='TestRun']/*[local-name()='TestDefinitions']/*[local-name()='UnitTest'][@[email protected]]"/>
</td>
<td>
<xsl:value-of select="@testName"/>
</td>
<td>
<xsl:value-of select="*[local-name()='Output']/*[local-name()='ErrorInfo']/*[local-name()='Message']"/>
</td>
</tr>
</xsl:template>
<!-- Failed unit test class name -->
<xsl:template match="/cruisecontrol/build/*[local-name()='TestRun']/*[local-name()='TestDefinitions']/*[local-name()='UnitTest']">
<xsl:value-of select="@className"/>
</xsl:template>
这里被削减的样本XML生成日志:
<cruisecontrol>
<build>
<TestRun>
<TestDefinitions>
<UnitTest name="MyUnitTest" storage="Test.dll" id="b17e5b2a-47d0-5f78-1750-07c8ac14518c">
<TestMethod className="UnitTests.cs" name="MyUnitTest" />
</UnitTest>
...
</TestDefinitions>
<Results>
<UnitTestResult testId="b17e5b2a-47d0-5f78-1750-07c8ac14518c" testName="MyUnitTest" outcome="Failed">
<Output>
<ErrorInfo>
<Message>Assert.AreEqual failed</Message>
</ErrorInfo>
</Output>
</UnitTestResult>
...
</Results>
</TestRun>
</build>
</cruisecontrol>
这里是电流输出:
单位测试课程名称:
单元测试方法名称:MyUnitTest
失败消息:Assert.AreEqual失败
这里是所期望的输出:
单元测试类名:UnitTests.cs
单元测试方法名称:MyUnitTest
失败消息:Assert.AreEqual失败
我的问题是类名永远是空的。我正在尝试使用UnitTestResult节点的testId属性在文档中的其他地方引用正确的UnitTest节点。我需要什么XSL或Xpath魔术来实现我的目标?
为什么使用这些'local-name()'而不是直接节点名?假设没有XML命名空间(至少在你发布的XML中没有),'/ cruisecontrol/build/TestRun/Results/UnitTestResult'将等同于'/ cruisecontrol/build/* [local-name()= 'TestRun']/* [本地名称()= '结果']/* [本地名称()= 'UnitTestResult']'。 – Lucero 2010-11-09 16:31:37
我不太确定;我在这方面是一个相当大的小事,并且正在接受别人以前的工作。感谢您的帮助和评论;将考虑改变这一点。我非常乐意提供进一步的建议,帮助他们清理并采用更好的做法。 – Sipp 2010-11-09 16:33:57