【问题标题】:Xquery - to get the count of an elementXquery - 获取元素的计数
【发布时间】:2013-07-07 20:19:49
【问题描述】:

我是 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>

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

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

【问题讨论】:

  • 虽然剥离示例输入完全没问题,但请确保匹配示例输入、查询和所需输出;这有助于了解您的需求。您一直在查询示例输入中不存在的属性值(因此不会返回任何内容)。我的编辑是否代表您的需要?

标签: sharepoint xquery


【解决方案1】:

好的,让我们一步一步来。首先,出了什么问题。用英语解释,您的查询意味着“让变量 $Statusvariable 将查询响应中的一组 ows_Status 属性作为其值,但前提是至少有一个 ows_Status 属性的值为“活动状态” “。然后返回 $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>

【讨论】:

    【解决方案2】:

    这里的问题是,每种情况下的 $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>
    

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-07-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多