COUNT IN 句

IDENTIFIED BY および IS ATTRIBUTE 句」セクションで示したように、出現回数が特定されない既知のタグまたは不明なタグにも、XML 用に拡張された各種の動詞を通じて対処することが可能です。一方、それほど複雑ではなく、出現回数があらかじめ分かっている場合には、非常に簡単な構文拡張で直接割り当てを行うことができます。

出現回数が分かっているタグまたは属性には、OCCURS 句および COUNT IN 句を使用します。OCCURS 句では、タグまたは属性の出現回数の許容上限を指定します。COUNT IN 句では、受信回数を特定したり、送信回数を指定したりできます。

COUNT IN 句の例を次に示します。

OCCURS 句および COUNT IN 句の使用

0010  $set preprocess(prexml) warn endp
0020  $set sourceformat(free) case  
0030
0040  select library-file
0050        assign address of mybuf
0060        organization  is xml
0070        document-type is "library.xsd" 
0080        file status is library-status.
0090
0100  data division. 
0110
0120  xd library-file.
0130  01  library            identified by "library".
0140    05  book             identified by "book" 
0150                           occurs 10 times 
0160                           count in library-book-count.
0170        10  book-title  pic x(80) identified by "title".
0180        10  book-author pic x(80) identified by "author".
0190        10  book-toc              identified by "toc".
0200            15  book-toc-section  occurs 20 times
0210                              count in book-section-count
0220                              identified by "section"
0230                              pic x(20).
0240
0250  working-storage section.
0260  01  library-status  pic s999.
0270  01  mybuf.
0280      10  pic x(150) value
0290     '<library>'
0300     & '<book><title>book1</title>'
0310     &'       <toc><section>b1section1</section>'
0320     & '           <section>b1section2</section>'
0330     & '</toc></book>'.
0340      10 pic x(150) value
0350       '<book><title>book2</title>'
0360     & '      <toc><section>b2section1</section>'
0370     & '           <section>b2section2</section>'
0380     & '</toc></book>'
0390     & '</library>'. 
0400
0410  open input library-file
0420  read library-file
0430  perform until library-book-count = 0
0440    display 
0450     "Book title = '" book-title(library-book-count) "'"
0460    display "Number of Sects = " 
0470     book-section-count(library-book-count)
0480     subtract 1 from library-book-count
0490  end-perform
0500  close library-file
0510  stop run.

0040 から 0080 行目:

0040  select library-file
0050        assign address of mybuf
0060        organization  is xml
0070        document-type is "library.xsd" 
0080        file status is library-status.

XML 入力のソースとしてファイル名およびバッファー (mybuf) を割り当て、ファイル編成 (XML)、XML スキーマ名を指定するファイル名 (library.xsd)、およびファイル状態を示すデータ名を指定しています。

0120 から 0230 行目:

0120  xd library-file.
0130  01  library            identified by "library".
0140    05  book             identified by "book" 
0150                           occurs 10 times 
0160                           count in library-book-count.
0170        10  book-title  pic x(80) identified by "title".
0180        10  book-author pic x(80) identified by "author".
0190        10  book-toc              identified by "toc".
0200            15  book-toc-section  occurs 20 times
0210                              count in book-section-count
0220                              identified by "section"
0230                              pic x(20).

バッファー領域のレコード構造を設定しています。OCCURS および COUNT-IN の使用法に注目してください。この例では、データ名 book は XML タグ <book> で識別され、出現回数は 10 回、暗黙的に定義されている library-book-count フィールドで出現がカウントされます。book-toc-section データ項目も同様に定義されており、暗黙的に定義されている book-section-count でカウントされます。

0270 から 0390 行目:

0270  01  mybuf.
0280      10  pic x(150) value
0290     '<library>'
0300     & '<book><title>book1</title>'
0310     &'       <toc><section>b1section1</section>'
0320     & '           <section>b1section2</section>'
0330     & '</toc></book>'.
0340      10 pic x(150) value
0350       '<book><title>book2</title>'
0360     & '      <toc><section>b2section1</section>'
0370     & '           <section>b2section2</section>'
0380     & '</toc></book>'
0390     & '</library>'. 

