2016-11-04 3 views
1

В моем приключении, чтобы узнать Xquery и Xpath У меня проблема с попыткой группировать яблоки с их категорией.Группа Xquery 3.0 по значению атрибута

Я использую XPath 3.0 и XML 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

Вы можете решить эту проблему в 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> 

Обратите внимание, что ваш пример вывод не является допустимым 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> 
Смежные вопросы