我在扩展的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表达式来实现。如果是这样。我需要什么样的表达方式?如果不。什么是最好的选择?
答案 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)]的 [最后()] 强> /../../../ ..