2013-12-03 3 views
0

Я пытаюсь запустить xquery для моего xml-файла. Это мой входной файл xml:xquery для группировки данных из xml-файла

<?xml version="1.0" ?> 
<authors> 
    <author><name> Steven</name> 
    <title>advanced</title> 
    <title>TCPIP</title> 
    </author> 
    <author><name> George</name> 
    <title>DataMining</title> 
    <title>Economic</title> 
    </author> 
    <author><name> Den</name> 
    <title>TCPIP</title> 
    <title>Economic</title> 
    </author> 
</authors> 

Я пытаюсь сгруппировать каждое название и подсчитать количество авторов для каждого заголовка. Книги должны быть перечислены в порядке возрастания количества авторов. Для каждой книги выведите свой заголовок, количество авторов и имя всех его авторов в алфавитном порядке. И, наконец, вывод должен быть таким:.

<bib> 
<book authors="1"> 
    <title>Advanced</title> 
    <author>Steven</authhor> 
</book> 
<book authors="1"> 
    <title>DataMining</title> 
    <author>George</author> 
</book> 
<book authors="2"> 
    <title>TCPIP</title> 
    <author>Den</author> 
    <author>Steven</author> 
</book> 
<book authors="2"> 
    <title>Economic</title> 
    <author>Den</author> 
    <author>George</author> 
</book> 
</bib> 

Это мой код, который не работает :(там любая помощь, пожалуйста, если это возможно исправить мой код вместо того, чтобы писать новый код, так как я. хочу ответ будет выглядеть мой ответ.

<bib> 
{for $a in doc('test')//authors 
let $T:={for $c in doc ('test')//authors/author[title=$a/author/title] 
order by count($T) 
return <book authors="{count($T)}"> 
{<title> {distinct-values($T/title)} 
for $x in $T 
order by $x/name() 
return <author>{$x/name()}</author>} 
</book>} 
</bib> 

Я думаю, что проблема в ту часть, которую я пытаюсь использовать команду let. Как я знаю, что могут группировать данные по пусть команду. Я попытался для каждого названия в файле XML, чтобы захватить всех авторов и после этого подсчитать количество авторов и отсортировать их по имени. Я использую эту ссылку: http://basex.org/products/live-demo/, чтобы проверить свой ответ.

+3

Ваш вклад XML и ожидаемый выход XML синтаксически неправильно ('' не закрывается, '' недействителен). Что еще более важно (но, скорее всего, связано с недействительным XML), я не понимаю, как связаны авторы и названия. Обычно у вас будет какая-то иерархия, но здесь авторы и названия - все братья и сестры. Тем не менее, один первый намек: проблема, которую вы описываете, кричит для выражения 'group by', вы должны обязательно переписать это. Поскольку BaseX поддерживает XQuery 3.0, он также поддерживает 'group by' – dirkk

+0

Ваш xml не очень хорошо сформирован. – PhillyNJ

+0

Вы правы Я изменил формат файла XML – star2014

ответ

1

Как предложил Даниэль Хейли, вы должны сделать это наоборот, то есть итерации по каждому заголовку и поиск авторов, которые пишут это конкретное название. Вы можете использовать distinct-values или group by. Должно работать:

<bib> 
{ 
    let $titles := distinct-values(doc('test')//title) 
    for $t in $titles 
    let $authors := doc('test')//author[title = $t] 
    order by count($authors) 
    return 
    <book authors="{count($authors)}"> 
     <title>{$t}</title> 
     { 
     for $a in $authors 
     order by $a/name 
     return <author>{$a/name/string()}</author> 
     } 
    </book> 
} 
</bib> 
+1

+1 - Я добавил 'order by $ a/name' для сортировки авторов. –

+0

спасибо :). Он работает:) да, мне нужно было выбрать название на первом – star2014

Смежные вопросы