2010-11-12 89 views
4

我有一個XML文檔如下如何使用XQuery

<users> 
    <user test="oldvalue"> 
    <userid>sony</userid> 
    <name>vijay</name> 
    </user> 
</users> 

我試圖寫一個XQuery來 1)找出與給定用戶ID的用戶替換屬性的值 - 索尼 2)將給定用戶的「test」屬性的值更改爲「newvalue」。

我嘗試了以下內容:(其中DOC_NAME = XML文檔的名稱,用戶ID =索尼)

declare variable $doc_name as xs:string external; 
declare variable $userid as xs:string external; 
let $users_doc := doc($doc_name)/users 

let $old := $users_doc/user[userid=$userid]/@test="oldvalue" 
let $new := $users_doc/user[userid=$userid]/@test="newvalue" 

return replace node $old with $new 

我看到以下錯誤: [XUTY0008]單個元素,文本,屬性,註釋或預計pi將作爲替代目標。

我該如何解決這個問題?

回答

3

您寫道:

let $old := $users_doc/user[userid=$userid]/@trusted="oldvalue" 

所以,$老持有該節點集比較的結果。

您需要:

declare variable $doc_name as xs:string external; 
declare variable $userid as xs:string external; 
let $users_doc := doc($doc_name)/users 

    let $old := $users_doc/user[userid=$userid]/@test 
    let $new := 'newvalue' 

return replace value of node $old with $new 

編輯:我認爲是更好的在這種情況下使用replace value of

+0

let $ old:= $ users_doc/user [userid = $ userid]/@ test let $ new:= $ users_doc/user [userid = $ userid]/@ test {'newvalue'} return replace node $ old $ new導致錯誤:[XPST0003]期待'where','order'或'return'表達式。我也試過用$ new替換屬性$ old。請注意,xml文檔可能有多個用戶,每個用戶都有一個測試屬性。 – sony 2010-11-12 20:58:41

+0

@sony:檢查我的編輯。 – 2010-11-12 21:49:49

+0

let $ new:= attribute test {'newvalue'} - 我不確定這會引用什麼。這裏屬性測試是什麼?考慮到會有多個用戶,在一個文檔中會有多個測試屬性。你的意思是$ new:= $ users_doc/user [userid = $ userid]/@ test {'newvalue'}。我不確定你編輯了什麼。 – sony 2010-11-12 22:39:52

2
let $old := $users_doc/user[userid=$userid]/@test="oldvalue" 

let $new := $users_doc/user[userid=$userid]/@test="newvalue" 

return replace node $old with $new 

$old的類型是xs:boolean - 不是節點類型。因此,您收到的錯誤消息是正確的。

你想

let $old := $users_doc/user[userid=$userid]/@test[.="oldvalue"] 

BTW:沒有replace運營商在標準的XQuery

+1

這是XQuery更新。 – 2010-11-13 13:39:22

+0

@sony:我不明白你最近的評論中的問題 - 請重新說一句。 – 2010-11-14 17:49:55