1

我知道有人问过类似的问题,但其中给出的解决方案并没有解决我的问题。而且由于我的声誉较低,我无法在同一个问题页面上发表评论。

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

4

2 回答 2

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>以防止标签内信息周围出现多余的空格。

于 2015-11-23T08:14:20.323 回答
0

使用另一个 XQuery 3.0 特性,简单的 map 运算符:

{ 
    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>
}
于 2015-11-23T15:39:39.017 回答