如何在XPath中对字符串进行正则转义(regex-quote)?
XPath中安全处理tokenize函数字面量分隔符的方案
1. XPath 3.1+ 原生方案(最优)
XPath 3.1及以上版本提供了fn:regex-quote()函数,作用和Java的Pattern.quote()完全一致——将输入字符串转义为正则表达式中的字面量,自动处理所有特殊字符(如.、*、+、[]等)。
直接使用示例:
<xsl:template name="tokenize-with-literal-separator"> <xsl:param name="text" as="xs:string"/> <xsl:param name="separator" as="xs:string"/> <xsl:sequence select="tokenize($text, regex-quote($separator))"/> </xsl:template>
2. 低版本XPath/XSLT兼容方案
如果只能用XPath 2.0或更低版本,没有原生转义函数,可以自定义一个转义函数来处理正则特殊字符:
<xsl:function name="local:escape-regex" as="xs:string"> <xsl:param name="input" as="xs:string"/> <!-- 覆盖所有正则元字符 --> <xsl:variable name="meta-chars" select="'.\*+?[^]$(){}=!<>|:-'"/> <xsl:if test="string-length($input) > 0"> <xsl:variable name="first-char" select="substring($input, 1, 1)"/> <xsl:if test="contains($meta-chars, $first-char)"> <xsl:text>\</xsl:text> </xsl:if> <xsl:value-of select="$first-char"/> <xsl:value-of select="local:escape-regex(substring($input, 2))"/> </xsl:if> </xsl:function>
调用方式:
<xsl:sequence select="tokenize($text, local:escape-regex($separator))"/>
3. 纯字符串操作的分词方案(无正则依赖)
如果不想涉及正则转义逻辑,直接用substring-before和substring-after实现迭代分词,完全按字面量匹配分隔符:
<xsl:template name="split-literal-text"> <xsl:param name="text" as="xs:string"/> <xsl:param name="separator" as="xs:string"/> <xsl:choose> <xsl:when test="contains($text, $separator)"> <xsl:sequence select="substring-before($text, $separator)"/> <xsl:call-template name="split-literal-text"> <xsl:with-param name="text" select="substring-after($text, $separator)"/> <xsl:with-param name="separator" select="$separator"/> </xsl:call-template> </xsl:when> <xsl:otherwise> <xsl:sequence select="$text"/> </xsl:otherwise> </xsl:choose> </xsl:template>
这个方案兼容所有XSLT版本,适合对正则不熟悉或需要最大化兼容性的场景。
内容的提问来源于stack exchange,提问作者martin
相关产品推荐
相关产品推荐

