Replace Sedna中的XQuery更新替换

Replace Sedna中的XQuery更新替换,replace,xquery,xquery-update,sedna,Replace,Xquery,Xquery Update,Sedna,我正在为学校做一个小项目。这个项目要求我展示我能够使用各种XML处理技术。现在,在我的项目中,我与Sedna数据库管理器一起工作,我在其中保存用户记录,我希望通过XQuery更新其中一些用户记录(我使用PHP-API通过Sedna开发团队提供的PHP-API将查询发送到数据库)。 假设我有以下用户记录的数据库内容: <?xml version="1.0" encoding="UTF-8"?> <users> <user id="admin" admin="

我正在为学校做一个小项目。这个项目要求我展示我能够使用各种XML处理技术。现在,在我的项目中,我与Sedna数据库管理器一起工作,我在其中保存用户记录,我希望通过XQuery更新其中一些用户记录(我使用PHP-API通过Sedna开发团队提供的PHP-API将查询发送到数据库)。 假设我有以下用户记录的数据库内容:

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

<users>
    <user id="admin" admin="true">
        <email>admin@admin.com</email>
        <password>123456789</password>
        <firstname>The</firstname>
        <lastname>Stig</lastname>
        <gender>male</gender>
        <subscriptions>
        </subscriptions>
    </user>
    <user id="prosper" admin="false">
        <email>prosper@localhost.com</email>
        <password>123456789</password>
        <firstname>Strange</firstname>
        <lastname>Figure</lastname>
        <gender>male</gender>
        <subscriptions>
        </subscriptions>
    </user>
</users>

admin@admin.com
123456789
这个
斯蒂格
男性的
prosper@localhost.com
123456789
奇怪的
图形
男性的
现在,我打算在这里更新,例如,prosper的userrecord。例如,在这个记录中,我想更改他的名字和电子邮件,但保持其余不变。 我曾尝试使用以下查询,但在发送查询后,由于我不理解的原因,它更改了userrecord的文档顺序(我认为它将用户记录的属性节点插入为childnodes)。 这是我用来更新用户的查询:

UPDATE replace $user in doc("users")//user[@id="prosper"]
with
<user>{($user/@*)}
<email>strange.figure@localhost.com</email>
{($user/node()[password])}
<firstname>Familiar</firstname>
<lastname>Figure</lastname>
<gender>male</gender>
{($user/node()[subscriptions])}</user>
UPDATE replace$user in doc(“users”)//user[@id=“prosper”]
具有
{($user/@*)}
奇怪。figure@localhost.com
{($user/node()[password])}
熟悉的
图形
男性的
{($user/node()[subscriptions])}
现在,这个查询给我的问题是,当我试图在更新之后询问用户的信息时,我依赖于更新之前的子节点的相同顺序,但是这个查询改变了顺序

有没有足够熟练的人来帮我解决这个问题


谢谢您的时间。

Jan,如果您想获得
密码
节点,您应该更改XPath(您当前的表达式
{($user/node()[password])}
不是您所想的):

对于
订阅
,情况也是如此:

{$user/subscriptions}
它可以写成一个带谓词的表达式:

{$user/node()[local-name(.) = ('password', 'subscriptions')]}

Jan,您的示例在Sedna 3.4.66上为我工作(用户元素之间的文档顺序在替换后保留)。你能提供其他细节来重现你的问题吗?嗨,伊万。用户记录之间的文档顺序确实保留了下来,但问题在于更新的userrecord。我有一个表单,让我的PHP脚本填写用户信息。用户可以更新并保存此信息。但是在更新之后,当显示相同的表单时,用户的信息没有正确显示。执行更新后,在名应为的文本区域中,填写姓氏,姓氏应为的文本区域中,填写性别。所以userrecord中的某些内容被更改了,我不明白为什么。Jan,请看下面我的答案。无论如何,如何将值与字段绑定?你是对的。我不知道$user/node()[password]是什么意思。我是根据我在sedna文档网页上找到的内容进行查询的。你的解决方案很好用。非常感谢你的帮助。
{$user/node()[local-name(.) = ('password', 'subscriptions')]}