当我尝试在MarkLogic中运行XQuery时,我收到 XDMP-NOTANODE 错误。当我加载我的xml文档时,我加载了元数据文件。我是学生,我没有XQuery的经验。
错误:
[1.0-ml] XDMP-NOTANODE: (err:XPTY0019) $article/article/front/article-meta/title-group/article-title -- xs:untypedAtomic(" ") is not a node
Stack Trace
At line 3 column 77:
In xdmp:eval("(for $article in fn:distinct-values(/article/text())		 ...", (), <options xmlns="xdmp:eval"><database>4206169969988859108</database> <root>C:\mls-projects\pu...</options>)
$article := xs:untypedAtomic(" ")
1. (for $article in fn:distinct-values(/article/text())
2.
3. return (fn:distinct-values($article/article/front/article-meta/title-group/article-title)
4.
5.
代码:
(
for $article in fn:distinct-values(/article/text())
return (
fn:distinct-values($article/article/front/article-meta/title-group/article-title/text())
)
)
答案 0 :(得分:3)
每个$article
都绑定一个原子值(fn:distinct-values()
返回一系列原子值)。然后尝试在/
上应用路径表达式(使用$article
运算符)。这是禁止的,因为路径运算符要求其LHS运算符为节点。
我担心你的代码没有足够的意义让我建议你一个真正的解决方案。我只能查明错误的位置。
此外,在路径末尾使用text()
大部分时间都是个坏主意。如果/article
是一个复杂的文档,那肯定不是你想要的。您选择的其中一个文本节点(很可能是第一个)只是一个换行符。
你想达到什么目的?
答案 1 :(得分:0)
您的$article
变量绑定到原子值,而不是文章文档中的node()
。您只能在节点上使用XPath轴。
在distinct-values()
语句中应用函数for
时,它会返回简单的字符串值,而不是文章文档或节点。
您可以通过使用谓词过滤器中的值来实现目的:
for $article-text in fn:distinct-values(/article/text())
return
fn:distinct-values(/article[text()=$article-text]/front/article-meta/title-group/article-title/text())
注意:上述XQuery应该避免XDMP-NOTANODE错误,但是可能更容易(也更有效)的解决方案来实现您的目标。如果您要发布文档样本并描述您要实现的目标,我们可以建议替代方案。
答案 2 :(得分:0)
有点猜测,但你的代码中有两个不同的值。这让我觉得你想要一个独特的文章列表,然后最后一个独特的文章标题列表。我希望你的数据库中已经有了独特的文章,除非你明确地试图去除它们。
如果你只想要文章标题的整体唯一列表,我会做类似的事情:
distinct-values(
for $article in collection()/article
return
$article/front/article-meta/title-group/article-title
)
HTH!