如何使用XQuery查找唯一元素?

时间:2014-11-07 15:54:58

标签: xquery

如何在下一个XML中获取国家/地区位置唯一的标题簿列表?

<BooksLib>
  <Book Title="Murder in NY" Year="1980">
    <BookLocations>
      <Location City="New York" Country="USA"/>
       <Location City="Virginia" Country="USA"/>
    </BookLocations>
  </Book >
  <Book  Title="Dracula" Year="2000">
    <BookLocations>
      <Location City="Sydney" Country="Australia"/>
      <Location City="Moab" Country="USA"/>
      <Location City="Calvados" Country="France"/>
    </BookLocations>
  </Book>
  <Book  Title="Romance in calvados" Year="2012">
    <BookLocations>
      <Location City="Calvados" Country="France"/>
    </BookLocations>
  </Book >
</BooksLib>

例如,在这个XML中将是&#34; Dracula&#34;,因为澳大利亚只出现一次

现在我明白了:

for $book in doc("books.xml")//Book
where count(distinct-values($Book/BookLocations/Location/@Country)) eq 1
return $Book/data(@Title)

但是这给了我这个县的标题。

1 个答案:

答案 0 :(得分:0)

我会稍微改变一下。首先,因为对我来说,一个人实际上是如何思考和第二次感觉更自然,因为它在大型集合中会更快。首先,我会尝试确定哪些国家只出现一次。然后基于此过滤掉结果。以下应该有效:

let $single-loc :=
  for $loc in doc("books.xml")//Location/@Country/string()
  where count(//Location/@Country[. = $loc]) = 1
  return $loc
for $book in doc("books.xml")//Book
where $book/BookLocations/Location/@Country = $single-loc
return $book/data(@Title)

请注意,您的输入XML格式不正确(我编辑了您的帖子)。此外,您的XQuery错误,因为$book$Book是两个不同的变量。