XQuery多XML文档提取type-id映射表失败,求排查解决
问题分析与解决
你的代码问题出在循环范围和合并时机上:
- 你在
for $singleDoc的循环体内生成并返回每个文档的映射表,最终会输出1000多个独立的map,而非合并后的全局映射。 - 单个文档内的
map:merge完全多余,只是把当前文档的type和id生成entry后又合并,对全局合并没有帮助。
正确实现代码
let $all-entries := for $singleDoc in fn:collection($myURI || "/myFolder/") let $doc-id := $singleDoc//id/string() return for $t in $singleDoc//type/string() return map:entry($t, $doc-id) return map:merge($all-entries, map:merge-options('duplicates', 'combine'))
代码说明
- 收集所有键值对:遍历每个文档,先获取当前文档的
id,再为文档里的每个type生成一个map:entry(键是type值,值是当前文档的id)。 - 全局合并映射:用
map:merge把所有entry合并,通过duplicates: combine参数,让同一个type对应的多个id自动合并成序列,正好符合你要的映射格式。
如果你的XML文档里每个<document>只有一个<type>和一个<id>,可以简化代码:
map:merge( for $singleDoc in fn:collection($myURI || "/myFolder/") return map:entry($singleDoc//type/string(), $singleDoc//id/string()), map:merge-options('duplicates', 'combine') )
内容的提问来源于stack exchange,提问作者Marie
相关产品推荐
相关产品推荐

