Возможно ли, что вы просто вызывали эту функцию 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 (ошибка: XPTY0004) $ dir в виде xs: string - недопустимое приведение ("/ 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, "#"
};
И посмотрите, сколько раз вы видите "#" в результате. Если их больше одного, вы вызываете функцию несколько раз.