如何修改MarkLogic XQuery代码实现按序号指定返回主机名
解决方案
方法一:直接利用序列下标(最简洁)
$hosts本身是有序序列,可以直接通过传入的序号作为下标获取对应主机名,无需额外构建map:
xquery version "1.0-ml"; declare variable $index as xs:integer external; <!-- 外部传入目标序号,比如1、3 --> let $hosts := xdmp:host-name(xdmp:group-hosts(xdmp:group())) return $hosts[$index]
调用时传入$index参数即可,比如传入3会直接返回序列中第3个主机名。
方法二:修正原有的Map实现(保留你的思路)
原代码中$i未在循环中递增,导致所有主机被存入同一个key下。先修正map的构建逻辑,再根据传入序号取值:
xquery version "1.0-ml"; declare variable $index as xs:integer external; <!-- 外部传入目标序号 --> let $hosts := xdmp:host-name(xdmp:group-hosts(xdmp:group())) let $map := map:map() <!-- 循环构建序号到主机名的映射,$i从1开始递增 --> for $i in 1 to count($hosts) let $_ := map:put($map, xs:string($i), $hosts[$i]) return () <!-- 根据传入序号获取对应主机名 --> return map:get($map, xs:string($index))
关键说明
- 外部变量
$index需要在调用时传入,比如通过MarkLogic的xdmp:eval或API请求传递参数。 - XQuery的序列下标从1开始计数,完全匹配你的需求。
内容的提问来源于stack exchange,提问作者Aviator
相关产品推荐
相关产品推荐

