我是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>
我希望上面的代码只返回“活动状态”状态。但它返回了所有状态。
你能指出我在上述查询中的错误,并为我提供正确的查询以获取状态及其计数。
答案 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不知道。