Xquery - 获取元素的计数

时间:2013-07-07 20:19:49

标签: sharepoint xquery

我是Xquery的新手。我的要求很简单,但我不能 - 由于我缺乏知识。

我正在尝试查询sharepoint网站。 sharepoint站点的xml格式的示例数据是:

<z:row ows_owshiddenversion="4" 
       ows_Regional_x0020_Regulatory_x0020_="Kyle Godfrey"   
       ows_Status="No Activity"/>
<z:row ows_owshiddenversion="4" 
       ows_Regional_x0020_Regulatory_x0020_="Grace Flux"     
       ows_Status="Strong Interest"/>
<z:row ows_owshiddenversion="4" 
       ows_Regional_x0020_Regulatory_x0020_="Foo Bar"   
       ows_Status="Active State"/>
<z:row ows_owshiddenversion="4" 
       ows_Regional_x0020_Regulatory_x0020_="Batz Quix"     
       ows_Status="Active State"/>

要求是获取ows_Status及其计数。例如:

  

强烈兴趣1
  没有活动1
  活跃状态2

作为初学者,我尝试了一个简单的查询 - 也就是说,在let语句的where子句中硬编码状态名称,但似乎where子句对查询没有任何影响。

let $Statusvariable := $queryresponse//@ows_Status 
where ($queryresponse//@ows_Status="Active State")
return 
<Status>{fn:data($Statusvariable)}</Status>

我希望上面的代码只返回“活动状态”状态。但它返回了所有状态。

你能指出我在上述查询中的错误,并为我提供正确的查询以获取状态及其计数。

3 个答案:

答案 0 :(得分:3)

好的,让我们一步一步。首先,出了什么问题。用英语翻译,您的查询意味着“让变量$ Statusvariable在查询响应中将ows_Status属性的值作为其值,但仅限于至少有一个ows_Status属性的情况下value“Active State”。然后返回$ Statusvariable的类型值。“您可能打算写一些更像

的内容
for $x in $queryresponse//@ows_Status
where $x = "Active State"
return <Status>{$x}</Status>

如果你想知道ows_Status属性的每个值出现的次数,按降序排列,我会写这样的东西(未测试):

for $value in distinct-values($queryresponse//@ows_Status)
let $n := count($queryresponse//@ows_Status[. = $value])
order by $n descending
return <Status count="{$n}">{$value}</Status>

答案 1 :(得分:0)

这里的问题是,在每种情况下$ queryresponse都有这样的元素,因此条件总是为真。您应该将其与每个单独的row记录进行比较,而不是将其与整个响应数据进行比较。

如果要迭代一组结果,还应使用for

for $row in $queryresponse//*:row
let $Statusvariable := $row/@ows_Status 
where $row/@ows_Status="Active State"
return 
<Status>{fn:data($Statusvariable)}</Status>

答案 2 :(得分:0)

您正在使用的查询可缩短为

$queryresponse//@ows_Status[.="Active State"]/element { 'Status' } { data(.) }

对于你真正试图解决的问题(分组和计数),请使用C. M. Sperberg-McQueen的答案,这完全没问题。 XQuery 3.0将支持group by,这将更具说明性,但sharepoint不知道。