単純な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 'コマンドなど)。