XQuery集合包含校验无结果及特定国际组织成员国查询问题
解决XQuery集合包含校验返回零结果的问题
看起来你是要找出所有同时属于所有名称以"International"开头且总部位于欧洲的国际组织的国家,之前的代码在集合包含校验上出了问题,我来帮你梳理下正确的写法和可能的坑点。
完整的XQuery解决方案
let $doc := doc("mondial.xml")/mondial (: 第一步:筛选出符合条件的目标组织 :) let $target-orgs := $doc/org[starts-with(@name, 'International')] [ (: 关联总部所在国家,确认其属于欧洲 :) let $hq-country := $doc/country[@id = current()/@headquarters] return $hq-country/@continent = 'Europe' ] (: 提取目标组织的ID集合 :) let $target-org-ids := $target-orgs/@id/string() (: 遍历所有国家,检查是否是所有目标组织的成员国 :) for $country in $doc/country let $country-members := tokenize($country/@memberships, '\s+') (: 用'\s+'处理多空格分割的ID列表 :) where not(empty($target-org-ids)) (: 避免无目标组织时返回所有国家的情况 :) and every $org-id in $target-org-ids satisfies $org-id = $country-members return $country/@name (: 返回符合条件的国家名称 :)
你之前代码可能踩的坑
总部位置判断错误:
直接用org/@headquarters的文本无法确认是否在欧洲,必须关联到对应的country节点,检查其@continent属性是否为Europe,否则会把总部在非欧洲国家的组织也纳入筛选。集合分割的正则问题:
你用了tokenize(data(@memberships), '\s'),如果memberships属性里有连续空格,会生成空字符串元素,导致后续的包含判断出错。改用'\s+'可以匹配任意数量的空白字符,分割出干净的ID列表。集合包含的校验逻辑:
你之前写的empty(distinct-values($orgSet[...]))其实和every ... satisfies是等价的,但every写法更直观易懂,也更符合XQuery的语义规范。另外一定要先判断$target-org-ids是否为空,否则没有目标组织时所有国家都会被返回,这不符合业务逻辑。
内容的提问来源于stack exchange,提问作者Schytheron
相关产品推荐
相关产品推荐

