2017-10-02 3 views
1

入力ファイル:XQueryを使用して複数の条件に基づいて特定のXMLレコードをコンマ区切り形式で抽出する方法は?

for $x in string-join(('book_id, xref_type, xref, country, desc, rating_agency, rating_type, rating', //book//global_information/ratings/rating[@type='Author Rating' and .=('A+','B++')]/string-join((ancestor::book/@id, ancestor::book//book_xref/xref/@type, ancestor::book//book_xref/xref, ancestor::book//country_info/country_code, ancestor::book//book_details/description, @agency, @type, .), ',')), '
') 
return $x 

期待出力は次のとおりです:

<?xml version="1.0" encoding="UTF-8"?> 
     <books> 
      <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> 
       <global_information> 
        <ratings> 
         <rating agency="ABC Agency" type="Author Rating">A++</rating> 
         <rating agency="DEF Agency" type="Author Rating">A+</rating> 
         <rating agency="DEF Agency" type="Book Rating">A</rating> 
        </ratings> 
       </global_information> 
       <country_info> 
        <country_code>US</country_code> 
       </country_info> 
      </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> 
       <global_information> 
        <ratings> 
         <rating agency="ABC Agency" type="Author Rating">A+</rating> 
         <rating agency="ABC Agency" type="Book Rating">A</rating> 
         <rating agency="DEF Agency" type="Author Rating">A</rating> 
         <rating agency="DEF Agency" type="Book Rating">B+</rating> 
        </ratings> 
       </global_information> 
       <country_info> 
        <country_code>CA</country_code> 
       </country_info> 
      </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> 
       <global_information> 
        <ratings> 
         <rating agency="ABC Agency" type="Author Rating">A+</rating> 
         <rating agency="ABC Agency" type="Book Rating">A+</rating> 
         <rating agency="DEF Agency" type="Author Rating">B++</rating> 
         <rating agency="DEF Agency" type="Book Rating">A+</rating> 
        </ratings> 
       </global_information> 
       <country_info> 
        <country_code>UK</country_code> 
       </country_info> 
      </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> 
       <global_information> 
        <ratings> 
         <rating agency="ABC Agency" type="Author Rating">B+</rating> 
         <rating agency="ABC Agency" type="Book Rating">A+</rating> 
         <rating agency="DEF Agency" type="Author Rating">B++</rating> 
         <rating agency="DEF Agency" type="Book Rating">A+</rating> 
        </ratings> 
       </global_information> 
       <country_info> 
        <country_code>US</country_code> 
       </country_info> 
      </book> 
     </books> 

私はCSV形式で特定のXMLレコードをフェッチするためにXQueryを書いた私がするbook_idsを期待

book_id, xref_type, xref, country, desc, rating_agency, rating_type, rating 
6636551,Fiction,72771KAM3,US,An in-depth look at creating applications with XML.,DEF Agency,Author Rating,A+ 
6636551,Non_Fiction,US72771KAM36,US,An in-depth look at creating applications with XML.,DEF Agency,Author Rating,A+ 
119818569,Fiction,070185UL5,CA,A former architect battles corporate zombies, an evil sorceress, and her own childhood to become queen of the world.,ABC Agency,Author Rating,A+ 
119818569,Non_Fiction,US070185UL50,CA,A former architect battles corporate zombies, an evil sorceress, and her own childhood to become queen of the world.,ABC Agency,Author Rating,A+ 
etc. 

私はxref_typeでフィルタリングしなかったので、それは別々の行の両方に表示されるはずですが、繰り返しません。次のように生成される出力は次のようになります。

book_id, xref_type, xref, country, desc, rating_agency, rating_type, rating 
6636551,Fiction,Non_Fiction,72771KAM3,US72771KAM36,US,An in-depth look at creating applications with XML.,DEF Agency,Author Rating,A+ 
119818569,Fiction,Non_Fiction,070185UL5,US070185UL50,CA,A former architect battles corporate zombies, an evil sorceress, and her own childhood to become queen of the world.,ABC Agency,Author Rating,A+ 

私はxref_typeでフィルタ

は=「フィクション」I外部参照/ @タイプと外部参照の両方でそれをしなければなりません。それは動作しますが、これを行うにはより良い方法がありますか?

  1. 私は「フィクション」と同じ与えられたbook_idため 別々の行に記載されている「ノンフィクション」の項目を持つことができる方法:

    基本的に、私の質問は、三つの小さな質問に分けることができますか?

  2. このコードの条件を記述するには、より良い方法がありますか?
  3. 特定の条件でデータが存在しない場合に空白値を出力する方法で条件を書き込むにはどうすればよいですか?これは自動的に行われますか?

ご協力いただきありがとうございます。 のXPathancestor::book//book_xref/xref/@typeが評価され、コンテキストは単一rating元素であり、結果はtype="..."属性の配列された時点で

答えて

1

。したがって、CSV行をアセンブルすると、祖先book要素のすべての種類の書籍参照は、の項目はの順になります)として扱われます。

各アイテムを別々のCSV行に分けたい場合は、例えば、次のようなシーケンスを反復的に反復処理する必要があります。 forループ。私はletを使用して変数にbookを結合して、すべてのxref秒を超えるループ:

string-join(
    (
    'book_id, xref_type, xref, country, desc, rating_agency, rating_type, rating', 
    for $rating in //book//global_information/ratings/rating[@type='Author Rating' and .=('A+','B++')] 
    let $book := $rating/ancestor::book 
    for $xref in $book//xref 
    return (
     string-join(
     (
      $book/@id, 
      $xref/@type, 
      $xref/text(), 
      $book//country_info/country_code, 
      $book//book_details/description/text(), 
      $rating/@agency, 
      $rating/@type, 
      $rating/text() 
     ), 
     ',' 
    ) 
    ) 
), 
    '&#10;' 
) 

あなたは(時には少し厄介なことができる)、後方の軸を避けたい場合は、book初を反復処理することができ、 ratingに興味があります:

string-join(
    (
    'book_id, xref_type, xref, country, desc, rating_agency, rating_type, rating', 
    for $book in //book 
    for $rating in $book/global_information/ratings/rating[@type='Author Rating' and .=('A+','B++')] 
    for $xref in $book//xref 
    [...] 
+1

これはかなり意味があります。これはカッコいい!私はここで質問をするたびにもう少し学びます。どうもありがとう!本当にその説明を感謝します。おそらくダムのフォローアップの質問ですが、どのように国の値をフィルタリングできますか? '$ book // country_info/country_code [data [。= 'US'、 'UK']]'のように書いたが、それはうまくいかなかった。私はあまりにも "データ"なしで試みた。要素のデータを直接フィルタリングする正しい方法は何ですか? – Fenil

+1

あなたの最初の試みにはいくつかの問題があります。まず、 '$ foo [x = $ bar、$ baz]'と書くと、 'x = $ bar'と' $ baz'という2つの部分からなるシーケンスを作成します。シーケンスの要素にマッチさせたい場合、そのシーケンスを '$ foo [x =($ bar、$ baz)]'という括弧で構築する必要があります。第二に、 'data'はXQueryのキーワードではありません。おそらく、コンテキスト値の* atomized *(つまりXML以外の)内容を返す関数 'data()'を意味していました。ですから、1つの解決策は '$ book // country_info/country_code [data()[。=( 'US'、 'UK')]]'でしょう。 –

+0

それは理にかなっています。 $ book // country_info/country_code [data()[。=( 'US'、 'UK')]]英国や米国以外の国の値をすべて削除します。英国または米国のみに関連するレコードを格納する。あなたはどうしますか? 私は$ book1と同じように新しい$ book1を作成することでこれを試みましたが、国別コードのフィルタを含めることはできましたが、両方の国コードを別々の行に出力していました。値を追加しています! – Fenil

関連する問題