我有以下代码返回一个结果数组的数组我尝试使用distinct-values删除重复项,它没有做任何我尝试通过比较值没有成功删除使用循环函数。
我已经尝试转换为“xs anyAtomicType”并使用我尝试放入json数组的不同值并提取我尝试过标记的子数组,xdmp引用,字符串 - 之前/之后以及许多其他
declare function local:verify-user-uri($dir as xs:string)
{
for $each in cts:uris($dir, ())
let $uIds := (for $d in $each
where contains($d, "/profile.xml")
return $d)
return $uIds
};
我以以下形式获得重复结果:
/users/123-343-/profile.xml
/users/122-222-/profile.xml
/users/123-343-/profile.xml
/users/122-222-/profile.xml
/users/123-343-/profile.xml
/users/122-222-/profile.xml
我期待:
/users/123-343-/profile.xml
/users/122-222-/profile.xml
您是否有可能只是简单地调用了这个函数3次而没有意识到它?
你已经宣布$dir
是一个单一的xs:string
。如果你的$dir
恰好是同一目录的字符串序列,或者你用目录变量调用了3次函数。
启用功能映射很容易发生(默认行为)。 https://docs.marklogic.com/guide/xquery/enhanced#id_55459
您可以通过以下几种方式进行诊断:
1.)删除函数中$dir
参数的显式类型:
declare function local:verify-user-uri($dir)
{
for $each in cts:uris($dir, ())
let $uIds := (for $d in $each
where contains($d, "/profile.xml")
return $d)
return $uIds
};
执行cts:uris()
会出现错误,如下所示:
[1.0-ml] XDMP-ARGTYPE:)错误:XPT0004)cts:uris((“/ users /”,“/ users /”,“/ users /”),()) - arg1不是xs类型:串?
2.)尝试通过在prolog中添加以下内容来禁用函数映射:
declare option xdmp:mapping "false";
并看看你是否得到一个无效的强制错误,如:
[1.0-ml] XDMP-AS(错误:XPTY0004)$ dir as xs:string - 无效的coersion(“/ users /”,“/ users /”,“/ users /”)为xs:string
3.)您还可以在函数返回的值序列的末尾添加一些内容,以指示它执行了多少次:
declare function local:verify-user-uri($dir as xs:string)
{
for $each in cts:uris($dir, ())
let $uIds := (for $d in $each
where contains($d, "/profile.xml")
return $d)
return $uIds, "#"
};
并查看结果中您看到“#”的次数。如果不止一个,则多次调用该函数。
除了Mads的好建议之外,我还注意到了一些关于你的代码的其他事情:
$each
是没有意义的,因为它只包含一个uri。请记住,FLWOR语句以返回结束,该返回指示每个项目的结果cts:uris
的第一个arg只标志着一个开始,而不是结束。如果你用/aaa/
喂食,你也会回来/bbb/
等,但反之亦然。说实话,我认为你正在寻找cts:uri-match()
,这会将你的功能降低到单线:
declare function local:verify-user-uri($dir as xs:string) {
cts:uri-match($dir || "*/profile.xml")
};
HTH!
PS:我建议总是禁用Mads推荐的功能映射。它可以防止很多混乱。