XQuery (XPath) для подсчета дочерних элементов и группировки на основе числа

Образцы вводимых файлов XML и ожидаемый результат находятся внизу, требуется помощь для группировки на основе количества дочерних элементов.

  <DashboardXML>
        <Column>
            <ColumnOrder>1</ColumnOrder>
            <ColLabel><![CDATA[test1]]></ColLabel>                
        </Column>
        <Column>
            <ColumnOrder>2</ColumnOrder>
            <ColLabel><![CDATA[t1est]]></ColLabel>       
        </Column>
          <Column>
            <ColumnOrder>3</ColumnOrder>
            <ColLabel><![CDATA[terst]]></ColLabel>       
        </Column>
    </DashboardXML>
    <DashboardXML>
        <Column>
            <ColumnOrder>1</ColumnOrder>
            <ColLabel><![CDATA[test1]]></ColLabel>                
        </Column>
        <Column>
            <ColumnOrder>2</ColumnOrder>
            <ColLabel><![CDATA[t1est]]></ColLabel>       
        </Column>
          <Column>
            <ColumnOrder>3</ColumnOrder>
            <ColLabel><![CDATA[terst]]></ColLabel>       
        </Column>
    </DashboardXML>
    <DashboardXML>
        <Column>
            <ColumnOrder>1</ColumnOrder>
            <ColLabel><![CDATA[test1]]></ColLabel>                
        </Column>
        <Column>
            <ColumnOrder>2</ColumnOrder>
            <ColLabel><![CDATA[t1est]]></ColLabel>       
        </Column>
    </DashboardXML>
    <DashboardXML>
        <Column>
            <ColumnOrder>1</ColumnOrder>
            <ColLabel><![CDATA[test1]]></ColLabel>                
        </Column>
        <Column>
            <ColumnOrder>2</ColumnOrder>
            <ColLabel><![CDATA[t1est]]></ColLabel>       
        </Column>
        <Column>
            <ColumnOrder>1</ColumnOrder>
            <ColLabel><![CDATA[test1]]></ColLabel>                
        </Column>
        <Column>
            <ColumnOrder>2</ColumnOrder>
            <ColLabel><![CDATA[t1est]]></ColLabel>       
        </Column>
    </DashboardXML>
    <DashboardXML>
        <Column>
            <ColumnOrder>1</ColumnOrder>
            <ColLabel><![CDATA[test1]]></ColLabel>                
        </Column>
        <Column>
            <ColumnOrder>2</ColumnOrder>
            <ColLabel><![CDATA[t1est]]></ColLabel>       
        </Column>
    </DashboardXML>

Выше представлен образец XML в качестве входных данных, а ниже - XQuery:

for $b in /DashboardXML where count($b/Column) > 0 order by count($b/Column) return <li>{count($b/Column)} </li>

Запрос дает следующий результат (образец):

    <li>3</li>
    <li>3</li>
    <li>2</li>
    <li>4</li>
    <li>2</li>

Теперь вопрос в том, как сгруппировать вывод, как показано ниже:

2 = 2 (counts)
3 = 2 (counts)
4 = 1 (counts)

person Reddy    schedule 29.01.2014    source источник
comment
Отправьте код и введите его как SSCCE, чтобы мы могли его воспроизвести. Ваш XML недействителен (отсутствует корневой элемент) и не соответствует ожидаемому результату. Либо опубликуйте где-нибудь исходный документ, либо сопоставьте ожидаемый результат с предоставленными входными данными. Вы также должны указать use, какую версию и реализацию XQuery вы используете, поскольку XQuery 3.0 знает, что предложение group by не известно XQuery 1.   -  person Jens Erat    schedule 29.01.2014
comment
У меня есть обновление, как вы предложили - Спасибо   -  person Reddy    schedule 29.01.2014
comment
Вопрос теперь выглядит отлично. У вас есть процессор запросов, совместимый с XQuery 3.0, поэтому я решил ваш вопрос? Затем вы можете отметить ответ как ответ (галочка слева от вопроса).   -  person Jens Erat    schedule 29.01.2014


Ответы (1)


Если вы используете обработчик запросов с поддержкой XQuery 3.0, используйте предложение group by.

for $b in $xml/DashboardXML
let $count := count($b/Column)
where $count > 0
order by $count descending
group by $count
return <li>{$b/DashboardName/text()} = {$count} ({count ($b) }) </li>

Что будет выводить

<li> = 1 (1) </li>
<li> = 2 (2) </li>

для заданного ввода (обратите внимание на отсутствующие элементы DashboardName и то, что я изменил предложение where, чтобы разрешить любое ненулевое количество Column дочерних элементов).

person Jens Erat    schedule 29.01.2014