以下のデータ構造について考慮してください。構造から生成される XML には、訂正可能な幾つかの問題が含まれています。
01 CDR-LIFE-BASE-VALUES-BOX.
15 CDR-LIFE-BASE-VAL-DATE PIC X(08).
15 CDR-LIFE-BASE-VALUE-LINE OCCURS 2 TIMES.
20 CDR-LIFE-BASE-DESC.
25 CDR-LIFE-BASE-DESC1 PIC X(15).
25 FILLER PIC X(01).
25 CDR-LIFE-BASE-LIT PIC X(08).
25 CDR-LIFE-BASE-DTE PIC X(08).
20 CDR-LIFE-BASE-PRICE.
25 CDR-LIFE-BP-SPACE PIC X(02).
25 CDR-LIFE-BP-DASH PIC X(02).
25 CDR-LIFE-BP-SPACE1 PIC X(02).
20 CDR-LIFE-BASE-PRICE-ED REDEFINES
CDR-LIFE-BASE-PRICE PIC $$$.$$.
20 CDR-LIFE-BASE-QTY.
25 CDR-LIFE-QTY-SPACE PIC X(08).
25 CDR-LIFE-QTY-DASH PIC X(02).
25 CDR-LIFE-QTY-SPACE1 PIC X(02).
25 FILLER PIC X(02).
20 CDR-LIFE-BASE-QTY-ED REDEFINES
CDR-LIFE-BASE-QTY PIC ZZ,ZZZ,ZZZ.ZZZ.
20 CDR-LIFE-BASE-VALUE PIC X(15).
20 CDR-LIFE-BASE-VALUE-ED REDEFINES
CDR-LIFE-BASE-VALUE
PIC $(4),$$$,$$9.99.
15 CDR-LIFE-BASE-TOT-VALUE-LINE.
20 CDR-LIFE-BASE-TOT-VALUE PIC X(15).
このデータ構造に幾つかのサンプル値を取り込み、XML をそれから直接生成し、その後プログラム Pretty (例: XML の生成に示されています) を使用してフォーマット設定すると、結果は次のようになります。
<CDR-LIFE-BASE-VALUES-BOX>
<CDR-LIFE-BASE-VAL-DATE>01/02/03</CDR-LIFE-BASE-VAL-DATE>
<CDR-LIFE-BASE-VALUE-LINE>
<CDR-LIFE-BASE-DESC>
<CDR-LIFE-BASE-DESC1>First</CDR-LIFE-BASE-DESC1>
<CDR-LIFE-BASE-LIT> </CDR-LIFE-BASE-LIT>
<CDR-LIFE-BASE-DTE>01/01/01</CDR-LIFE-BASE-DTE>
</CDR-LIFE-BASE-DESC>
<CDR-LIFE-BASE-PRICE>
<CDR-LIFE-BP-SPACE>$2</CDR-LIFE-BP-SPACE>
<CDR-LIFE-BP-DASH>3.</CDR-LIFE-BP-DASH>
<CDR-LIFE-BP-SPACE1>00</CDR-LIFE-BP-SPACE1>
</CDR-LIFE-BASE-PRICE>
<CDR-LIFE-BASE-QTY>
<CDR-LIFE-QTY-SPACE> 1</CDR-LIFE-QTY-SPACE>
<CDR-LIFE-QTY-DASH>23</CDR-LIFE-QTY-DASH>
<CDR-LIFE-QTY-SPACE1>.0</CDR-LIFE-QTY-SPACE1>
</CDR-LIFE-BASE-QTY>
<CDR-LIFE-BASE-VALUE> $765.00</CDR-LIFE-BASE-VALUE>
</CDR-LIFE-BASE-VALUE-LINE>
<CDR-LIFE-BASE-VALUE-LINE>
<CDR-LIFE-BASE-DESC>
<CDR-LIFE-BASE-DESC1>Second</CDR-LIFE-BASE-DESC1>
<CDR-LIFE-BASE-LIT> </CDR-LIFE-BASE-LIT>
<CDR-LIFE-BASE-DTE>02/02/02</CDR-LIFE-BASE-DTE>
</CDR-LIFE-BASE-DESC>
<CDR-LIFE-BASE-PRICE>
<CDR-LIFE-BP-SPACE>$3</CDR-LIFE-BP-SPACE>
<CDR-LIFE-BP-DASH>4.</CDR-LIFE-BP-DASH>
<CDR-LIFE-BP-SPACE1>00</CDR-LIFE-BP-SPACE1>
</CDR-LIFE-BASE-PRICE>
<CDR-LIFE-BASE-QTY>
<CDR-LIFE-QTY-SPACE> 2</CDR-LIFE-QTY-SPACE>
<CDR-LIFE-QTY-DASH>34</CDR-LIFE-QTY-DASH>
<CDR-LIFE-QTY-SPACE1>.0</CDR-LIFE-QTY-SPACE1>
</CDR-LIFE-BASE-QTY>
<CDR-LIFE-BASE-VALUE> $654.00</CDR-LIFE-BASE-VALUE>
</CDR-LIFE-BASE-VALUE-LINE>
<CDR-LIFE-BASE-TOT-VALUE-LINE>
<CDR-LIFE-BASE-TOT-VALUE>Very high!</CDR-LIFE-BASE-TOT-VALUE>
</CDR-LIFE-BASE-TOT-VALUE-LINE>
</CDR-LIFE-BASE-VALUES-BOX>
生成されたこの XML には幾つかの問題があります。
XML 出力のこのような特性は、ストレージを次のように再定義することにより修正できます。
1 BaseValues redefines CDR-LIFE-BASE-VALUES-BOX. 2 BaseValueDate pic x(8). 2 BaseValueLine occurs 2 times. 3 Description pic x(15). 3 pic x(9). 3 BaseDate pic x(8). 3 BasePrice pic x(6) justified. 3 BaseQuantity pic x(14) justified. 3 BaseValue pic x(15) justified. 2 TotalValue pic x(15).
上記のデータ値の定義のセットから XML を生成してフォーマット設定した結果は、一層便利なものになっています。
<BaseValues>
<BaseValueDate>01/02/03</BaseValueDate>
<BaseValueLine>
<Description>First</Description>
<BaseDate>01/01/01</BaseDate>
<BasePrice>$23.00</BasePrice>
<BaseQuantity>123.000</BaseQuantity>
<BaseValue>$765.00</BaseValue>
</BaseValueLine>
<BaseValueLine>
<Description>Second</Description>
<BaseDate>02/02/02</BaseDate>
<BasePrice>$34.00</BasePrice>
<BaseQuantity>234.000</BaseQuantity>
<BaseValue>$654.00</BaseValue>
</BaseValueLine>
<TotalValue>Very high!</TotalValue>
</BaseValues>
上に示すように、元のデータ定義を直接再定義できます。一般に、元の定義は使用しますが、コンパイラーのテキスト操作機能を使用して、元の定義を適宜に変更する方がより安全です。その例を、以下の REPLACE コンパイラー指示ステートメントで示します。この REPLACE ステートメントは複雑に見えますが、元のデータ定義が変更されると、自己保持するという利点があります。
replace ==CDR-LIFE-BASE-VALUES-BOX== by
==BaseValues redefines CDR-LIFE-BASE-VALUES-BOX==
==CDR-LIFE-BASE-VAL-DATE== by ==BaseValueDate==
==CDR-LIFE-BASE-VALUE-LINE== by ==BaseValueLine==
==20 CDR-LIFE-BASE-DESC.== by ====
==CDR-LIFE-BASE-DESC1== by ==Description==
==CDR-LIFE-BASE-LIT== by ====
==CDR-LIFE-BASE-DTE== by ==BaseDate==
==20 CDR-LIFE-BASE-PRICE.== by ====
==25 CDR-LIFE-BP-SPACE PIC X(02).== by ====
==25 CDR-LIFE-BP-DASH PIC X(02).== by ====
==25 CDR-LIFE-BP-SPACE1 PIC X(02).== by ====
==CDR-LIFE-BASE-PRICE-ED== by ==BasePrice==
==REDEFINES CDR-LIFE-BASE-PRICE PIC $$$.$$.== by
==pic x(6) justified.==
==20 CDR-LIFE-BASE-QTY.
25 CDR-LIFE-QTY-SPACE PIC X(08).
25 CDR-LIFE-QTY-DASH PIC X(02).
25 CDR-LIFE-QTY-SPACE1 PIC X(02).
25 FILLER PIC X(02).== by ====
==CDR-LIFE-BASE-QTY-ED== by ==BaseQuantity==
==REDEFINES CDR-LIFE-BASE-QTY PIC ZZ,ZZZ,ZZZ.ZZZ.== by
==pic x(14) justified.==
==CDR-LIFE-BASE-VALUE-ED== by ==BaseValue==
==20 CDR-LIFE-BASE-VALUE PIC X(15).== by ====
==REDEFINES CDR-LIFE-BASE-VALUE PIC $(4),$$$,$$9.99.==
by ==pic x(15) justified.==
==CDR-LIFE-BASE-TOT-VALUE-LINE. 20== by ====
==CDR-LIFE-BASE-TOT-VALUE== by ==TotalValue==.
元の定義セットの 2 番目のインスタンスが後に続いているこの REPLACE ステートメントの結果は、上に示されているグループ 項目 BaseValues の推奨再定義と似ています。この REPLACE ステートメントは、不要な定義を除去し、保持すべき定義の変更を行うさまざまな 手法の例を示しています。それぞれの状況に適したいずれかの手法をご利用ください。
関連参照
XML GENERATE の操作
(「COBOL for Windows 言語解説書」)
REPLACE ステートメント
(「COBOL for Windows 言語解説書」)