带有分组依据的Xquery FLWOR

带有分组依据的Xquery FLWOR,xquery,flwor,Xquery,Flwor,我想按类型对所有电影进行分组,然后列出此类型中的所有电影标题 我的XML电影数据库如下所示: <movies> <movie> <title>A History of Violence</title> <year>2005</year> <country>USA</country> <genre>Crime</genre> <s

我想按类型对所有电影进行分组,然后列出此类型中的所有电影标题

我的XML电影数据库如下所示:

<movies>
  <movie>
    <title>A History of Violence</title>
    <year>2005</year>
    <country>USA</country>
    <genre>Crime</genre>
    <summary>Tom Stall, a humble family man and owner of a 
    popular neighborhood restaurant, lives a quiet but 
    fulfilling existence in the Midwest. One night Tom 
    foils a crime at his place of business and, to his 
    chagrin, is plastered all over the news for his 
    heroics. Following this, mysterious people follow 
    the Stalls' every move, concerning Tom more than 
    anyone else. As this situation is confronted, more 
    lurks out over where all these occurrences have 
    stemmed from compromising his marriage, family 
    relationship and the main characters' former 
    relations in the process.</summary>
 <director>     
        <last_name>Cronenberg</last_name>
        <first_name>David</first_name>
        <birth_date>1943</birth_date>
</director> 
<actor>
        <first_name>Vigo</first_name>
        <last_name>Mortensen</last_name>
        <birth_date>1958</birth_date>
        <role>Tom Stall</role>
</actor>
<actor>
        <first_name>Maria</first_name>
        <last_name>Bello</last_name>
        <birth_date>1967</birth_date>
        <role>Eddie Stall</role>
</actor>
<actor>
        <first_name>Ed</first_name>
        <last_name>Harris</last_name>
        <birth_date>1950</birth_date>
        <role>Carl Fogarty</role>
</actor>
<actor>
        <first_name>William</first_name>
        <last_name>Hurt</last_name>
        <birth_date>1950</birth_date>
        <role>Richie Cusack</role>
</actor>
 </movie>
但结果将给我所有的标题在一行,但我希望他们也列表分分开

这是实际输出:

<li>
<genre>Crime</genre>
<p>
<ol>Title: A History of Violence Heat Match Point</ol>
</p>
</li>
<li>
  • 罪行 标题:历史上的暴力热赛点

  • 应该是这样的:

    <li>
    <genre>Crime</genre>
    <p>
    <ol>Title: A History of Violence 
               Heat 
               Match Point
    </ol>
    </p>
    </li>
    <li>
    
  • 罪行 标题:暴力史 热度 赛点

  • 我需要如何调整查询

    提前谢谢。
    问候

    只需在内部添加另一个循环即可。为了更具描述性,我重新格式化并重命名了一些变量。通常,不要使用
    text()
    ,如果有很好的理由这样做,大多数情况下最好使用
    data()
    来聚合元素中的所有文本节点

    xquery version "3.0";
    
    let $movies := collection ('/db/Movie/data')/movies/movie
    return
      <html>
        <head></head>
        <body>
          <h1>Movies grouped by genre:</h1>
          <ol>{
            for $movie in $movies
            let $genre := $movie/genre
            group by $genre 
            let $titles := distinct-values($movie/title/data())
            return
              <li>
                <h2>{$genre} Titles</h2>
                <ol>{
                  for $title in $titles
                  return <li>{$title}</li>
                }</ol>
              </li>
            }</ol>
         </body>
       </html> 
    


    顺便说一下,HTML不允许在段落中列出列表。它是格式良好的XML,但不是有效的HTML。我也解决了这个问题。

    如果您的代码使用了一些示例输入,请始终提供示例输入。非常好的问题还提供了实际的和预期的输出,以进一步澄清问题。感谢hind。我编辑了这个问题,希望它能澄清它。除了提供至少两个元素以允许实际聚合外,这是一个提出得很好的问题。
    xquery version "3.0";
    
    let $movies := collection ('/db/Movie/data')/movies/movie
    return
      <html>
        <head></head>
        <body>
          <h1>Movies grouped by genre:</h1>
          <ol>{
            for $movie in $movies
            let $genre := $movie/genre
            group by $genre 
            let $titles := distinct-values($movie/title/data())
            return
              <li>
                <h2>{$genre} Titles</h2>
                <ol>{
                  for $title in $titles
                  return <li>{$title}</li>
                }</ol>
              </li>
            }</ol>
         </body>
       </html> 
    
    for $movie in $movies
    let $genre := $movie/genre
    group by $genre 
    return
      <li>
        <h2>{$genre} Titles</h2>
        <ol>{ $movie/title/element li { data() } }</ol>
      </li>