每个结果在一个新行上 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 文件:

https://raw.githubusercontent.com/kroell/hsrm-mi-2semester-markuplanguage/master/Abgabe2/Aufgabe2/mondial-3.0.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>
}