简体   繁体   English

Xquery 3.0按属性值分组

[英]Xquery 3.0 group by attribute value

In my adventure to learn Xquery and Xpath I'm with a problem trying to group apples with their category. 在学习Xquery和Xpath的冒险中,我遇到了一个问题,试图将苹果与它们的类别进行分组。

I'm using XPath 3.0 , and XML 1.0 in my document. 我在文档中使用XPath 3.0XML 1.0

I have this: 我有这个:

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

I need the next output: 我需要下一个输出:

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

How can I do this with a XQuery? 如何使用XQuery做到这一点?

Probably is very easy but I don't see it yet and I'm struggling a lot to solve this. 可能很容易,但是我还没有看到,我正在努力解决这个问题。 Thank you for your help! 谢谢您的帮助!

You can solve this in XQuery by iterating over the distinct values of category names, then querying the names of items that match the category using XPath: 您可以在XQuery中解决此问题,方法是遍历类别名称的不同值,然后使用XPath查询与类别匹配的项目名称:

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>

Note that your sample output is not valid XML: 请注意,您的示例输出不是有效的XML:

<category = "Summer"/>

Your options for storing that value are either in an attribute: 您可以使用以下属性来存储该值:

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

Or in an element, which is what I chose for this answer: 或在一个元素中,这就是我为此选择的答案:

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

As your subject line mentions XQuery 3.0 you could also use group by : 正如您的主题行提到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>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM