我有一个xml文件,其中一个节点如下:
<test-case time="0.077" name="TestingNunit.NUnitTestClass.NunitTestMethod1" asserts="1" success="False" result="Failure" executed="True">
<failure>
<message>
<![CDATA[ Expected: not 3.0d But was: 3.0d ]]>
</message>
<stack-trace>
<![CDATA[at TestingNunit.NUnitTestClass.NunitTestMethod1() in z:\UnitTestingSample\UIAutomation\TestingNunit\UnitTest1.cs:line 12 ]]>
</stack-trace>
</failure>
</test-case>
<test-case time="0.003" name="TestingNunit.NUnitTestClass.NunitTestMethod2" asserts="2" success="False" result="Failure" executed="True">
<failure>
<message>
<![CDATA[ Expected: 2.0d But was: 3.0d ]]>
</message>
<stack-trace>
<![CDATA[at TestingNunit.NUnitTestClass.NunitTestMethod2() in z:\UnitTestingSample\UIAutomation\TestingNunit\UnitTest1.cs:line 21 ]]>
</stack-trace>
</failure>
现在我想读取所有CDATA的数据。我正在尝试使用XSL生成需要这些数据的html文件。我可以为普通节点及其属性生成数据,但对于以这种方式编写的节点,我无法找到读取它的方法。这是我的xsl文件foreach循环。
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<html>
<body>
<table border="1">
<tr bgcolor="#9acd32">
<th>Test Method</th>
<th>Execution Time</th>
<th>Asserts Performed</th>
<th>Success</th>
<th>Result</th>
<th>Executed</th>
<th>Failure Message</th>
<th>Stack Trace</th>
</tr>
<xsl:for-each select="test-results/test-suite/results/test-suite/results/test-suite/results/test-case">
<tr>
<td><xsl:value-of select="@name"/></td>
<td><xsl:value-of select="@time"/></td>
<td><xsl:value-of select="@asserts"/></td>
<td><xsl:value-of select="@success"/></td>
<td><xsl:value-of select="@result"/></td>
<td><xsl:value-of select="@executed"/></td>
<td><xsl:value-of select="//failure/message/text()" disable-output-escaping="no"/></td>
<td><xsl:value-of select="//failure/stack-trace/text()" disable-output-escaping="no"/></td>
</tr>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>发布于 2014-01-03 16:16:28
要读取CDATA(然后转换它们),请在XPath中使用text()函数。
//test-case/failure/message/text()
//test-case/failure/stack-trace/text()尝试select="./failure/message/text()"而不是select="//failure/message/text()" (注意开头的./ )。
执行此操作时,XPath与for-each循环当前选择的节点相关。当使用//时,它将选择文档中的所有节点,忽略当前选择的节点。想象一下,就像Linux上的ls命令一样:ls /*将选择顶级元素,而不管您当前的工作目录是什么,而ls ./*将选择您当前工作目录的子元素。
https://stackoverflow.com/questions/20879799
复制相似问题