2

xquery を使用して親ノードから子ノードを削除しようとしています。たとえば、xml に以下に示すエントリがあるとします。

 <entry>
        <id>36</id>
        <title>Engineering Village Author Tool</title>
        <updated>2009-09-30T12:55:42Z</updated>
        <libx:libapp>
          <libx:entry xmlns:libx="http://libx.org/xml/libx2" src="37"/>
        </libx:libapp>
      </entry>

子ノードを削除するにはどうすればよいですか

<libx:entry xmlns:libx="http://libx.org/xml/libx2" src="37"/>

次の xquery コードを使用しています。

declare namespace libx='http://libx.org/xml/libx2';
declare namespace atom='http://www.w3.org/2005/Atom';
declare variable $child_id as xs:string external;
declare variable $parent_id as xs:string external;
declare variable $doc_name as xs:string external;
declare variable $feed      as xs:anyAtomicType := doc($doc_name)/atom:feed;
let $parent_entry := $feed/atom:entry[atom:id=$parent_id]
return delete node $parent_entry//libx:entry[@libx:src=$child_id]

ここで渡される変数の値は次のとおりです。 child_id = 37 parent_id = 36 doc_name = 使用されているドキュメントの名前

名前空間の使用方法または行の xquery で使用している xpath 式のいずれかに何か問題があると推測しています。

return delete node $parent_entry//libx:entry[@libx:src=$child_id]

これを修正するのを手伝ってください。

4

2 に答える 2

2

あなたは宣言し$feed as xs:anyAtomicTypeていますが、それを設定し、それをとして使用していnode()ます。

私は実際にクエリがコンパイルされることに驚いています。を削除するxs:anyAtomicTypeか、に置き換えてみてくださいelement()

また@src、子ノードのみを選択し、を選択する必要はありません@libx:src。それで

declare namespace libx='http://libx.org/xml/libx2';
declare namespace atom='http://www.w3.org/2005/Atom';
declare variable $child_id as xs:string external;
declare variable $parent_id as xs:string external;
declare variable $doc_name as xs:string external;
declare variable $feed := doc($doc_name)/atom:feed;
let $parent_entry := $feed/atom:entry[atom:id=$parent_id]
return delete node $parent_entry//libx:entry[@src=$child_id]
于 2010-09-24T06:45:23.237 に答える
0

出力またはエラーが何であるかがわからないので、 $parent_node が適切に設定されていないと推測します。つまり、クエリ$feed/atom:entry[atom:id=$parent_id]は何も返していません。私は$feed/entry[id=$parent_id]楽しみのためにしようと思います。また、$feed も正しく設定されていることを確認し、declare variable $feedステートメントから「atom:」を削除してみてください。

print ステートメント (おそらくデバッグ用) については、おそらく使用しているデータベースのベンダーに固有のものです。まだ BaseX を使用している場合は、コマンド ラインからこのクエリを実行し、出力に「-v」を追加します。そのコードをもう一度見てみると、なぜlet $parent_entry...代わりにdeclare variable $parent_entry....

xquery は面倒ですね。

-tjw

于 2010-09-24T02:22:05.587 に答える