静的バッファーに読み取る XML ストリームを指定しています。このプログラムでは XML ストリームをコード内で指定していますが、標準入力を使用して XML をバッファー (mybuf) に格納することもできます。

0430 から 0490 行目:

0430  perform until library-book-count = 0
0440    display 
0450     "Book title = '" book-title(library-book-count) "'"
0460    display "Number of Sects = " 
0470     book-section-count(library-book-count)
0480     subtract 1 from library-book-count
0490  end-perform

すべてのレコードにわたってループし、レコード内に含まれるすべての書籍のタイトルおよびセクション数をレコードごとに表示します。book-section-count の指標として library-book-count を使用している点に注意してください。

COUNT IN 句は、要素定義に関連するタグが XML ストリームに含まれているかどうかを判定する手段としても非常に役立ちます。たとえば、一連の XD レコードのうち、READ 文の実行中に読み取られるレコードを特定する手段として、きわめて一般的に使用されます。次に例を示します。

COUNT IN による読み取りレコードの特定

0010  select book-or-author-file
0020        assign address of mybuf
0030        organization  is xml
0040        document-type is "bookdb.xsd" 
0050        file status is xml-bookdb-status. 
0060
0070  data division.
0080  xd book-or-author-file.
0090  01  book-rec        identified by "book"
0100                      count in book-count.
0110      05  price-val   pic 999.99 identified by "price" 
0120                       is attribute
0130                       count in price-count.
0140      05  title-val   pic x(80) identified by "title".
0150 
0160  01  author-rec      identified by "author" 
0170                       count in author-count.
0180      05  author-val  pic x(80).
0190 
0200  working-storage section.
0210  01  xml-bookdb-status  pic s999.
0220  01  mybuf  pic x(256) value
0230     '<book price="123.00"><title>A title</title></book>'.
0240 
0250  procedure division.
0260     open input book-or-author-file
0270     read book-or-author-file
0280     evaluate true
0290     when book-count = 1
0300         if  price-count not = 0
0310             display "got <book price=" price-val ">
0320               <title>" title-val "</title></book>"
0330         else 
0340             display "got <book><title>" title-val 
0350               "</title></book>"
0360         end-if
0370     when author-count = 1
0380         display "got <author>" author-val "</author>"
0390     end-evaluate
0400     close book-or-author-file
0410     stop run.

0010 から 0050 行目:

0010  select book-or-author-file
0020        assign address of mybuf
0030        organization  is xml
0040        document-type is "bookdb.xsd" 
0050        file status is xml-bookdb-status. 

XML 入力のソースとしてファイル名およびバッファー (mybuf) を割り当て、ファイル編成 (XML)、XML スキーマ名を指定するファイル名 (bookdb.xsd)、およびファイル状態を示すデータ名を指定しています。

0080 から 0180 行目:

0080  xd book-or-author-file.
0090  01  book-rec        identified by "book"
0100                      count in book-count.
0110      05  price-val   pic 999.99 identified by "price" 
0120                       is attribute
0130                       count in price-count.
0140      05  title-val   pic x(80) identified by "title".
0150 
0160  01  author-rec      identified by "author" 
0170                       count in author-count.
0180      05  author-val  pic x(80).

01 レベルの項目を 2 つ定義しています。1 つは書籍レコード (book-rec)、もう 1 つは著作者レコード (author-rec) です。COUNT IN で定義した情報は、読み取られているレコードを特定する場合に使用します。

0220 から 0230 行目:

0220  01  mybuf  pic x(256) value
0230     '<book price="123.00"><title>A title</title></book>'.

静的バッファーに読み取る XML ストリームを指定しています。このプログラムでは XML ストリームをコード内で指定していますが、標準入力を使用して XML をバッファー (mybuf) に格納することもできます。

0260 から 0390 行目:

0260     open input book-or-author-file
0270     read book-or-author-file
0280     evaluate true
0290     when book-count = 1
0300         if  price-count not = 0
0310             display "got <book price=" price-val ">
0320               <title>" title-val "</title></book>"
0330         else 
0340             display "got <book><title>" title-val 
0350               "</title></book>"
0360         end-if
0370     when author-count = 1
0380         display "got <author>" author-val "</author>"
0390     end-evaluate

EVALUATE 句によって、book-count または author-count の値を基に、読み取られているレコードが特定されます。