XSLT中Regex匹配失效求助:正则在Oxygen中可匹配但XSLT中无效
问题原因与解决办法
核心原因
你在XSLT正则中使用"是错误的——XML解析器处理文档时,会把"实体还原为实际的双引号字符,而xsl:analyze-string处理的是节点解析后的文本值,不是原始的XML源码字符串。所以正则应该匹配双引号本身,而非"这个实体字符串。
修正正则的两种方式
在XSLT中,正则表达式写在属性里时,需注意双引号的转义规则:
- 如果属性值用双引号包裹,正则里的双引号要转义为
":<xsl:analyze-string select="your-target-node" regex="(^"\w+",\s)(\d+\.\d+,)"> <xsl:matching-substring> <!-- 提取第二个分组的数值 --> <xsl:value-of select="regex-group(2)"/> </xsl:matching-substring> </xsl:analyze-string> - 如果属性值用单引号包裹,正则里可以直接写双引号,无需转义:
<xsl:analyze-string select="your-target-node" regex='(^"\w+",\s)(\d+\.\d+,)'> <xsl:matching-substring> <xsl:value-of select="regex-group(2)"/> </xsl:matching-substring> </xsl:analyze-string>
额外注意点
- 正则中的
^锚点表示匹配文本的开头,如果目标文本节点中,引号包裹的单词并非位于文本最开始(比如前面有空白或其他字符),需要去掉^或者添加\s*匹配前置空白,比如(\s*"\w+",\s)。 - 确保
\w能覆盖你的单词范围:XSLT正则中的\w匹配Unicode字母、数字和下划线,如果单词包含连字符等特殊字符,需要调整为[a-zA-Z0-9-]+这类更精准的表达式。
内容的提问来源于stack exchange,提问作者l.surname
相关产品推荐
相关产品推荐

