我正在研究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
有人可以解释一下我的正则表达式为什么不起作用吗?
答案 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