【问题标题】:XQuery to get a multi-valued field in MarkLogicXQuery 在 MarkLogic 中获取多值字段
【发布时间】:2020-10-27 16:28:17
【问题描述】:

我收到此错误,因为我们将字段设为多值(多个相同元素的列表):

argX is not of type xs:anyAtomicType?

这是我们用来从 MarkLogic 获取值的查询:

declare variable $uris as xs:string  external;
for $uri in tokenize($uris,';')
    let $doc := fn:doc($uri)
    return xdmp:gzip(
        xdmp:unquote(fn:concat(
            "<item>",
            "<uri>",
            $uri,
            "</uri>",
            "<date-loaded>",
            $doc/date-loaded,
            "</date-loaded>",
            "<collections>",
                string-join(xdmp:document-get-collections($uri), ";"),
            "</collections>",
            "</item>"
        ))
    )

现在&lt;date-loaded&gt; 字段可以有多个值,如下所示:

<date-loaded>2020-01-01</date-loaded>
<date-loaded>2020-01-02</date-loaded>
<date-loaded>2020-01-03</date-loaded>

这里的顺序很重要。我应该如何将此查询更改为正确的查询,以检索 date-loaded 的所有值并将它们分别放在单独的 XML 元素中?

【问题讨论】:

  • 您的文档是什么样的? $doc/date-loaded如何选择多个项目? XPath 是为这些日期选择一系列 text() 节点,即第一项是“2020-01-01”,还是选择一系列元素 &lt;date-loaded&gt;2020-01-01&lt;/date-loaded&gt;

标签: xquery marklogic


【解决方案1】:

如果您不创建要解析为 XML 的字符串,而是利用 XQuery 语言为您做这件事,事情会变得更容易和简单:

for $uri in tokenize($uris,';')
let $doc := fn:doc($uri)
return 
  xdmp:gzip(<item>
              <uri>{$uri}</uri>
              {$doc/date-loaded} 
              <collections>{string-join(xdmp:document-get-collections($uri), ";") }</collections>
            </item>)

如果您希望那些date-loaded 元素以特定顺序而不是源文档顺序列出,您可以按 FLOWR 对它们进行排序:

{ 
  for $date in $doc/date-loaded
  order by $date
  return $date
}

【讨论】:

  • 非常感谢,您的问题就是解决方案!这是一个示例输出记录:&lt;item&gt; &lt;uri&gt;XYZ&lt;/uri&gt; &lt;date-loaded&gt;2020-10-16&lt;/date-loaded&gt; &lt;date-loaded&gt;2020-10-27&lt;/date-loaded&gt; &lt;collections&gt;...&lt;/collections&gt; &lt;/item&gt;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-23
相关资源
最近更新 更多