每个结果都在XQuery的新行上

时间:2015-11-23 02:38:17

标签: xml xquery zorba

我知道有类似的问题,但解决方案并没有解决我的问题。由于声誉较低,我无法对同一问题页面发表评论。

我的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

2 个答案:

答案 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>
}