问题描述
下面是实际的字符串:
//Some_string,"some_string_1":"target_string"},some_other_string//
以下是我要使用的正则表达式模式:
<xsl:analyze-string select="text_node/text()" regex=",("some_string_1":.*?)"}">
<xsl:matching-substring>
<xsl:value-of select="substring-after(regex-group(1),':"')"/>
</xsl:matching-substring>
</xsl:analyze-string>
我提取的子字符串应该是“ target_string”
但是我遇到了以下错误
Fatal error during transformation using //my_path: Closing curly brace in attribute value template ",("some_string_1":.*?)"}" must be doubled;
我也尝试使用双花括号,但没有用
注意-我正在使用Ant脚本通过saxon-he-10.1.jar运行XSLT
谢谢!
解决方法
我倾向于将正则表达式放入xs:string
类型的参数或变量中,例如
<xsl:param name="pattern" as="xs:string">,("some_string_1":(.*?))"}</xsl:param>
然后我可以使用
<xsl:analyze-string select="." regex="{$pattern}">
<xsl:matching-substring>
<xsl:value-of select="regex-group(2)"/>
</xsl:matching-substring>
</xsl:analyze-string>
在这里,我不必担心在regex
属性之类的属性值模板中转义。
请注意,如果您使用XSLT 3,则更安全
<xsl:param name="pattern" as="xs:string" expand-text="no">,("some_string_1":(.*?))"}</xsl:param>
避免在树上插入任何更高的文本值模板。
,您需要将大括号加倍,因为它在XSLT中具有特殊含义,而对它进行转义是因为它在正则表达式中具有特殊含义:
",("some_string_1":.*?)"\}}"