在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
相关产品推荐
相关产品推荐

