当不同的值不起作用时,如何从cts:uris中删除重复的结果

时间:2019-04-25 18:43:43

标签: duplicates xquery marklogic

我有以下代码返回结果数组的数组,我尝试使用不重复值来删除重复项,但我也尝试执行任何操作,也尝试使用循环函数通过比较值而没有成功地删除结果。

我尝试转换为“ 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

2 个答案:

答案 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的建议禁用功能映射。它可以避免很多混乱。