微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决XSLT-正则表达式中的花括号

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

下面是实际的字符串:

//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

谢谢!

解决方法

我倾向于将正则表达式放入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中具有特殊含义,而对它进行转义是因为它在正则表达式中具有特殊含义:

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。