如何使用xquery替换属性的值

如何使用xquery替换属性的值,xquery,xquery-update,Xquery,Xquery Update,我有一个xml文档,如下所示 <users> <user test="oldvalue"> <userid>sony</userid> <name>vijay</name> </user> </users> 我看到以下错误: [XUTY0008]单个元素、文本、属性、注释或pi应作为替换目标 如何修复此问题?您写道: let $old := $users_doc/user[use

我有一个xml文档,如下所示

<users>
  <user test="oldvalue">
   <userid>sony</userid>
   <name>vijay</name>
  </user>
</users>
我看到以下错误: [XUTY0008]单个元素、文本、属性、注释或pi应作为替换目标

如何修复此问题?

您写道:

let $old := $users_doc/user[userid=$userid]/@trusted="oldvalue" 
因此,$old保存该节点集比较的结果

你需要:

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 
编辑:我认为在这种情况下最好使用
替换
的值

$old
的类型是xs:boolean——不是节点类型。因此,您得到的错误消息是正确的

您想要的

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

顺便说一句:标准XQuery中没有
replace
操作符

let$old:=$users\u doc/user[userid=$userid]/@test let$new:==$users\u doc/user[userid=$userid]/@test{'newvalue'}返回用$new替换节点$old会导致错误:[XPST0003]需要“where”、“order”或“return”表达式。我还尝试将属性$old返回为$new。请注意,xml文档可能有多个用户,每个用户都有一个测试属性。let$new:=属性test{'newvalue'}-我不确定这指的是什么。这里的属性测试是什么?如果有多个用户,那么一个文档中会有多个测试属性。你是说$new:=$users\u doc/user[userid=$userid]/@test{'newvalue'}。我不确定您编辑了什么。我现在看到另一个错误:[XUDY0027]替换目标不能为空。我猜$old现在包含属性(test),但不包含属性的值('oldvalue')。我想我需要用$new替换属性的文本child/值,而不是用字符串替换节点。但是,我不知道怎么做。@索尼:“替换目标不能为空”:这意味着
$users\u doc/user[userid=$userid]/@test
没有选择任何内容。所以,
$users\u doc
是空的,或者您的输入样本与您的实际输入不匹配,所以
user[userid=$userid]/@test
部分不正确。@sony:我不理解您上次评论中的问题--请重新措辞。
let $old := $users_doc/user[userid=$userid]/@test="oldvalue"

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

return replace node $old with $new
let $old := $users_doc/user[userid=$userid]/@test[.="oldvalue"]