如何用XSLT 1.0检测含多圆点文件名中的docx扩展名
解决XSLT 1.0中多圆点文件名的docx扩展名检测问题
在XSLT 1.0里处理带多个圆点的文件名确实有点麻烦,因为它没有像XSLT 2.0+那样的tokenize或者直接取最后一个子串的便捷函数。不过我们可以用递归模板来完美解决你提到的Filename...docx或Filename.(2).docx这类场景。
为什么你的原代码不生效?
你原来使用的:
<xsl:value-of select="substring-after(@sourcefilename,'.')"/>
只会提取第一个圆点之后的所有内容。比如:
- 对于
Filename.(2).docx,它返回(2).docx - 对于
Filename...docx,它返回..docx
显然这不是你想要的docx扩展名。
递归模板解决方案
我们可以写一个递归模板,不断提取当前字符串中最后一个圆点之后的内容,直到字符串中没有圆点为止——此时剩下的就是我们要的扩展名。
<!-- 定义递归模板,用于获取文件名的最后一个扩展名 --> <xsl:template name="extract-file-extension"> <xsl:param name="input-filename"/> <xsl:choose> <!-- 如果当前字符串中还有圆点,就递归提取圆点之后的部分 --> <xsl:when test="contains($input-filename, '.')"> <xsl:call-template name="extract-file-extension"> <xsl:with-param name="input-filename" select="substring-after($input-filename, '.')"/> </xsl:call-template> </xsl:when> <!-- 当字符串中没有圆点时,剩下的就是最终的扩展名 --> <xsl:otherwise> <xsl:value-of select="$input-filename"/> </xsl:otherwise> </xsl:choose> </xsl:template>
调用方式
在你的XSLT代码中,只需要调用这个模板并传入文件名参数即可:
<!-- 假设你的文件名存储在@sourcefilename属性中 --> <xsl:variable name="docx-extension"> <xsl:call-template name="extract-file-extension"> <xsl:with-param name="input-filename" select="@sourcefilename"/> </xsl:call-template> </xsl:variable> <!-- 之后就可以使用这个变量,比如判断是否为docx --> <xsl:if test="$docx-extension = 'docx'"> <!-- 这里写你的处理逻辑 --> <p>This is a DOCX file!</p> </xsl:if>
测试场景验证
这个模板对以下场景都能正确返回docx:
Filename.docxFilename.(2).docxFilename...docxMy.Document.With.Multiple.Dots.docx
额外说明
如果遇到文件名以圆点结尾的情况(比如Filename.),这个模板会返回空字符串——你可以根据自己的需求添加额外的判断逻辑来处理这种边缘情况。
内容的提问来源于stack exchange,提问作者Ilyas Khallouq
相关产品推荐
相关产品推荐

