2016-04-08 4 views
3

私はMarkLogicデータベースにロードされ、次のXML文書を持っている:MarkLogic:XML文書から値を取得するXQuery?

<x:books xmlns:x="urn:books"> 
    <book id="bk001"> 
    <author>Writer</author> 
    <title>The First Book</title> 
    <genre>Fiction</genre> 
    <price>44.95</price> 
    <pub_date>2000-10-01</pub_date> 
    <review>An amazing story of nothing.</review> 
    </book> 
    <book id="bk002"> 
    <author>Poet</author> 
    <title>The Poet's First Poem</title> 
    <genre>Poem</genre> 
    <price>24.95</price> 
    <review>Least poetic poems.</review> 
    </book> 
</x:books> 

私は、XQueryに新しいです。 SQLデータベースから値を取得する際に、XML文書から値を取得するにはどうすればよいでしょうか?

出力:

BookID | Author | Title | Genre | price | pub_date | review 
bk001 | Writer | The First Book | Fiction | 44.95 | 2000-10-01 
bk002 | Poet | The Poet's First Poem | Poem | 24.95 | Least poetic poems. 

注:区切りのパイプが、いくつかのコレクション・リストは必要ありません。

いくつかのリンクを共有したり、このXQueryを書く手助けができますか?私はこれに新しいです。

+0

異なる項目(本)は、通常は別々の文書であるべきです。書籍のルートとその下の書籍要素が多い文書をお持ちの場合、検索と索引付けの機能はうまく機能しません。 [MarkLogicデータモデリングガイドライン](http://developer.marklogic.com/learn/data-modeling)は役に立つ読書です。 –

答えて

4

XQueryのシーケンス構成には複数の値が格納されますが、階層構造ではありません。シーケンスのシーケンスを作成すると、それらをまとめて1つの大きなシーケンスにまとめます。

これはすべての子要素と属性値をシーケンスに取り込みますが、前述のシーケンスのプロパティのために、2番目のブックの最初の値を取得する方法はありません。あなたはそれが7番目のアイテムであることを知る必要があります。そして、3番目の本の最初の値は14項目となり、そのためにいること:

string-join($books/book[1]/(*|@*)/node-name() ! string(), ' | '), (: Create header row :) 
for $book in $books/book 
return string-join($book/(*|@*)/string(), ' | ') 
+0

私の答えを見つけてください。しかし、私は一列に値を取得している、私はそれを結合することができますIDを疑問に思う。私は文字列結合がどのように機能するかを知ることができませんでした。あなたはそれを修正するためにコードを修正するのを助けてくれますか? – happybayes

+0

あなたの質問にそのXMLサンプルをどのように指定したのかが指定されていないので、 '$ books'をプレースホルダとして使用しました。それがデータベースにどのように格納されているかを反映するために、更新する必要があります。あなたのコメントからあなたが参加していることを私にはっきりさせません。 – wst

+1

$ booksが正しく設定されていれば、@ wstの答えはMarkLogicで動作します。具体的には、変数 '$ books:= fn:doc(" bookstore.xml ")/ bookstore'を宣言してください –

1

@wst:

$books/book/(*|@*)/string() 

ちょうどあなたがパイプ区切りのリストを達成する方法を示すためにありがとうそんなに。何らかの理由で私はmarklogicで同じことを実行できませんでした。一般的なXML XQueryで動作するかもしれません。しかし、私は次の解決策を見つけました。

for $x at $i in doc("bookstore.xml")/bookstore/book 
return data($x) 
関連する問題