как заменить значение атрибута с помощью xquery - PullRequest
4 голосов
/ 12 ноября 2010

У меня есть XML-документ следующим образом

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

Я пытаюсь написать xquery для 1) найти пользователя с заданным идентификатором пользователя - sony 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] Отдельный элемент, текст, атрибут, комментарий или число пи ожидаются как цель замены.

Как это исправить?

Ответы [ 2 ]

3 голосов
/ 12 ноября 2010

Вы писали:

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 в этом случае.

2 голосов
/ 13 ноября 2010
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: логический - не тип узла.Поэтому полученное сообщение об ошибке является правильным.

Требуется :

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

Кстати: в стандартном XQuery нет оператора replace.

...