You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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.docx
  • Filename.(2).docx
  • Filename...docx
  • My.Document.With.Multiple.Dots.docx

额外说明

如果遇到文件名以圆点结尾的情况(比如Filename.),这个模板会返回空字符串——你可以根据自己的需求添加额外的判断逻辑来处理这种边缘情况。

内容的提问来源于stack exchange,提问作者Ilyas Khallouq

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:54:39