XSLT-正则表达式中的花括号

时间:2020-08-18 08:52:43

标签: regex xslt-2.0 xslt-3.0

我有一个文本节点,必须根据模式从中提取特定的子字符串

下面是实际的字符串:

//Some_string,"some_string_1":"target_string"},some_other_string//

以下是我要使用的正则表达式模式:

<xsl:analyze-string select="text_node/text()" regex=",(&quot;some_string_1&quot;:.*?)&quot;}">
    <xsl:matching-substring>    
        <xsl:value-of select="substring-after(regex-group(1),':&quot;')"/>          
    </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

谢谢!

2 个答案:

答案 0 :(得分:0)

我倾向于将正则表达式放入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>

避免在树上插入任何更高的文本值模板。

答案 1 :(得分:0)

您需要将大括号加倍,因为它在XSLT中具有特殊含义,而对它进行转义是因为它在正则表达式中具有特殊含义:

",(&quot;some_string_1&quot;:.*?)&quot;\}}"