2016-11-04 74 views
1

在我学习Xquery和Xpath的冒险中,我遇到了一个问题,试图将苹果与他们的类别进行分组。Xquery 3.0 group by attribute value

我正在使用XPath 3.0XML 1.0在我的文档中。

我有这样的:

<fruits> 

    <fruit> 
     <name>Apple</name> 
     <category>Summer</category> 
    </fruit> 

    <fruit> 
     <name>Mondarine</name> 
     <category>Autumm</category> 
    </fruit> 

    <fruit> 

     <name>Kiwi</name> 
     <category>Summer</category> 
    </fruit> 

    <fruit> 
     <name>Aguacate</name> 
     <category>Winter</category> 
    </fruit> 

    <fruit> 
     <name>Banana</name> 
     <category>Winter</category> 
    </fruit> 

</fruits> 

我需要下输出:

<summary> 
<category = "Summer"/> 
<item list-names = "Apple, Kiwi"/> 
</summary> 

<summary> 
<category = "Autumm"/> 
<item list-names = "Mondarine"/> 
</summary> 

<summary> 
<category = "Winter"/> 
<item list-names = "Aguacate, Banana"/> 
</summary> 

我该怎么做了XQuery的?

可能很容易,但我还没有看到它,我正在努力解决这个问题。感谢您的帮助!

回答

1

您可以通过遍历类别名称的不同的值,然后使用XPath查询匹配的类别,项目的名称XQuery中解决这个问题:

for $category in distinct-values($fruits/fruit/category) 
let $items := $fruits/fruit[category = $category]/name 
return 
    <summary> 
    <category>{ $category }</category> 
    <item list-names="{ string-join($items, ', ') }"/> 
    </summary> 

请注意,您的样本输出不是有效的XML:

<category = "Summer"/> 

了用于存储该值的选项或者在一个属性:

<summary category="Summer"> ... 
<category value="Summer"/> ... 

或在元素,这是我选择了这个答案:

<summary> 
    <category>Summer</category> 
    <item list-names="Apple, Kiwi"/> 
</summary> 
<summary> 
    <category>Autumm</category> 
    <item list-names="Mondarine"/> 
</summary> 
<summary> 
    <category>Winter</category> 
    <item list-names="Aguacate, Banana"/> 
</summary> 
+1

无需在体内的花括号摘要元素 – Chondrops

+1

@Chondrops好点。答案已更新。 – wst

1

随着主题行中提到的XQuery 3.0,你也可以使用group by

for $fruit in fruits/fruit 
group by $cat := $fruit/category 
return <summary> 
    <category>{$cat}</category> 
    <items list="{string-join($fruit/name, ', ')}"/> 
</summary>