2017-08-11 3 views
0

をラップするために私はあなたに簡単な例を与えてみましょう:のXQuery Updateは、私は、XQueryの更新を使用して別の新しいノードとノードをラップしようとしていると私はいくつかの異なるエラーでこだわっている既存のノード

初期XMLは

です
<a id="test"> 
    <title>title</title> 
</a> 

XQueryコードは次のとおりです。

copy $x := db:open('testdb')/a[@id eq 'test']/title 
modify replace node $x 
with <b>{$x}</b> 
return <ok/> 

私は周囲のデータベースとしてbasexを使用していると私はデシベル使用している理由です:オープン関数を。

私が最後に取得したいのは

<a id="test"> 
    <b> 
    <title>title</title> 
    </b> 
</a> 

あるしかし、私はエラーが表示さ:

[XUDY0009] Target has no parent: element title {...}. 

注:

db:open('testdb')/a[@id eq 'test']/title 

です:クエリの結果を
<title>title</title> 

copy $x := db:open('testdb')/a[@id eq 'test']/title 
modify replace node db:open('testdb')/a[@id eq 'test']/title 
with <b>{$x}</b> 
return <ok/> 

を次のように私は、クエリを変更した場合、エラーが更新クエリのこの種を行うための適切な方法は何

[XUDY0014] Node was not created by copy clause: element title {...}. 

のですか?あなたは$ Xにバインドされたノード、およびリターン$ xに変更する必要が

答えて

2

:BaseXで

copy $a := db:open('testdb')/a[@id eq 'test'] 
modify replace node $a/title with <b>{ $a/title }</b> 
return $a 

は、updateキーワードは、代替として使用することができます。これは、よりコンパクトな表現が可能になります:

db:open('testdb')/a[@id eq 'test'] update { 
    replace node title with <b>{ title }</b> 
} 

データベース・ノード自体を更新したい場合は、copyまたはupdateを使用する必要はありません。

let $title := db:open('testdb')/a[@id eq 'test']/title 
return replace node $title with <b>{ $title }</b> 
+0

最初のクエリがエラーを発生させます「[XUDY0009]ターゲットにはparent:要素がありません。 " 2番目のクエリは、 "置き換え"トークンで構文エラー文字列を発生させます:(ただし、3番目のクエリは正常に動作します) – IgnacioHR

+0

最初の2つのクエリが更新されました。セマンティクス:http://docs.basex.org/wiki/Update –

+0

ありがとうございます!すべてのクエリが機能します! – IgnacioHR

関連する問題