前のページ|次のページ

生成された数値キーを含むキーフィールドを挿入する

次の例では、階層データを含んでいるXMLドキュメントPharmacy.XMLをインポートします。同ドキュメントは、階層データを関連データセットとしてインポートするで使われているものと同じです。この例では、前と同じXMLMapファイルを引き続き使用しますが、生成された数値をキー値として含むキーフィールドを追加することにより、2つのデータセット間の関係を提供しています(キーフィールドは、レコードを識別するための一意のデータを保持します。典型的なキーフィールドの例としては、アカウント番号、製品コード、顧客名などが挙げられます)。
キーフィールド値を生成するには、COLUMN要素内でclass="ORDINAL"属性を使用することにより、カウンタ変数を作成します。カウンタ変数は、INCREMENT-PATH要素により指定される場所パスが検出される回数を記録します。カウンタ変数の値は、この場所パスが一致するたびに1ずつインクリメントされます(このカウンタ変数は、DATAステップの自動変数_N_に似ています。DATAステップにおいて、自動変数_N_は、SASデータセットに読み込まれるオブザベーションの数をカウントします)。
注: カウンタ変数を使用して関連する2つのデータセット用のキーフィールドを作成する場合、両方のTABLE要素に対して同じ場所パスを指定する必要があります。これを行わない場合、結果が一致しなくなります。各表は、同じ名前のデータ要素に関して、同一の生成されたキーを持つ必要があります。
次のXMLMapは、ドキュメントPharmacy.XMLを、関連した情報を含む2つのSASデータとしてインポートします。また、生成された数値をキー値として含むキーフィールドを作成します。
<?xml version="1.0" encoding="UTF-8"?>
<!-- ############################################################ -->
<!-- 2011-01-10T14:39:38 -->
<!-- SAS XML Libname Engine Map -->
<!-- Generated by XML Mapper, 903000.1.0.20101208190000_v930 -->
<!-- ############################################################ -->
<!-- ###  Validation report                                   ### -->
<!-- ############################################################ -->
<!-- XMLMap validation completed successfully. -->
<!-- ############################################################ -->
<SXLEMAP name="AUTO_GEN" version="2.1">

    <NAMESPACES count="0"/>

    <!-- ############################################################ -->
    <TABLE description="PERSON" name="PERSON">
        <TABLE-PATH syntax="XPath">/PHARMACY/PERSON</TABLE-PATH> 1

     <COLUMN name="KEY" retain="YES" class="ORDINAL"> 2
         <INCREMENT-PATH
syntax="XPath">/PHARMACY/PERSON</INCREMENT-PATH>
      <TYPE>numeric</TYPE>
      <DATATYPE>integer</DATATYPE>
      <FORMAT width="3">Z</FORMAT>
      </COLUMN>

        <COLUMN name="NAME">
            <PATH syntax="XPath">/PHARMACY/PERSON/NAME</PATH>
            <TYPE>character</TYPE>
            <DATATYPE>string</DATATYPE>
            <LENGTH>11</LENGTH>
        </COLUMN>

        <COLUMN name="STREET">
            <PATH syntax="XPath">/PHARMACY/PERSON/STREET</PATH>
            <TYPE>character</TYPE>
            <DATATYPE>string</DATATYPE>
            <LENGTH>18</LENGTH>
        </COLUMN>

        <COLUMN name="CITY">
            <PATH syntax="XPath">/PHARMACY/PERSON/CITY</PATH>
            <TYPE>character</TYPE>
            <DATATYPE>string</DATATYPE>
            <LENGTH>6</LENGTH>
        </COLUMN>

    </TABLE>

    <!-- ############################################################ -->
    <TABLE description="PRESCRIPTION" name="PRESCRIPTION">
        <TABLE-PATH syntax="XPath">/PHARMACY/PERSON/PRESCRIPTION</TABLE-PATH> 3

       <COLUMN name="KEY" retain="YES" class="ORDINAL"> 4
          <INCREMENT-PATH syntax="XPath">/PHARMACY/PERSON</INCREMENT-PATH>
          <TYPE>numeric</TYPE>
          <DATATYPE>integer</DATATYPE>
          <FORMAT width="3">Z</FORMAT>
       </COLUMN>

       <COLUMN name="NUMBER">
            <PATH syntax="XPath">/PHARMACY/PERSON/PRESCRIPTION/NUMBER</PATH>
            <TYPE>numeric</TYPE>
            <DATATYPE>integer</DATATYPE>
        </COLUMN>

        <COLUMN name="DRUG">
            <PATH syntax="XPath">/PHARMACY/PERSON/PRESCRIPTION/DRUG</PATH>
            <TYPE>character</TYPE>
            <DATATYPE>string</DATATYPE>
            <LENGTH>12</LENGTH>
        </COLUMN>

    </TABLE>

