1

私はXqueryを初めて使用します。私の要件は非常に単純ですが、知識が不足しているためできませんでした。

SharePoint サイトにクエリを実行しようとしています。xml 形式の SharePoint サイトのサンプル データは次のとおりです。

<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

よし、これを一歩ずつ進めよう。まず、何がうまくいかないのか。英語で言い換えると、クエリは「変数 $Statusvariable の値としてクエリ応答の属性のセットを持たせますが、値が「アクティブな状態」の属性がows_Status少なくとも 1 つある場合に限ります。次に、入力された値を返します。 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>
于 2013-07-07T20:41:22.357 に答える
0

使用しているクエリは次のように短縮できます

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

本当に解決しようとしている問題 (グループ化とカウント) については、CM Sperberg-McQueen の回答を使用してください。これはまったく問題ありません。XQuery 3.0 はgroup byどちらがより宣言的かをサポートしますが、sharepoint はそれを知りません。

于 2013-07-07T21:14:12.263 に答える
0

ここでの問題は、それぞれの場合の $queryresponse にそのような要素があるため、条件が常に true になることです。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 に答える