XQuery 连接结果
XQuery join result
我有一个 XML 看起来像这样:
<?xml version="1.0"?>
<root>
<flight>
<number>10001</number>
<airport>LAX</airport>
<dest>
<airport>SFO</airport>
</dest>
</flight>
<flight>
<number>10002</number>
<airport>LAX</airport>
<dest>
<airport>JFK</airport>
</dest>
</flight>
<flight>
<number>10003</number>
<airport>JFK</airport>
<dest>
<airport>LAX</airport>
</dest>
</flight>
</root>
使用 XQuery 我需要得到这样的东西:
<res>
<airport code="LAX">
<deps>2</deps>
<dests>1</deps>
</airport>
<airport code="JFK">
<deps>1</deps>
<dests>1</deps>
</airport>
<airport code="SFO">
<deps>0</deps>
<dests>1</deps>
</airport>
</res>
我做到了,并且可以得到正确的结果,但是,我的查询只能找到deps
或dests
,而不能同时找到。
这是我解决问题的方法。
let $all := doc("flights.xml")/root
for $airports in distinct-values($all/flight//*/airport) (:here I get all airport codes:)
order by $airports
for $nr-dep in $all/flight/airport
where $nr-dep = $airports
group by $airports
return <res>
<airport name="{$airports}"><deps>{count($nr-dep)}</deps></airport>
</res>
在这里我得到出发计数。我可以通过将 for $nr-dep in $all/flight/airport
替换为 for $nr-dep in $all/flight/dest/airport
来轻松获得目的地,但是我找不到一种方法来显示与预期 XML.
相同的结果
为什么不简单:
for $airport in distinct-values($all//airport)
order by $airport
return <airport code="{$airport}">
<deps>{count($all//flight/airport[. = $airport])}</deps>
<dests>{count($all//dest/airport[. = $airport])}</dests>
</airport>
这是一个使用 group by
的版本:
<res>{
for $airport in //airport
group by $code := $airport/text()
order by $code
return <airport code="{$code}">
<deps>{ count($airport/parent::flight) }</deps>
<dests>{ count($airport/parent::dest) }</dests>
</airport>
}</res>
我有一个 XML 看起来像这样:
<?xml version="1.0"?>
<root>
<flight>
<number>10001</number>
<airport>LAX</airport>
<dest>
<airport>SFO</airport>
</dest>
</flight>
<flight>
<number>10002</number>
<airport>LAX</airport>
<dest>
<airport>JFK</airport>
</dest>
</flight>
<flight>
<number>10003</number>
<airport>JFK</airport>
<dest>
<airport>LAX</airport>
</dest>
</flight>
</root>
使用 XQuery 我需要得到这样的东西:
<res>
<airport code="LAX">
<deps>2</deps>
<dests>1</deps>
</airport>
<airport code="JFK">
<deps>1</deps>
<dests>1</deps>
</airport>
<airport code="SFO">
<deps>0</deps>
<dests>1</deps>
</airport>
</res>
我做到了,并且可以得到正确的结果,但是,我的查询只能找到deps
或dests
,而不能同时找到。
这是我解决问题的方法。
let $all := doc("flights.xml")/root
for $airports in distinct-values($all/flight//*/airport) (:here I get all airport codes:)
order by $airports
for $nr-dep in $all/flight/airport
where $nr-dep = $airports
group by $airports
return <res>
<airport name="{$airports}"><deps>{count($nr-dep)}</deps></airport>
</res>
在这里我得到出发计数。我可以通过将 for $nr-dep in $all/flight/airport
替换为 for $nr-dep in $all/flight/dest/airport
来轻松获得目的地,但是我找不到一种方法来显示与预期 XML.
为什么不简单:
for $airport in distinct-values($all//airport)
order by $airport
return <airport code="{$airport}">
<deps>{count($all//flight/airport[. = $airport])}</deps>
<dests>{count($all//dest/airport[. = $airport])}</dests>
</airport>
这是一个使用 group by
的版本:
<res>{
for $airport in //airport
group by $code := $airport/text()
order by $code
return <airport code="{$code}">
<deps>{ count($airport/parent::flight) }</deps>
<dests>{ count($airport/parent::dest) }</dests>
</airport>
}</res>