1

我是 Xquery 的新手。我的要求很简单,但我做不到——因为我缺乏知识。

我正在尝试查询一个共享点站点。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>

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

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

4

3 回答 3

3

好的,让我们一步一步来。首先,出了什么问题。用英文解释,您的查询的意思是“让变量 $Statusvariableows_Status将查询响应中的一组属性作为其值,但前提是至少有一个ows_Status属性值为“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>
于 2013-07-07T20:41:22.357 回答
0

The query you're using could be shortened to

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

For the problem you're really trying to solve (grouping and counting), use C. M. Sperberg-McQueen's answer which is totally fine. XQuery 3.0 would support group by which would be more declarative, but sharepoint doesn't know that.

于 2013-07-07T21:14:12.263 回答
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>
于 2013-07-07T20:36:00.083 回答