如何使用xquery替换属性的值
我有一个xml文档,如下所示如何使用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
<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"]