首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用XSL.Unable从节点读取数据

使用XSL.Unable从节点读取数据
EN

Stack Overflow用户
提问于 2014-01-02 17:25:20
回答 1查看 286关注 0票数 1

我有一个xml文件,其中一个节点如下:

代码语言:javascript
复制
<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循环。

代码语言:javascript
复制
   <?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>
EN

回答 1

Stack Overflow用户

发布于 2014-01-03 16:16:28

要读取CDATA(然后转换它们),请在XPath中使用text()函数。

代码语言:javascript
复制
//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 ./*将选择您当前工作目录的子元素。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20879799

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档