3

単純なXMLデータベース(BaseXまたはeXist-db内)を構築しようとしていますが、ドキュメント内の値を変更する方法を理解するのに問題があります。

テスト用のコンテンツは次のように単純です。

<p>
    <pl>
        <id>6></id>
    </pl>
</p>

要素が存在しない場合は要素を挿入するか、存在する<pl>場合は要素を置き換える関数のようなものを構築しようとしています。しかし、XQueryはまだ私に問題を与えています:

if-then-elseロジックで正面から試してみると:

if (exists(/p/pl[id=6]/name)=false)
then insert node <name>thenname</name> into /p/pl[id=6]
else replace value  of node /p/pl[id=6]/name with 'elsename'

エラーが発生しますError: [XUDY0027] Replace target must not be empty。明らかに私は混乱しています。なぜelse部分が両方の場合に評価されるのか、したがってエラーです。else部分を空にすると:

if (exists(/p/pl[id=6]/name)=true)
    then insert node <name>thenname</name> into /p/pl[id=6]
    else <dummy/>

それから私は得るError: [XUST0001] If expression: no updating expression allowed

更新関数を宣言しようとすると、それでもエラーが報告されます:

declare namespace testa='test';

declare updating function testa:bid($a, $b)
{
if (exists(/p/pl[id=6]/name)=true)
    then insert node <name>thenname</name> into /p/pl[id=6]
    else <dummy/>
};

testa:bid(0,0)

Error: [XUST0001] If expression: no updating expression allowed.

BaseX6.5.1パッケージからこれらのエラーが発生しました。

では、可能であれば、簡単な方法で値を変更するにはどうすればよいですか?直接挿入と呼ぶと、同じ値の要素が複数存在する可能性があります。replaceを呼び出すと、ノードが存在しないときに失敗します。挿入/置換の前にノードを削除すると、不要なサブノードを破棄する可能性があります。

ほとんどのSQLデータベースでは、これらは非常に単純なタスクです(MYSQL'replace 'コマンドなど)。

4

1 に答える 1

5

@Qiqi:@Alejandroは正しいです。if式が正しくないXQuery構文:

if (exists(/p/pl[id=6]/name))
then insert node <name>thenname</name> into /p/pl[id=6]
else replace value of node /p/pl[id=6]/name with 'elsename'

eXist-dbのXQueryUpdate機能は現在eXist固有の実装であるため、eXist(現在)1.4.xおよび1.5devでは次のことが必要になることに注意してください。

if (exists(/p/pl[id=6]/name))
then update insert <name>thenname</name> into /p/pl[id=6]
else update value /p/pl[id=6]/name with 'elsename'

このeXist固有のXQueryUpdate構文は、http://exist-db.org/update_ext.htmlに記載されています。この構文は、W3CXQueryUpdate仕様が現在の状態に達する前に開発されました。eXistチームは、eXistをまもなくW3C仕様に完全に準拠させることを計画していますが、それまでの間、上記のドキュメントは、eXistを使用する場合に必要なことを達成するのに役立つはずです。

サンプルコードには、pl要素とid要素の中にタイプミスが含まれていることにも注意してください。有効なXMLバージョンは次のとおりです。

<p>
  <pl>
    <id>6</id>
  </pl>
</p>
于 2011-03-18T00:53:25.847 に答える