如何在MarkLogic中使用cts:values获得元素的最大值?

时间:2018-08-30 12:14:00

标签: xquery marklogic

我想从数据库中存在的所有文档中获取<ID>的最大值。

示例文档-

<root xmlns="http://marklogic.com/sample">
 <node>
  <ID>3253523</ID>
  <value1>.....</value1>
  <value2>.....</value2>
  <value3>.....</value3>
  <value4>.....</value4>
   .....................
 </node>
</root>

我尝试过的方法如下-

  1. 我用uri http://marklogic.com/sample创建了一个前缀为sa的路径名称空间。

  2. 创建了一个类型为int的路径范围索引,其路径为/sa:root/sa:node/sa:ID

3。尝试使用以下代码从数据库中获取最大值-

declare namespace sa = "http://marklogic.com/sample"; (cts:values(cts:path-reference('/sa:root/sa:node/sa:ID'), (), "descending"))[1]

但这给了我一个空的序列。不知道我在这里想念什么。

任何建议??

2 个答案:

答案 0 :(得分:2)

尝试将带有名称空间绑定的地图作为第三个参数传递给cts:path-reference()。参见:http://docs.marklogic.com/cts:path-reference

顺便说一句,cts:max()可能是从范围索引中获取最大值的最有效方法。参见:http://docs.marklogic.com/cts:max

该方法类似于以下片段:

cts:max(
    cts:path-reference('/sa:root/sa:node/sa:ID', (),
        map:entry("sa", "http://marklogic.com/sample")
    ))

希望有帮助,

答案 1 :(得分:1)

根据Elijah Bernstein-Cooper的建议 我刚刚在您共享的xml中添加了xmlns="http://marklogic.com/sample"名称空间,并在数据库中插入了一些xml文件。

创建了路径名称空间,路径范围索引并运行了共享的cts查询,并且运行良好,因此Elijah是正确的,您只需要在xml中指定名称空间即可。

查询中的小变化是在declare namespace语句中,前缀将是sa而不是es

希望这会有所帮助。