Xquery group by on 2 tags

时间:2014-01-22 13:30:36

标签: xquery basex

以下是我数据的XML部分。

<A>
 <a><Type>Fruit</Type><Name>Banana</Name></a>
 <a><Type>Fruit</Type><Name>Orange</Name></a>
 <a><Type>Fruit</Type><Name>Apple</Name></a>
 <a><Type>Fruit</Type><Name>Lemon</Name></a>
 <a><Type>Cars</Type><Name>Toyota</Name></a>
 <a><Type>Cars</Type><Name>Lamborghini</Name></a>
 <a><Type>Cars</Type><Name>Renault</Name></a>
</A>

输出为 -

<a>Fruits-Banana,Orange,Apple,Lemon</a>
<a>Cars-Toyota,Lamborghini,Renault</a>

我试图通过所有徒劳的方式获得所需的输出。我也尝试了'group by`条款,但却收到错误。

任何帮助?

1 个答案:

答案 0 :(得分:4)

let $x:=
<A>
  <a><Type>Fruit</Type><Name>Banana</Name></a>
  <a><Type>Fruit</Type><Name>Orange</Name></a>
  <a><Type>Fruit</Type><Name>Apple</Name></a>
  <a><Type>Fruit</Type><Name>Lemon</Name></a>
  <a><Type>Cars</Type><Name>Toyota</Name></a>
  <a><Type>Cars</Type><Name>Lamborghini</Name></a>
  <a><Type>Cars</Type><Name>Renault</Name></a>
</A>

  for $z in distinct-values($x//a/Type)
    let $c := $x//a[Type=$z]/Name
    return
       <a>{concat($z, "-", string-join($c, ","))}</a>

首先for采用标记Type的不同值,然后对于每个不同的值,派生所有Name标记的相应值。

然后使用concat函数将Type文本与string-join生成的字符串连接起来,用于添加/追加Name, (逗号)。

HTH:)