6

MarkLogic を使用していますが、これはおそらく一般的な XQuery の質問です。

私は持っている:

<library>
  <books>
    <book title="whatever">
      <publisher>Random</publisher>
      ....more children
    </book>
    <book title="another">
      <publisher>Simon</publisher>
      ....more children
    </book>
    ...
  </books>
</library>

すべての [book] 要素とそのタイトル属性を返したいのですが、[publisher] などの book の子は必要ありません。オーソドックスでパフォーマンスの高い方法でこれを達成するにはどうすればよいですか?

関連する質問:一部の子を取得したい場合がありますが、他の子は取得したくない場合があります。たとえば、すべての書籍要素とその出版社の子要素を取得しますが、他の子は取得しません。

ありがとう。

4

4 に答える 4

5

XQuery (実際には、XQuery のサブセットである XPath) は、/library/books/book技術的には必要なことを行います。一連の book 要素を返すだけで、他には何も返しません。一部の API は book 要素への参照を返し、タイトルの表示など、それらで何をしたいかを決定する必要があります。ただし、多くのツールと API は、これらの本の要素を本をルートとするサブツリー全体と一緒にコピーします。データベースの場合、これはサーバーからクライアントにネットワークを介して送信される結果であることが非常に多いです。この場合、既存の book 要素を選択するのではなく、book 要素の情報のサブセットを含む新しいドキュメントを作成する必要があります。これを行うには、XQuery で要素コンストラクターを使用できます。

for $b in /library/books/book
return <book title="{$b/@title}"/>
于 2011-10-21T23:13:11.867 に答える
2

おそらくもっと簡単な方法があります...しかし、このようなものは、他の子なしで属性をコピーすると思います。警告: コードはテストされていません

for $i in doc()//book
return <book>{
    for $a in $i/@*
    return $a
}</book>
于 2011-10-21T19:18:54.123 に答える
1

Michael Kay の解決策としては、必要な各属性を列挙するのではなく、もう少し一般的なものにする方がよいと思います。注意すべきことは/@、テキストだけでなく属性を返すことです。

例えば:

for $book in /library/books/book return <book>{$book/@*}</book>

またはさらに一般的に:

for $book in /library/books/book return element book {$book/@*}
于 2011-11-21T23:56:45.520 に答える
0

以下のリンクで XQuery select 構文を確認してください。通常、select 構文を使用すると、関心のあるデータ要素を取得し、必要に応じてフォーマットし、気にしないものを省略することができます。

http://www.w3schools.com/xquery/xquery_select.asp

于 2011-10-21T18:41:31.337 に答える