如何在xquery的xpath中使用元素变量

时间:2010-11-14 21:11:28

标签: xml xpath xquery

我正在使用以下xml文档

<users>
  <user>
    <userid>sony</userid>
    <password>sonypass</password>
  </user>
</users>

我正在尝试编写一个通用的xquery来通过传递变量来更新用户信息 - a)doc_name(xml文档的名称)b)userid(要更新其信息的用户的用户ID)c)update_node(要更新的元素,例如密码)d)new_value(要更新的元素的新值,例如sonynewpass)。我不知道如何在xpath中使用元素变量来执行此操作。我尝试了以下方法:

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

let $old_node := $users_doc/user[userid=$userid]/{$update_node}

return replace value of node $old_node with $new_value

但是,这个查询在第7行抛出[XPST0003]期望位置路径错误(让$ old_node:= $​​ users_doc / user [userid = $ userid] / {$ update_node})

有没有办法在xpath中使用元素变量?

谢谢, 索尼

2 个答案:

答案 0 :(得分:3)

您可以传递节点名称:

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

let $old_node := $users_doc/user[userid=$userid]/*[name()=$update_node] 

return replace value of node $old_node with $new_value 

答案 1 :(得分:0)

我认为您需要更改行

let $old_node := $users_doc/user[userid=$userid]/{$update_node}

let $old_node := $users_doc[userid=$userid]/{$update_node}