我在我的一个xsl-transformations(xsl:analyze-string
)中运行了一个小正则表达式,并且遇到了这个让我感到不舒服的效果,因为我没有找到任何解释......
我正在搜索非断裂空间和En-Spaces,因此我使用了\p{Z}
构造。根据Michael Kay的XSLT 2.0程序员参考中的许多示例,这应该可行。 RegExBuddy也批准:)
现在我的SaxonHE9.4N告诉我了
正则表达式出错:net.sf.saxon.trans.XPathException:expected({)
经过多次试验和错误后,我只是将括号加倍\p{{Z}}
......它有效!?但这次RegExBuddy不赞成!
有人可以给我解释一下这种效果吗?我在网上找不到任何令人满意的东西......
提前致谢!
编辑:我在replace()
函数内尝试了同样的事情,双括号版本无效。我不得不用单括号做到这一点!
答案 0 :(得分:8)
在属性值模板中,花括号是指示要评估的XPath表达式的特殊语法。如果你想要文字花括号,you have to escape them by doubling:
属性值模板由交替序列组成 固定部件和可变部件。可变部分由XPath组成 用大括号({})括起来的表达式。固定部分可能包含 任何字符,除了左大括号必须写为{{ 并且右侧花括号必须写成}} 。
注意:
变量部分中的表达式可能包含未转义的卷曲 在StringLiteral XP中或在注释中括号。
并非所有属性都是AVT,而是the regex attribute of analyze-string is:
注意:
因为regex属性是属性值模板,所以卷曲 正则表达式中的括号必须加倍。例如, 要匹配一到五个字符的序列,请写入regex =“。{{1,5}}”。 对于包含许多大括号的正则表达式,它可能更多 方便使用的符号如 regex =“{'[0-9] {1,5} [a-z] {3} [0-9] {1,2}'}”,或使用变量。
(强调在两个引号中都添加了。)