所以我使用的是这个XML数据库:https://www.dbis.informatik.uni-goettingen.de/Mondial/mondial.xml这是我的问题描述:
"哪些国家/地区是所有组织的成员 从“国际”这个词开始并且总部设在欧洲?"
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
是所有组织[元素]的序列/列表,其名称中包含&#39; International&#39;并且总部位于欧洲)
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 :(得分:0)
事实证明,确实有0个国家是所有这些组织的成员。所以我的代码实际上工作得很好。感谢@MartinHonnen制作了一个包含所有国家和组织的表格($ inter-orgs-eu),他们是xqueryfiddle.liberty-development.net/jyyiVhg的成员。
我的代码中有一个小问题虽然我现在已经修复了。 $ inter-orgs返回所有包含“国际”一词的组织,但根据问题描述,它应该只返回以“国际”一词开头的组织。我使用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>