XDMP-REGEX:(err:FORX0002)-使用正则表达式进行字符串转换

时间:2018-10-06 19:07:34

标签: xpath xquery marklogic marklogic-9

我正在研究xquery的要求,以使用正则表达式从XML文档中标识xml标签name()。稍后,将对数据进行转换。它将搜索整个文档,如果发现匹配,则使用xquery / xpath执行字符串:replace。

请找到所需的示例代码。

let $full-doc := fn:doc($uri)
if(fn:matches($full-doc,"<Hyperlink\b[^\>]*?>([A-Z][a-z]{2} [0-3]?[0-9] 
[12][890][0-9]{2})</Hyperlink>")) 
then $full-doc 
else "regex is not working"

我遇到以下错误。

regex-match :
[1.0-ml] XDMP-REGEX: (err:FORX0002) fn:matches(fn:doc("44215.xml"), " 
<Hyperlink\b[^\>]*?>([A-Z][a-z]{2} [0-3]?[0-9] [12][890][0-9]{2}...") - 
- Invalid regular expression

有人可以解释一下我的正则表达式为什么不起作用吗?

2 个答案:

答案 0 :(得分:3)

根据您的要求:

  

我正在研究xquery的要求,以使用正则表达式从XML文档中标识xml标签name()。

这完全是错误的方法。 XQuery没有看到词法XML,而是看到了节点树。要查找元素的名称,请使用XPath表达式查找元素,然后使用name()函数获取其名称。

如果要查找名称与正则表达式匹配的元素,请使用//*[matches(name(), $regex)]

答案 1 :(得分:2)

XQuery不支持单词边界代码\b(请参阅https://www.w3.org/TR/xpath-functions-31/#regex-syntax)。

但是我想您正在寻找Hyperlink元素,而不是<Hyperlink>子字符串,因此您应该使用路径表达式:

let $doc := fn:doc($uri)
where $doc//Hyperlink[matches(., '([A-Z][a-z]{2} [0-3]?[0-9] [12][890][0-9]{2})')]
return $doc