4

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

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

这是我的表达:

xquery version "3.0";

let $movie := collection ('/db/Movie/data')/movies/movie

return

<html>
<head>

     </head>
     <body>
        <h1>Movies grouped by genre:</h1>

        <ol>{
              for $m in $movie
              let $g := $m/genre
              let $t := distinct-values($m/title/text())
              group by $g 
  return
                <li>{$g}  <p> <ol>Title: {$t}</ol> </p></li>



        }</ol>
   </body>
</html> 

但结果会给我一行中的所有标题,但我希望它们也分开列出点。

这是实际输出:

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

我需要如何调整查询?

提前致谢。问候

4

1 回答 1

3

只需在里面添加另一个循环。我确实重新格式化并重命名了一些变量以更具描述性。一般来说,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> 

您可以使用元素构造函数作为轴步骤使用隐式循环,但这需要删除distinct-values调用(您真的需要它吗?)我只是重复了$movie循环:

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>

顺便说一句,HTML 不允许段落内的列表。无论如何,它是格式良好的 XML,但不是有效的 HTML。我也解决了这个问题。

于 2014-01-11T18:48:27.887 回答