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

XSLT模板匹配括号问题:移除<fn>标签两侧括号的实现

解决XSLT移除脚注括号的问题

嘿,作为XSLT新手碰到这种小困扰太正常了!我来帮你搞定移除<fn>标签首尾括号的事儿~

问题根源

你之前尝试在模板匹配里加(报错,是因为括号是文本节点,不是元素节点,XSLT的模板匹配默认针对元素,没法直接匹配文本里的括号字符。原来的输出里的括号来自<p>元素中的文本节点:(在<a>标签之前,)在<a>标签之后,所以得从处理<p>元素或者文本节点入手。

解决方案1:修改<p>元素的模板(推荐)

针对包含目标脚注链接的<p>元素,我们可以提取括号前的文本,跳过括号,直接应用脚注链接的模板:

<xsl:template match="p[a[matches(@href,'#Footnote*') and matches(@name,'Footref*')]]">
  <p>
    <!-- 提取括号前的文本并去除多余空格 -->
    <xsl:value-of select="normalize-space(substring-before(., '('))"/>
    <!-- 应用你现有的脚注链接模板 -->
    <xsl:apply-templates select="a[matches(@href,'#Footnote*') and matches(@name,'Footref*')]"/>
    <!-- 这里跳过了括号后的')'文本节点 -->
  </p>
</xsl:template>

把这个模板加到你的XSLT里,再配合你现有的<a>模板,输出就会变成:
<p>1 January 2020<fn> <fnn>*</fnn> <fnt>Language of the case: English.</fnt> </fn></p>,完美去掉了括号!

解决方案2:用xsl:analyze-string正则匹配处理

如果不想修改<p>的通用模板,也可以用正则匹配整个带括号的脚注部分,替换成只保留脚注内容:

<xsl:template match="p">
  <p>
    <xsl:analyze-string select="." regex="\((<a href=&quot;#Footnote\*&quot; name=&quot;Footref\*&quot;>\*</a>)\)">
      <xsl:matching-substring>
        <!-- 匹配到括号+链接的组合,只处理链接部分 -->
        <xsl:apply-templates select="regex-group(1)"/>
      </xsl:matching-substring>
      <xsl:non-matching-substring>
        <!-- 输出其他非匹配的文本内容 -->
        <xsl:value-of select="."/>
      </xsl:non-matching-substring>
    </xsl:analyze-string>
  </p>
</xsl:template>

注意这里正则里的*要转义成\*,XML里的双引号要转成&quot;,避免语法错误。

补充说明

你的现有<a>模板逻辑是对的,只需要配合上面的方法去掉前后的括号文本就行啦。如果还有其他类似的脚注格式,只需要调整正则或者匹配条件就能适配~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 19:03:16