我有以下代码返回结果数组的数组,我尝试使用不重复值来删除重复项,但我也尝试执行任何操作,也尝试使用循环函数通过比较值而没有成功地删除结果。
我尝试转换为“ 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
答案 0 :(得分:0)
您是否可能只是简单地调用了此函数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:)err:XPT0004)cts:uris((“ / users /”,“ / users /”,“ / users /”),())-arg1不是输入xs:string?
2。)尝试通过在序言中添加以下内容来禁用功能映射:
declare option xdmp:mapping "false";
,然后查看是否收到无效的强制错误,例如:
[1.0-ml] XDMP-AS(err:XPTY0004)$ dir作为xs:string-无效的强制转换(“ / users /”,“ / users /”,“ / users /”)为xs:string < / p>
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, "#"
};
,然后查看您在结果中看到“#”的次数。如果不止一个,则需要多次调用该功能。
答案 1 :(得分:0)
除了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的建议禁用功能映射。它可以避免很多混乱。