2010-11-12 1 views
4

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

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

Я пытаюсь написать XQuery к 1) найти пользователя с указанным идентификатором пользователя - сони 2) измените значение атрибута «test» данного пользователя на «newvalue».

Я пытаюсь следующее: (где DOC_NAME = имя XML-документа, идентификатор пользователя = 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 заменит цель.

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

ответ

3

Вы писали:

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

Итак, $ старый держит результат для этого множества узлов сравнения.

Понадобится:

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

+0

let $ old: = $ users_doc/user [userid = $ userid]/@ test let $ new: = $ users_doc/user [userid = $ userid]/@ test {'newvalue'} return replace node $ old с $ new приводит к ошибке: [XPST0003] Ожидание выражения «где», «порядок» или «возвращение». Я также попытался вернуть атрибут $ old с помощью $ new. Обратите внимание, что в документе xml может быть несколько пользователей, каждый из которых имеет атрибут test. – sony

+0

@sony: Проверьте мое редактирование. – 2010-11-12 21:49:49

+0

let $ new: = attribute test {'newvalue'} - Я не уверен, к чему это относится. Что такое тест атрибута? В одном документе было бы несколько атрибутов теста, учитывая, что будет несколько пользователей. Вы имеете в виду $ new: = $ users_doc/user [userid = $ userid]/@ test {'newvalue'}. Я не уверен, что вы редактировали. – sony

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 is xs: boolean - не тип узла. Поэтому сообщение об ошибке, которое вы получаете, является правильным.

Вы хотите:

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

BTW: Там нет replace оператора в стандарте XQuery.

+1

Это обновление XQuery. – 2010-11-13 13:39:22

+0

@sony: Я не понимаю вопроса в вашем последнем комментарии - пожалуйста, повторите фразу. –