</SXLEMAP>
キーフィールドを生成するXMLMap構文の説明を次に示します。
1 Personデータセットを定義するTABLE要素内で、TABLE-PATH要素は、同データセットのオブザベーション境界を指定します。この場所パスは、PERSON要素が読み込まれるたびに新しいオブザベーションを生成します。
2 Personデータセットの場合、変数KeyのCOLUMN要素は、class="ORDINAL"属性と、INCREMENT-PATH要素を含んでいます。XML Engineは次の手順に従って、Personデータセットのキーフィールド値を生成します。
  1. XML Engineは、開始タグ<PERSON>を検出すると、その値を入力バッファに読み込んだ後、変数Keyの値を1だけインクリメントします。
  2. XML Engineは、終了タグ</PERSON>を検出するまで、値を入力バッファに読み込み続けます。同終了タグを検出した時点で、XML Engineは、完了した入力バッファを1つのオブザベーションとしてSASデータセットに書き出します。
  3. 開始タグ<PERSON> (INCREMENT-PATH内にあるもの)と終了タグ</PERSON> (TABLE-PATH内にあるもの)のシーケンスを検出するたびに、この処理が繰り返されます。
  4. この結果、4つの変数と2つのオブザベーションが生成されます。
3 Prescriptionデータセットを定義するTABLE要素内で、TABLE-PATH要素は同データセットのオブザベーション境界を指定します。この場所パスは、PRESCRIPTION要素が読み込まれるたびに新しいオブザベーションを生成します。
4 Prescriptionデータセットの場合、変数KeyのCOLUMN要素は、class="ORDINAL"属性と、INCREMENT-PATH要素を含んでいます。
XML Engineは次の手順に従って、Prescriptionデータセットのキーフィールド値を生成します。
  1. XML Engineは、開始タグ<PERSON>を検出すると、その値を入力バッファに読み込んだ後、変数Keyの値を1だけインクリメントします。
  2. XML Engineは、終了タグ</PRESCRIPTION>を検出するまで、値を入力バッファに読み込み続けます。同終了タグを検出した時点で、XML Engineは、完了した入力バッファを1つのオブザベーションとしてSASデータセットに書き出します。カウンタ変数の場所パスは両TABLE要素で同一でなければならないため、Prescriptionデータセットの変数Keyに関するXML Engineの動作は、Personデータセットの変数Keyの場合と同じになります。XML EngineはPERSONタグのオカレンスを両方のカウンタ変数のキー値として記録しますが、オブザベーションは異なるTABLE-PATHの場所パスにより生成されます。
  3. 開始タグ<PERSON> (INCREMENT-PATH内にあるもの)と終了タグ</PRESCRIPTION> (TABLE-PATH内にあるもの)のシーケンスを検出するたびに、この処理が繰り返されます。
  4. この結果、3つの変数と3つのオブザベーションが生成されます。
次のSASステートメントは、XMLドキュメントをインポートします。
filename pharm 'C:\My Documents\XML\Pharmacy.xml';
filename map 'C:\My Documents\XML\PharmacyOrdinal.map';

libname pharm xmlv2 xmlmap=map;
数値キーを含むインポートされた2つのSASデータセットのPRINTプロシジャ出力は次のようになります。
PHARM.PERSONのPRINTプロシジャ出力
PHARM.PERSONのPRINTプロシジャ出力
PHARM.PRESCRIPTIONのPRINTプロシジャ出力
PHARM.PRESCRIPTIONのPRINTプロシジャ出力
前のページ|次のページ|ページの先頭へ