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="#Footnote\*" name="Footref\*">\*</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里的双引号要转成",避免语法错误。
补充说明
你的现有<a>模板逻辑是对的,只需要配合上面的方法去掉前后的括号文本就行啦。如果还有其他类似的脚注格式,只需要调整正则或者匹配条件就能适配~
内容的提问来源于stack exchange,提问作者Vikas
相关产品推荐
相关产品推荐

