我有一个xml文档如下
<users>
<user test="oldvalue">
<userid>sony</userid>
<name>vijay</name>
</user>
</users>
我正在尝试编写一个xquery 1)找到具有给定userid的用户 - 索尼 2)将给定用户的“test”属性的值更改为“newvalue”。
我正在尝试以下操作:(其中doc_name = xml文档的名称,userid = sony)
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。
我该如何解决这个问题?
答案 0 :(得分:3)
您写道:
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
修改:在这种情况下,我认为最好使用replace value of
。
答案 1 :(得分: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:标准XQuery中没有replace
运算符。