每个结果在一个新行上 XQuery
Each result on a new line XQuery
我知道有人问过类似的问题,但其中给出的解决方案并没有解决我的问题。由于我的声誉较低,我无法在同一个问题页面上发表评论。
我的 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 文件:
由于您没有提供示例输入,我无法提供经过验证的解决方案。
问题是您创建了一个包含所有国家/地区名称文本节点的元素。改为创建多个文本节点,例如使用另一个 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>
,以防止标签内信息周围出现多余的空格。
使用另一个 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>
}
我知道有人问过类似的问题,但其中给出的解决方案并没有解决我的问题。由于我的声誉较低,我无法在同一个问题页面上发表评论。
我的 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 文件:
由于您没有提供示例输入,我无法提供经过验证的解决方案。
问题是您创建了一个包含所有国家/地区名称文本节点的元素。改为创建多个文本节点,例如使用另一个 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>
,以防止标签内信息周围出现多余的空格。
使用另一个 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>
}