我正在使用ML 5并希望将文档从本地文件系统提取/加载到MarkLogic DB。我在xdm;:filesystem-directory()函数的帮助下创建了递归函数来检查文件夹深度。但是,我收到了XDMP-STACKOVERFLOW错误。我的文件系统文件夹有多个文件夹,多个子文件夹有多个深度。例如
├───vol_18
│ ├───iss_1
│ ├───iss_2
│ ├───iss_3
│ ├───iss_4
│ ├───iss_5
│ └───iss_6
├───vol_19
│ ├───iss_1
│ ├───iss_2
│ ├───iss_3
│ ├───iss_4
│ ├───iss_5
│ └───iss_6
├───vol_2
│ ├───iss_1
│ ├───iss_2
│ ├───iss_3
│ ├───iss_4
│ ├───iss_5
│ └───iss_6
还有其他更好的方法从本地文件系统递归获取文件吗?
我的代码是:
declare function IngestArchive($WhichFolder)
{
let $FileToIngest := ""
let $Collection := tokenize($WhichFolder, '\\')[last()]
for $EachFolder in xdmp:filesystem-directory($WhichFolder)/dir:entry
return
if( $EachFolder[dir:type='directory'] )
then
let $Result := HasFolder($WhichFolder)
return xdmp:set($FileToIngest, <File>{$Result/dir:pathname/string()}</File>)
else
xdmp:set($FileToIngest, <File>{$EachFolder/dir:pathname/string()}</File>)
};
declare function HasFolder($WhichFolder)
{
for $EachFolder in xdmp:filesystem-directory($WhichFolder)/dir:entry[1]
return
if( $EachFolder[dir:type='directory'] )
then
HasFolder($WhichFolder)
else
<File>{$EachFolder/dir:pathname/string()}</File>
};
请提出您的建议。
答案 0 :(得分:2)
看起来像一个无限循环。您的HasFolder
函数调用自身,但使用原始参数。我想你想要这个:
HasFolder($WhichFolder)
替换为:
HasFolder($EachFolder)
HTH!