2014-01-29 3 views
1

Пример ввода XML-файлов и ожидаемого вывода внизу, нужна помощь для группировки на основе количества дочерних элементов.XQuery (XPath) для подсчета дочерних элементов и группы на основе номера

<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) 
+0

Пожалуйста, отправьте код и введите его как [SSCCE] (http://sscce.org), чтобы мы могли воспроизвести его. Ваш XML недействителен (отсутствует корневой элемент) и не соответствует ожидаемому результату. Либо отправьте исходный документ где-нибудь, либо сопоставьте ожидаемый вывод с предоставленным вводом. Вы также должны указать, какую версию и реализацию XQuery вы используете, поскольку XQuery 3.0 знает, что предложение 'group by' XQuery 1 не знает. –

+0

У меня есть обновление, как вы сказали - Спасибо – user3130446

+0

Вопрос выглядит отлично. У вас есть XQuery 3.0-совместимый процессор запросов, поэтому я решил ваш вопрос? Тогда вы можете отметить это как ответ (галочка слева от вопроса). –

ответ

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 детей).

+0

+10 Большое спасибо @Jens Erat за прекрасный запрос – user3130446

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

  • Нет связанных вопросов^_^