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

在Saxon环境的XSLT中转义正则负向后瞻断言的方法

解决XSLT 2.0中Saxon正则转义问题

关键转义规则

XSLT样式表属于XML文档,字符串处理需同时满足XML语法和XSLT正则表达式的双重要求:

  • 正则中的**反斜杠\**必须在XML属性值中写成\\——因为XML会将单个\视为转义前缀(比如\t代表制表符),要表示正则里的字面反斜杠,必须用双反斜杠转义。
  • 正则断言里的<(比如(?<![\.-])中的左尖括号)是正则语法的一部分,不需要转义,错误转义会直接破坏正则逻辑。

正确的正则变量定义

方案1:属性值内转义写法

直接在select属性中定义转义后的正则:

<!-- 匹配需移除的左括号:左括号后不是.或- -->
<xsl:variable name="left-paren-pattern" select="'\\((?!\\.|-)'" />
<!-- 匹配需移除的右括号:右括号前不是.或- -->
<xsl:variable name="right-paren-pattern" select="'(?<!\\.|-)\\)'" />

其中:

  • \\( 对应正则里的\((匹配字面左括号)
  • \\. 对应正则里的\.(匹配字面句点)
  • \\) 对应正则里的\)(匹配字面右括号)

方案2:CDATA包裹写法(更直观)

将正则放在<xsl:variable>的内容中,用CDATA段包裹,无需处理反斜杠转义,避免双重转义的繁琐:

<xsl:variable name="left-paren-pattern">
  <![CDATA[\((?![\.-])]]>
</xsl:variable>
<xsl:variable name="right-paren-pattern">
  <![CDATA[(?<![\.-])\)]]>
</xsl:variable>

完整替换示例

结合上述变量,使用replace函数完成字符串替换:

<xsl:template match="text()">
  <xsl:variable name="left-paren-pattern">
    <![CDATA[\((?![\.-])]]>
  </xsl:variable>
  <xsl:variable name="right-paren-pattern">
    <![CDATA[(?<![\.-])\)]]>
  </xsl:variable>
  <!-- 先替换左括号,再替换右括号 -->
  <xsl:value-of select="replace(replace(., $left-paren-pattern, ''), $right-paren-pattern, '')" />
</xsl:template>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 16:25:06