我知道有类似的问题,但解决方案并没有解决我的问题。由于声誉较低,我无法对同一问题页面发表评论。
我的XQuery代码:
<results>
{
for $p in
(
for $o in doc("mondial-3.0.xml") /mondial/organization
where fn:count($o/members)
order by fn:count($o/members) descending
let $m := $o/members
return <organization>
<name> {$o/@name/string()} </name>
<abbreviation> {$o/@abbrev/string()} </abbreviation>
<num_members> {fn:count($o/members)} </num_members>
<country> {doc("mondial-3.0.xml")/mondial/country[@id=$m/@country]/@name/string()} </country>
</organization>
)[position() < 3]
return $p
}
</results>
我使用Zorba作为获取输出的XQuery引擎。我得到的输出是正确的,只是我输出的结构不是我想要的结果。
目前所有国家/地区都在同一条线上打印。
<country> Angola Argentina Bolivia.... </country>
但我希望每个新国家都处于一个新的独立路线上。
<country> Angola </country>
<country> Argentina</country>
<country> Bolivia </country>
XML文件:
答案 0 :(得分:0)
由于您未提供示例输入,因此无法提供经过验证的解决方案。
问题是您创建了一个包含所有国家/地区名称的文本节点的元素。改为创建多个文本节点,例如使用另一个flwor表达式:
<organization>
<name> {$o/@name/string()} </name>
<abbreviation> {$o/@abbrev/string()} </abbreviation>
<num_members> {fn:count($o/members)} </num_members>
{
for $country in doc("mondial-3.0.xml")/mondial/country[@id=$m/@country]/@name/string()
return <country>{ $country }</country>
}
</organization>
如果你有XQuery 3.0的支持,你也可以在轴步骤中使用元素构造函数,具有更简洁的隐式循环结构:
<organization>
<name> {$o/@name/string()} </name>
<abbreviation> {$o/@abbrev/string()} </abbreviation>
<num_members> {fn:count($o/members)} </num_members>
{
doc("mondial-3.0.xml")/mondial/country[@id=$m/@country]/@name/element country { data() }
}
</organization>
一个建议:不要使用<name> {$o/@name/string()} </name>
,而是选择<name>{ $o/@name/string() }</name>
来防止标记内信息周围出现多余的空白。
答案 1 :(得分:0)
使用另一个XQuery 3.0功能,简单的地图操作符:
{
doc("mondial-3.0.xml")/mondial/country[@id=$m/@country] ! <country>{ ./@name/string() }</country>
}
这相当于XQuery 1.0中普通的旧FLWOR:
{
for $country in doc("mondial-3.0.xml")/mondial/country[@id=$m/@country]
return
<country>{ $country/@name/string() }</country>
}