Sedna中的XQuery Update替换

时间:2011-08-13 09:28:04

标签: replace xquery xquery-update sedna

我正在为学校做一个小项目。这个项目要求我表明我能够使用各种XML处理技术。现在,在我的项目中,我使用Sedna数据库管理器来保存用户记录,我想通过XQuery更新其中一些用户记录(我使用PHP API通过PHP Api将查询发送到数据库) Sedna开发者团队)。 想象一下,我有以下用户记录的数据库内容:

<?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>

现在,我的意图是更新,例如,prosper的用户记录。例如,在此记录中,我想更改他的名字和电子邮件,但保持其余不变。 我曾尝试使用以下查询,但在发送查询后,由于某些我不理解的原因(我认为它将用户记录的属性节点作为子节点插入),它会更改用户记录的文档顺序。 这是我用来更新用户的查询:

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>

现在,这个查询给我的问题是,当我在更新后尝试询问用户的信息时,我依赖于更新前子节点的相同顺序,但此查询会更改顺序。

是否有专业人士帮我解决这个问题?

我感谢你的时间。

1 个答案:

答案 0 :(得分:0)

Jan,如果你想获得password节点,你应该改变你的XPath(你当前的表达式{($user/node()[password])}不是你想的那样):

{$user/password}

同样适用于subscriptions

{$user/subscriptions}

它可以写成带谓词的一个表达式:

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