首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用"group“和嵌套FLWOR

使用"group“和嵌套FLWOR
EN

Stack Overflow用户
提问于 2017-05-05 21:44:55
回答 1查看 149关注 0票数 1

我很难理解如何使用嵌套的FLWOR表达式和group。这里有一个XML文档示例,以及我想要做的事情。

代码语言:javascript
复制
 <review>
 <critic name="Critic1">
 <book>
    <name>ABC</name>
    <rating>6</rating>
 </book>
 <book>
    <name>Monsters</name>
    <rating>2</rating>
 </book>
 <book>
    <name>Spring Poems</name>
    <rating>5</rating>
 </book>
 </critic>
 <critic name="Critic2">
 <book>
    <name>ABC</name>
    <rating>2</rating>
 </book>
 <book>
    <name>Cooking101</name>
    <rating>7</rating>
 </book>
 <book>
    <name>Aliens?</name>
    <rating>10</rating>
 </book>
 </critic>
 </review>

基本上,我要做的是按每本书的名字把数据分组,然后在每本书下面展示每一位评论它的评论家,以及他们给那本书的分数。

到目前为止,我的疑问是

代码语言:javascript
复制
 for $books in doc("reviews.xml")/review/critic/book
 let $critics := doc("reviews.xml")/review/critic
 let $d := $books/name
 group by $d
 order by $d
 return <book name="{$d}">{
     for $hasReview in $critics
     where $critics/book/name = $d
     group by $n := $d
     return <critic name="{$critics/@name}" rating="
            {$critics/book[name=$d]/rating}"/>

     }</book>

此查询的输出如下所示

代码语言:javascript
复制
 <book name ="ABC">
     <critic name = "Critic1 Critic2" rating="6 2"/>
 </book>
 <book name ="Monsters">
     <critic name = "Critic1 Critic2" rating="2"/>
 </book>
 <book name ="Spring Poems">
     <critic name = "Critic1 Critic2" rating="5"/>
 </book>
 <book name ="Cooking101">
     <critic name = "Critic1 Critic2" rating="7"/>
 </book>
 <book name ="Aliens">
     <critic name = "Critic1 Critic2" rating="10"/>
 </book>

我试图获得的输出类似于以下内容:

代码语言:javascript
复制
 <book name ="ABC">
     <critic name = "Critic1" rating="6"/>
     <critic name = "Critic2" rating="2"/>
 </book>
 <book name ="Monsters">
     <critic name = "Critic1" rating="2"/>
 </book>
 <book name ="Spring Poems">
     <critic name = "Critic1" rating="5"/>
 </book>
 <book name ="Cooking101">
     <critic name = "Critic2" rating="7"/>
 </book>
 <book name ="Aliens">
     <critic name = "Critic2" rating="10"/>
 </book>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-05 22:13:55

我还没有使用组,因为我从未使用过任何支持它的软件。所以我想这样说:

代码语言:javascript
复制
for $bookName in distinct-values(doc("reviews.xml")/review/critic/book/name)
order by $bookName
return <book name="{$bookName}">{
    for $critic in doc("reviews.xml")/review/critic/book[name eq $bookName]
    return <critic name="{$critic/../@name}" rating="{$critic/rating}" />
}</book>

在对样本数据进行测试时,我得到了以下结果:

代码语言:javascript
复制
<book name="ABC">
  <critic name="Critic1" rating="6"/>
  <critic name="Critic2" rating="2"/>
</book>
<book name="Aliens?">
  <critic name="Critic2" rating="10"/>
</book>
<book name="Cooking101">
  <critic name="Critic2" rating="7"/>
</book>
<book name="Monsters">
  <critic name="Critic1" rating="2"/>
</book>
<book name="Spring Poems">
  <critic name="Critic1" rating="5"/>
</book>

你甚至不确定你在这里找的是什么。通过查看您的输出,它似乎奇怪地将两个评论家节点的属性合并到一个属性中(这可能正是它应该做的事情,但不是您所需要的)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43814162

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档