更好的使用或替代启动 - 在xpath中

时间:2009-11-25 09:24:15

标签: xml xslt xpath

我在扩展的xml JUnit报告文件上遇到xsl转换问题。我已将文件扩展如下:

<testcase classname="net.luminis.osgitest.test.adhoc.AdHocTest" name="testGetExportedPackagesByPackage" osgi-vendor-name="felix/1.8.0" time="3.212">
<osgi-specs>
  <osgi-spec version="4.1">
    <sections>
      <section>3.5.5</section>
    </sections>
  </osgi-spec>
  <osgi-spec version="4.2">
    <sections>
      <section>3.5.6</section>
    </sections>
  </osgi-spec>
</osgi-specs>

测试用例中的osgi-specs节点(和子节点)对应于节概述文件:

<versions>
  <version name="4.1" id="41">
    <sections>
      <section id="12" number="2" name="Security Layer">
        <sections>
          <section id="13" number="2.1" name="Introduction" parent="12">
            <sections>
              <section id="14" number="2.1.1" name="Essentials" parent="13" />
            </sections>
          </section>
        </sections>
      </section>
      <!-- some more sections with subsections -->
    </sections>
  </version>
  <version name="4.2" id="42">
    <!-- some more sections with subsections -->
  </version>
</version>

使用这两个xml文件,我生成一个HTML表来显示一个部分概述(每个版本)和一个标记,以显示测试结果是否成功(每个osgi-vendor)使用xsl转换。请参阅http://opensource.luminis.net/svn/OSGITESTRESULTS/trunk/index.html

上的当前版本

现在。我有以下问题。有时我会将3.5.5.1作为节号进行测试。但是部分概述文件只有3.5.5。所以我想在3.5.5节下显示测试。我用xpath尝试了这个:

//testcase[@osgi-vendor-name=$osgi.vendor.name]//osgi-spec[@version=$osgi.version.name]//section[starts-with(text(), $osgi.section.number)]/../../../..

通过这个,我选择了与特定版本和供应商的特定部分对应的所有测试用例。问题是,当把这个表达式放在for-each中时,3.5.5.1节的测试用例也在第3节中显示,3.5结束等等,但我只想让它以最准确的部分出现。 (3.5.5)我不熟悉xsl / xpath,我不知道是否可以用for-each中的单个xpath表达式来实现。如果是这样。我需要什么样的表达方式?如果不。什么是最好的选择?

2 个答案:

答案 0 :(得分:1)

为什么你还要使用starts-with(),那么简单的值比较呢?

//testcase[@osgi-vendor-name=$osgi.vendor.name]//osgi-spec[@version=$osgi.version.name]//section[. = $osgi.section.number]/../../../..

答案 1 :(得分:1)

假设最准确的部分也是最后一部分,您可以通过使用[last()]

从节点列表中获取最后一个节点来选择最后一个(和最佳)匹配

// testcase [@ osgi-vendor-name = $ osgi.vendor.name] // osgi-spec [@ version = $ osgi.version.name] // section [starts-with(text(),$ osgi.section.number)]的 [最后()] /../../../ ..