Замена обновления XQuery в Sedna

Я работаю над небольшим проектом для школы. В этом проекте меня просят показать, что я могу использовать различные методы обработки XML. Теперь в моем проекте я работаю с менеджером баз данных Sedna, в котором я храню пользовательские записи, и я хотел бы обновить некоторые из этих пользовательских записей через XQuery (я использую PHP API для отправки запросов в базу данных через PHP API, предоставленный команда разработчиков Sedna). Представьте, что у меня есть следующий контент базы данных для пользовательских записей:

<?xml version="1.0" encoding="UTF-8"?>

<users>
    <user id="admin" admin="true">
        <email>[email protected]</email>
        <password>123456789</password>
        <firstname>The</firstname>
        <lastname>Stig</lastname>
        <gender>male</gender>
        <subscriptions>
        </subscriptions>
    </user>
    <user id="prosper" admin="false">
        <email>[email protected]</email>
        <password>123456789</password>
        <firstname>Strange</firstname>
        <lastname>Figure</lastname>
        <gender>male</gender>
        <subscriptions>
        </subscriptions>
    </user>
</users>

Теперь я намерен обновить, например, запись пользователя Prosper. В этой записи я хотел бы, например, изменить его имя и адрес электронной почты, но оставить все остальное без изменений. Я попытался использовать следующий запрос, но после отправки запроса он изменяет порядок документов в пользовательской записи по какой-то причине, которую я не понимаю (я думаю, что он вставляет узлы атрибутов пользовательской записи как дочерние узлы). Это запрос, который я использую для обновления пользователя:

UPDATE replace $user in doc("users")//user[@id="prosper"]
with
<user>{($user/@*)}
<email>[email protected]</email>
{($user/node()[password])}
<firstname>Familiar</firstname>
<lastname>Figure</lastname>
<gender>male</gender>
{($user/node()[subscriptions])}</user>

Теперь проблема, которую дает мне этот запрос, заключается в том, что когда я пытаюсь запросить информацию о пользователе после обновления, я полагаюсь на тот же порядок дочерних узлов, что и до обновления, но этот запрос меняет порядок.

Есть ли кто-нибудь достаточно квалифицированный, чтобы помочь мне с этой проблемой?

Я благодарю вас за ваше время.


person Jan Discart    schedule 13.08.2011    source источник
comment
Ян, твой пример работает (порядок документа между пользовательскими элементами сохраняется после замены) у меня на Sedna 3.4.66. Можете ли вы предоставить другие детали, чтобы воспроизвести вашу проблему?   -  person Shcheklein    schedule 15.08.2011
comment
Привет Иван. Порядок документов между пользовательскими записями действительно сохраняется, но проблема заключается в обновленной пользовательской записи. У меня есть форма, в которой я позволяю своему PHP-скрипту заполнять информацию о пользователе. Пользователь может обновить эту информацию и сохранить ее. Но после обновления при отображении той же формы информация о пользователе отображается некорректно. После выполнения обновления в текстовой области, где должно быть имя, заполняется фамилия, в текстовой области, где должна быть фамилия, заполняется пол. Итак, что-то внутри записи пользователя изменилось, и я не понимаю, почему .   -  person Jan Discart    schedule 16.08.2011
comment
Ян, см. мой ответ ниже. В любом случае, как вы связываете значения с полями?   -  person Shcheklein    schedule 16.08.2011


Ответы (1)


Ян, если вы хотите получить узел password, вы должны изменить свой XPath (ваше текущее выражение {($user/node()[password])} не то, что вы думаете):

{$user/password}

то же верно и для subscriptions:

{$user/subscriptions}

Его можно записать как одно выражение с предикатом:

{$user/node()[local-name(.) = ('password', 'subscriptions')]}
person Shcheklein    schedule 16.08.2011
comment
Ты прав. Я не знал, что означает $user/node()[пароль]. Я основывал этот запрос на том, что нашел на веб-странице документации sedna. Ваше решение работает нормально. Большое спасибо за Вашу помощь. - person Jan Discart; 16.08.2011