我们的测试执行人员使用样式表来生成测试报告。我们正在努力定制该报告。 由于对 XSL 和 Xpath 的了解有限,我试图获取文件路径的各个组成部分并将它们呈现在报告中。我们仅限于 XSL 1.0。
返回一个文件路径,例如: C: lahblahblah\部分 ev estname.seq C:啊...是可变长度的。 剩余的路径结构将始终是..\part ev estname.seq
我想要的是:
测试名称: 零件: 版本:
我尝试了 substring-before / substring-after 的各种嵌套,但是,相关部分之前的文件路径部分可以具有不同的大小。
我能做的最好的事情就是删除文件扩展名,因为我在这方面不是很了解。
考虑以下示例:
XML
<input name="C:\blah\blaah\blaaah\part\rev\testname.seq"/>
XSLT 1.0
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="input">
<results>
<xsl:call-template name="parse-path">
<xsl:with-param name="text" select="@name"/>
</xsl:call-template>
</results>
</xsl:template>
<xsl:template name="parse-path">
<xsl:param name="text"/>
<xsl:variable name="n" select="string-length(translate($text, translate($text, '\', ''), ''))"/>
<xsl:if test="$n=2">
<part>
<xsl:value-of select="substring-before($text, '\')"/>
</part>
</xsl:if>
<xsl:if test="$n=1">
<rev>
<xsl:value-of select="substring-before($text, '\')"/>
</rev>
</xsl:if>
<xsl:if test="$n=0">
<testname>
<xsl:value-of select="substring-before($text, '.')"/>
</testname>
</xsl:if>
<xsl:if test="$n">
<!-- recursive call -->
<xsl:call-template name="parse-path">
<xsl:with-param name="text" select="substring-after($text, '\')"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
结果
<?xml version="1.0" encoding="UTF-8"?>
<results>
<part>part</part>
<rev>rev</rev>
<testname>testname</testname>
</results>