XQuery - 检查一组是否包含另一组(得到零结果)

XQuery - Checking if one set contains another set (getting zero results)

所以我正在使用这个 XML 数据库:https://www.dbis.informatik.uni-goettingen.de/Mondial/mondial.xml 这是我的问题描述:

"Which countries are members of ALL the organizations whose names start with the word 'International' and are headquartered in Europe?"

Xquery 代码:

let $doc := doc("mondial.xml")/mondial
let $countries := (
  for $c in $doc/country
  let $memShipsSet := $c/tokenize(data(@memberships), '\s')
  let $orgSet := $inter-orgs-eu/data(@id)
  where empty(distinct-values($orgSet[not(.=$memShipsSet)]))
  return <country code="{$c/data(@car_code)}">{$c/data(name)}</country>
)
return $countries

$inter-orgs-eu 是名称中含有 'International' 一词且总部位于欧洲的所有组织 [元素] 的 sequence/list 个)

distinct-values($orgSet[not(.=$memShipsSet)]) 函数 returns $orgSet 中未出现在 $memShipsSet 中的值(参考:http://www.xqueryfunctions.com/xq/functx_value-except.html

然而,当我 运行 这段代码时,它只是 returns 零结果,我无法弄清楚我做错了什么。这是逻辑错误还是其他原因(我是 Xquery 的新手,所以很可能是我错过的明显错误)?

感谢任何帮助。

谢谢!

编辑: 完整代码:

let $doc := doc("mondial.xml")/mondial

let $inter-orgs := (
  for $o in $doc/organization
  let $name := xs:string($o/data(name))
  where contains($name,xs:string("International"))
  return $o
)

let $inter-orgs-eu := (
  for $o in $inter-orgs
  let $hq := $o/data(@headq)
  let $city := $doc/country/id($hq)
  let $cCode := $city/data(@country)
  let $country := $doc/country[data(@car_code)=$cCode]
  where $country/encompassed/data(@continent) = 'europe'
  return $o
)

let $countries := (
  for $c in $doc/country
  let $memShipsSet := $c/tokenize(data(@memberships), '\s')
  let $orgSet := $inter-orgs-eu/data(@id)
  where empty(distinct-values($orgSet[not(.=$memShipsSet)]))
  return <country code="{$c/data(@car_code)}">{$c/data(name)}</country>
)
return $countries

原来确实有 0 个国家是所有这些组织的成员。所以我的代码实际上工作得很好。感谢@MartinHonnen 生成了所有国家和组织($inter-orgs-eu)的 table,他们是 over at xqueryfiddle.liberty-development.net/jyyiVhg 的成员。

我的代码中存在一个小问题,但我现在已经修复了。 $inter-orgs returned 所有包含单词 "International" 的组织,但根据问题描述,它应该只有 return 个以单词 "International" 开头的组织。我通过在 $inter-orgswhere 子句中使用 starts-with 函数而不是使用 contains 函数来修复它。不过,这对我的最终结果没有任何影响(当我 return $countries)。

最终代码:

let $doc := doc("mondial.xml")/mondial

let $inter-orgs := (
  for $o in $doc/organization
  let $name := xs:string($o/data(name))
  where starts-with($name,xs:string("International"))
  return $o
)

let $inter-orgs-eu := (
  for $o in $inter-orgs
  let $hq := $o/data(@headq)
  let $city := $doc/country/id($hq)
  let $cCode := $city/data(@country)
  let $country := $doc/country[data(@car_code)=$cCode]
  where $country/encompassed/data(@continent) = 'europe'
  return $o
)

let $countries := (
  for $c in $doc/country
  let $memShipsSet := $c/tokenize(data(@memberships), '\s')
  let $orgSet := $inter-orgs-eu/data(@id)
  let $orgsNotInMemSet := distinct-values($orgSet[not(.=$memShipsSet)])
  where empty($orgsNotInMemSet)
  return <country code="{$c/data(@car_code)}">{$c/data(name)}</country>
)

return <root>
 {$countries}
</root>