2017-09-13 7 views
3

Xqueryを使用して書籍IDとともに<xref>データのみを抽出しようとしています(これは初めてです)。ここでXQueryを使用して特定のXMLレコードを抽出し、コンマ区切りの形式で出力するにはどうすればよいですか?

は、入力データである:

出力フォーマット期待
<book id="6636551"> 
    <master_information> 
     <book_xref> 
      <xref type="Fiction" type_id="1">72771KAM3</xref> 
      <xref type="Non_Fiction" type_id="2">US72771KAM36</xref> 
     </book_xref> 
    </master_information> 
    <book_details> 
     <price>24.95</price> 
     <publish_date>2000-10-01</publish_date> 
     <description>An in-depth look at creating applications with XML.</description> 
    </book_details> 
    </book> 
    <book id="119818569"> 
    <master_information> 
     <book_xref> 
      <xref type="Fiction" type_id="1">070185UL5</xref> 
      <xref type="Non_Fiction" type_id="2">US070185UL50</xref> 
     </book_xref> 
    </master_information> 
    <book_details> 
     <price>19.25</price> 
     <publish_date>2002-11-01</publish_date> 
     <description>A former architect battles corporate zombies, 
    an evil sorceress, and her own childhood to become queen 
    of the world.</description> 
    </book_details> 
    </book> 
    <book id="119818568"> 
    <master_information> 
     <book_xref> 
      <xref type="Fiction" type_id="1">070185UK7</xref> 
      <xref type="Non_Fiction" type_id="2">US070185UK77</xref> 
     </book_xref> 
    </master_information> 
    <book_details> 
     <price>5.95</price> 
     <publish_date>2004-05-01</publish_date> 
     <description>After the collapse of a nanotechnology 
    society in England, the young survivors lay the 
    foundation for a new society.</description> 
    </book_details> 
    </book> 
    <book id="119818567"> 
    <master_information> 
     <book_xref> 
      <xref type="Fiction" type_id="1">070185UJ0</xref> 
      <xref type="Non_Fiction" type_id="2">US070185UJ05</xref> 
     </book_xref> 
    </master_information> 
    <book_details> 
     <price>4.95</price> 
     <publish_date>2000-09-02</publish_date> 
     <description>When Carla meets Paul at an ornithology 
    conference, tempers fly as feathers get ruffled.</description> 
    </book_details> 
    </book> 


:私はフォーマット1のために使用してい

<book id="6636551"> 
    <master_information> 
     <book_xref> 
      <xref type="Fiction" type_id="1">72771KAM3</xref> 
      <xref type="Non_Fiction" type_id="2">US72771KAM36</xref> 
     </book_xref> 
    </master_information> 
    </book> 

は、XQuery:

for$x in //book_xref/xref 
    return $x 

foの質問rmat 1:ブックIDを別に入力しようとしましたが、これは出力に含まれていますが、上記のフォーマットと一致しません。どのようにフォーマットごとの出力でブックIDを取得するのですか?フォーマット2のための

book_id, xref_type, xref_type_id, xref 
    6636551, Fiction, 1, 72771KAM3 
    6636551, Non_Fiction, 2, US72771KAM36 
    119818569, Fiction, 1, 070185UL5 
    119818569, Non_Fiction, 2, US070185UL50 
    etc. 

は質問:どのように私は、XQueryを通じて、カンマ区切り形式で出力を得ることができますか?出力フォーマットを(カンマ区切り)期待


そのためにXSLTに固執する必要がありますか?

ご回答いただきありがとうございます。

+0

'book_xref/xref'は' xref'要素を選択します。もし 'book'要素が必要ならば、それらを選択する必要があります。 '// book [.// book_xref/xref]'となります。 –

+0

@MartinHonnenは応答してくれてありがとう。私がそれを行うなら、私は省略しなければならない ''ノードをまだ示しています。私は単に、の中にいくつの他のノードが存在するかにかかわらず、書籍番号とともに「」データを、「」の外側に入れたいだけです。私の質問が理にかなってほしい! – Fenil

+2

CSV用。 '// book // book_xref/xref/string-join((ancestor :: book/@ id、@type、@type_id、。)、 '、')'となります。 –

答えて

2

CSVについて、あなたはレコードデータを持つ文字列の順序を与えるだろう

//book//book_xref/xref/string-join((ancestor::book/@id, @type, @type_id, .), ',') 

を使用することができますこれら4つの値のためstring-joinすなわちを使用することができます。 xref子孫とbook要素を再構成し、master_informationなどを追加する変換/ XML抽出用

string-join(('book_id,xref_type,xref_type_id,xref', //book//book_xref/xref/string-join((ancestor::book/@id, @type, @type_id, .), ',')), '&#10;') 

:あなたは、ヘッダーラインと単一の文字列と、それらのデータ線を望む場合は、別の文字列ジョインを使用することができ

//book[.//book_xref/xref]/<book id="{@id}">{master_information}</book> 
+0

変換/ XML抽出のコード実行では、RAMが16GBの場合でもメインメモリが不足します。そのクエリでは、パフォーマンスチューニングは可能ですか? – Fenil

+0

どのXQuery実装を使用するのですか。どのようにクエリを実行しますか?また、16 GBのRAMでメモリ不足が発生した場合、入力XMLドキュメントのサイズはどのくらいですか? XQueryプロセッサに使用可能なRAMを与えてもよろしいですか?たとえば、Javaプログラムを実行すると、デフォルトでは使用可能なメモリがすべて割り当てられず、ヒープスペースを増減するための 'java.exe 'オプションが使用されます。 XQueryの実装に固有の新しい質問とXML入力サイズの必要な詳細を尋ねるほうが良いかもしれません。 –

+0

Windows 7 ProのBaseX GUIに16 MBのRAMを搭載した512 MBのXMLファイルをロードしています。私は、クエリウィンドウでクエリを実行します。 BaseXが使用可能なRAMを提供しているかどうかを確認する方法がわかりません。それをどうやって確認できますか?これにもっと詳細が必要な場合は、これについて新しい質問を作成することができます。 – Fenil

2

XQueryはソースが単一のXML文書やファイルシステム上またはXMLデータベースに格納されたXML文書の集合であるかどうか、あなたのXMLデータからCSVファイルを生成するための素晴らしい方法です。 XQueryにはさまざまなアプローチがあります。 XQuery 3.1の配列構造と直列化機能を使用してデータを行とセルに集める場合は、https://github.com/CliffordAnderson/XQuery4Humanists/blob/master/05-Generating-JSON-and-CSV.mdのチュートリアルを参照してください。

関連する問題