所以我使用这个 XML 数据库:https : //www.dbis.informatik.uni-goettingen.de/Mondial/mondial.xml这是我的问题描述:
“哪些国家是名称以‘国际’开头且总部设在欧洲的所有组织的成员?”
查询代码:
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
是名称中带有“国际”一词且总部位于欧洲的所有组织 [元素] 的序列/列表)
该distinct-values($orgSet[not(.=$memShipsSet)])
函数返回$orgSet
未出现的值$memShipsSet
(参考:http : //www.xqueryfunctions.com/xq/functx_value-except.html)
但是,当我运行此代码时,它只返回零结果,我无法弄清楚我做错了什么。这是一个逻辑错误还是其他什么(我是 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)的表格,他们是 xqueryfiddle.liberty-development.net/jyyiVhg 的成员。
我的代码中有一个小问题,但我现在已经解决了。$inter-orgs 返回所有包含“International”一词的组织,但根据问题描述,它应该只返回以“International”一词开头的组织。我通过starts-with
在我的where
子句中$inter-orgs
使用contains
函数而不是使用函数来修复它。虽然(当我返回时$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>
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句