2014-01-29 47 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知道XQuery 1不知道的“group by”子句。 –

+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

相关问题