2013-07-07 58 views
1

我是Xquery的新手。我的要求非常簡單,但由於缺乏知識,我無法做到這一點。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

作爲一個初學者,我想一個簡單的查詢 - 也就是說,在where子句中硬編碼的狀態名稱let語句,但似乎where子句對查詢沒有任何影響。

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

我期望上面的代碼只返回「活動狀態」狀態。但它返回了所有狀態。

你能指出我在上述查詢中的錯誤,併爲我提供正確的查詢來獲得狀態和計數。

+0

雖然剝離示例輸入是完全正確的,但請確保匹配示例輸入,查詢和所需輸出;這有助於理解您的需求。您一直在查詢您的示例輸入中不存在的屬性值(因此不會返回任何內容)。我的編輯代表你需要什麼? –

回答

2

好的,讓我們一步一個腳印吧。首先,出了什麼問題。用英語解釋,您的查詢意味着「讓變量$狀態變量具有查詢響應中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> 
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> 
0

您正在使用的查詢可以縮短到

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

對於你真正想解決(分組和計數)的問題,請使用CM SP erberg-McQueen的答案完全正確。 XQuery 3.0將支持group by這將更具說明性,但sharepoint不知道這一點。