2011-08-13 4 views
1

私は学校のための小さなプロジェクトに取り組んでいます。このプロジェクトでは、XMLのさまざまな処理技術を使用できることを示すように求められます。私のプロジェクトでは、私はユーザーレコードを保存しているSednaデータベースマネージャーを使用しています。これらのユーザーレコードの一部をXQueryで更新したいと思います(PHP APIを使用してデータベースにクエリを送信しますSedna Developersチーム)。 は、私は、ユーザーレコードの次のデータベースコンテンツを持っている想像:XQuery Updateセドナの交換

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

、ここで私私の意図は、例えば、繁栄のuserrecordを更新することです。この記録では、たとえば、ファーストネームと電子メールを変更したいが、残りの部分は変更しないでください。 次のクエリを使用しようとしましたが、クエリを送信した後、何らかの理由でuserrecordのドキュメントの順序が変更されます(ユーザーレコードの属性ノードを子ノードとして挿入すると思います)。 これは私がユーザーを更新するために使用するクエリです:

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> 

は今、このクエリは私を与える問題は、私が更新した後、ユーザーの情報を尋ねるしようとすると、私は子供のと同じ順序に依存しているということですノードは更新前のものですが、このクエリは順序を変更します。

この問題を解決するのに十分な熟練者がいますか?

お時間をいただきありがとうございます。

+0

Jあなたのサンプルが動作します(ユーザー要素間のドキュメント順序は、置き換え後も保持されます)。Sedna 3.4.66。あなたの問題を再現するために他の詳細を提供できますか? – Shcheklein

+0

こんにちはIvan。ユーザーレコード間のドキュメントの順序は実際には保持されますが、問題は更新されたユーザーレコード内にあります。 私は自分のPHPスクリプトにユーザーの情報を入力させるフォームを持っています。ユーザーはこの情報を更新して保存することができます。しかし、更新後、同じフォームを表示すると、ユーザーの情報が正しく表示されません。更新が実行された後、ファーストネームが存在するテキストエリアでは、ラストネームが入力され、ラストネームがあるテキストエリアにはジェンダーが入力されます。 したがって、userrecord内の何かが変更され、なぜ。 –

+0

Jan、下記の私の答えを参照してください。とにかくフィールドに値をバインドする方法は? – Shcheklein

答えて

0

月、あなたがあなたのXPathを変更する必要がありpasswordノードを取得したい場合は(あなたの現在の式{($user/node()[password])}はあなたが考えるものではありません):

{$user/password} 

subscriptionsための真の同:

{$user/subscriptions} 

述語を含む1つの式として書くことができます。

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

あなたは正しいです。私は$ user/node()[password]が何を意味しているのか分からなかった。私はセドナのドキュメンテーションのウェブページで見つけたものにそのクエリを基づいています。あなたのソリューションは正常に動作します。ご助力ありがとうございます。 –