在marklogic

时间:2015-12-05 08:44:27

标签: xquery marklogic

当我尝试在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())&#9;&#9;    &#1...", (), <options xmlns="xdmp:eval"><database>4206169969988859108</database>   <root>C:\mls-projects\pu...</options>)
$article := xs:untypedAtomic("&#10;")
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())
 )      
)

3 个答案:

答案 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!