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

问题描述 投票:0回答:2

我有以下代码返回一个结果数组的数组我尝试使用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
duplicates xquery marklogic
2个回答
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:)错误: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, "#"
};

并查看结果中您看到“#”的次数。如果不止一个,则多次调用该函数。


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推荐的功能映射。它可以防止很多混乱。

© www.soinside.com 2019 - 2024. All rights reserved.