COBOL2002 使用の手引 手引編


25.6.2 HTML拡張言語の文法

HTMLテンプレートに埋め込むHTML拡張言語の文法について説明します。

〈この項の構成〉

(1) $%変数名%$

形式
$%変数名%$
機能

COBOL主プログラムから渡されたCGIリストの先頭から変数名と一致する「名前」を検索し,「名前」に対応する「値」と置換します。

構文規則

変数名は,以下の条件を満たす必要があります。

  • 先頭の文字が英字である

  • 2文字目以降が,英数字(A〜Z,a〜z,0〜9),ハイフン(−),下線(_)のどれかで構成されている

  • 長さが28バイト以下である

使用例

CGIリストの「名前」が"ITEM"の項目の「値」を表示する例です。なお,この使用例は,HTMLトランスレータを使用するCGIプログラムの作成例です。

HTMLテンプレート(CGISUB.htm)
<HTML>
<HEAD>
<TITLE>変数名</TITLE>
</HEAD>
<BODY>
Name : $%ITEM1%$
</BODY>
</HTML>
COBOL主プログラム(CGIMAIN.cbl)
       IDENTIFICATION DIVISION.
       PROGRAM-ID. CGIMAIN.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 NAMELIST USAGE ADDRESS VALUE NULL.
       01 NAMEX PIC X(28).
       01 VALUEX.
         02 VALUE-LEN PIC S9(9) USAGE COMP.
         02 VALUE-STRING.
           03 PIC X OCCURS 1024 DEPENDING ON VALUE-LEN.
       PROCEDURE DIVISION.
      *> CGIリスト作成
           CALL 'CBLCREATELIST' USING NAMELIST.
           MOVE 'ITEM1' TO NAMEX.
           COMPUTE VALUE-LEN = FUNCTION LENGTH('COBOL2002').
           MOVE 'COBOL2002' TO VALUE-STRING.
           CALL 'CBLADDPAIR' USING NAMELIST NAMEX VALUEX.
      *> COBOL副プログラムの呼び出し
           CALL 'CGISUB' USING NAMELIST.
      *> CGIリスト削除
           CALL 'CBLDESTROYLIST' USING NAMELIST.
           STOP RUN.
Webブラウザの出力例
Name:COBOL2002

(2) $%REPEAT%$文

形式
書き方1($%REPEAT%$文の間に$%変数名%$が一つだけある場合)
$%REPEAT%$
  $%変数名%$
$%END-REPEAT%$
書き方2($%REPEAT%$文の間に$%変数名%$が複数ある場合)
$%REPEAT%$
  $%変数名1%$
  $%変数名2%$
  :
$%END-REPEAT%$

機能

書き方1の機能

COBOL主プログラムから渡されたCGIリストの先頭から変数名と一致する「名前」を検索し,次の条件が満たされるまで「名前」に対応する「値」を繰り返し出力します。

  • CGIリストの終端まで検索する

  • 検索中に,CBLENDREPEATサービスルーチンでCGIリストに追加した終端インジケータ(REPEAT.TERMINATOR)が見つかる

書き方2の機能

まず,COBOL主プログラムから渡されたCGIリストの先頭から変数名1と一致する「名前」を検索し,その「値」を出力します。次に,変数名1を発見した位置以降から変数名2と一致する「名前」を検索し,その「値」を出力します。同様の作業を繰り返し,最後の変数名の検索が終わったら,また,最初の変数名1から検索を続けます。

このような作業を,次の条件が満たされるまで繰り返します。

  • CGIリストの終端まで検索する

  • 検索中に,CBLENDREPEATサービスルーチンでCGIリストに追加した終端インジケータ(REPEAT.TERMINATOR)が見つかる

(例)

CGIリストの内容

名前

ITEM1

DATA01

ITEM2

DATA02

ITEM1

DATA11

ITEM2

DATA12

HTMLテンプレート

  $%REPEAT%$
  $%ITEM1%$
  $%ITEM2%$
  $%END-REPEAT%$

表示される内容

  DATA01
  DATA02
  DATA11
  DATA12
構文規則
  • 変数名は,以下の条件を満たす必要があります。

    1. 先頭の文字が英字である

    2. 2文字目以降が,英数字(A〜Z,a〜z,0〜9),ハイフン(−),下線(_)のどれかで構成されている

    3. 長さが28バイト以下である

  • $%REPEAT%$〜$%END-REPEAT%$の間には,$%IF%$文を記述できません。

  • $%REPEAT%$文を入れ子にした場合,2階層までしか記述できません。

  • $%REPEAT%$〜$%END-REPEAT%$の間に$%変数名%$がない場合,$%REPEAT%$文はCOBOL副プログラムに変換されません。

使用例1

CGIリストの「名前」が"CITY"または"COLOR"である項目の「値」をすべて表示する例です。なお,この使用例は,HTMLトランスレータを使用するCGIプログラムの作成例です。

HTMLテンプレート(CGISUB.htm)
<HTML>
<HEAD>
<TITLE>REPEAT</TITLE>
</HEAD>
<BODY>
$%REPEAT%$
$%CITY%$ : $%COLOR%$ <BR>
$%END-REPEAT%$
</BODY>
</HTML>
COBOL主プログラム(CGIMAIN.cbl)
       IDENTIFICATION DIVISION.
       PROGRAM-ID. CGIMAIN.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 NAMELIST USAGE ADDRESS VALUE NULL.
       01 NAMEX PIC X(28).
       01 VALUEX.
         02 VALUE-LEN PIC S9(9) USAGE COMP.
         02 VALUE-STRING.
           03 PIC X OCCURS 1024 DEPENDING ON VALUE-LEN.
       PROCEDURE DIVISION.
      *> CGIリスト作成
           CALL 'CBLCREATELIST' USING NAMELIST.
           MOVE 'CITY' TO NAMEX.
           MOVE 5 TO VALUE-LEN.
           MOVE 'TOKYO' TO VALUE-STRING.
           CALL 'CBLADDPAIR' USING NAMELIST NAMEX VALUEX.
           MOVE 'COLOR' TO NAMEX.
           MOVE 4 TO VALUE-LEN.
           MOVE 'GRAY' TO VALUE-STRING.
           CALL 'CBLADDPAIR' USING NAMELIST NAMEX VALUEX.
           MOVE 'CITY' TO NAMEX.
           MOVE 7 TO VALUE-LEN.
           MOVE 'FUKUOKA' TO VALUE-STRING.
           CALL 'CBLADDPAIR' USING NAMELIST NAMEX VALUEX.
           MOVE 'COLOR' TO NAMEX.
           MOVE 3 TO VALUE-LEN.
           MOVE 'RED' TO VALUE-STRING.
           CALL 'CBLADDPAIR' USING NAMELIST NAMEX VALUEX.
      *> COBOL副プログラムの呼び出し
           CALL 'CGISUB' USING NAMELIST.
      *> CGIリスト削除
           CALL 'CBLDESTROYLIST' USING NAMELIST.
           STOP RUN.
Webブラウザの出力例
TOKYO:GRAY
FUKUOKA:RED
使用例2

<TEXTAREA>のように1,024バイト以上入力できるデータを$%REPEAT%$文で繰り返して表示する場合は,入力用HTMLテンプレートにREPEAT文の終端インジケータとなる「名前」と「値」(.REPEAT.TERMINATOR,1)を,非表示のINPUTメソッドとして追加します。

また,CGIリストに分割された「名前」と「値」の終端として(.REPEAT.TERMINATOR,1)が追加できます。次に,入力用HTMLテンプレートと出力用HTMLテンプレートの例を示します。

入力用HTMLテンプレート
<FORM NAME="MAIN" METHOD="POST" ACTION=
"/scripts/cgisample">
<INPUT TYPE="text" NAME="INPUTTEXT1" VALUE="DATA1"
MAXLENGTH="20"><BR>
<TEXTAREA COLS="60" ROWS="8" NAME="TEXTAREA1">
</TEXTAREA><BR>
<INPUT TYPE="hidden" NAME=".REPEAT.TERMINATOR" 
VALUE="1">
<INPUT TYPE="text" NAME="INPUTTEXT1" VALUE="DATA2"
MAXLENGTH="20"><BR>
<TEXTAREA COLS="60" ROWS="8" NAME="TEXTAREA1">
</TEXTAREA><BR>
<INPUT TYPE="hidden" NAME=".REPEAT.TERMINATOR"
VALUE="1"><INPUT TYPE="submit" NAME="submit"
VALUE="送信" ><BR></FORM>  :
出力用HTMLテンプレート
  :
$%REPEAT%$
データ名:$%INPUTTEXT1%$ <BR>
データ内容:
$%REPEAT%$
$%TEXTAREA1%$
$%END-REPEAT%$
<BR>
$%END-REPEAT%$
  :
使用例3

分割された「値」を$%REPEAT%$文で連続した「値」として出力する($%変数名%$の間に空白文字を出力しない)HTMLテンプレートの例を示します。ただし,連続した「値」を出力する場合を除いて,HTML拡張言語を並べて記述しないでください。

 :$%REPEAT%$$%NAME1%$$%END-REPEAT%$ :

(3) $%IF%$文

形式
書き方1(変数名とリテラル文字を比較する場合)
$%IF ( 変数名 演算子 'リテラル文字' )%$
  :
  {$%ELSE%$}
  :
$%END-IF%$
書き方2(変数名と変数名を比較する場合)
$%IF ( 変数名1 演算子 変数名2 )%$
  :
  {$%ELSE%$}
  :
$%END-IF%$
書き方3(変数名の有無を確認する場合)
$%IF ( 変数名1 演算子 NULL )%$
  :
  {$%ELSE%$}
  :
$%END-IF%$
機能
書き方1の機能

COBOL主プログラムから渡されたCGIリストの先頭から変数名と一致する「名前」を検索し,「名前」に対応する「値」と'リテラル文字'を演算子の条件で評価します。

書き方2の機能

COBOL主プログラムから渡されたCGIリストの先頭から,変数名1と一致する「名前」,および変数名2と一致する「名前」を検索し,それぞれの「名前」に対応する「値」同士を演算子の条件で評価します。

書き方3の機能

COBOL主プログラムから渡されたCGIリスト中に,変数名1と一致する「名前」があるかどうかを演算子の条件で評価します。

例えば,「$%IF( 変数名1 = NULL )%$」は,変数名1に該当する名前がCGIリスト中にないことを意味します。CGIリスト中に変数名があるかどうかわからない場合は,この書き方3を使って変数名があるかどうかを確認してから,CGIリストを参照するようにしてください。NULLを比較する演算子は"="または"!="でなければなりません。

構文規則
  • 変数名は,次の条件を満たす必要があります。

    1. 先頭の文字が英字である

    2. 2文字目以降が,英数字(A〜Z,a〜z,0〜9),ハイフン(−),下線(_)のどれかで構成されている

    3. 長さが28バイト以下である

  • 演算子は,次に示すものでなければなりません。

    表25‒3 $%IF%$文で使用できる演算子

    演算子

    意味

    =

    等しい

    !=

    等しくない

    >

    より大きい

    >=

    より大きいか,または等しい

    <

    より小さい

    <=

    より小さいか,または等しい

  • リテラル文字は,160バイト以下の文字列で指定します。

  • $%IF%$文を入れ子にした場合,3階層までしか記述できません。

  • $%IF%$文は,条件によって次のように制御されます。

    [図データ]

  • $%ELSE%$は省略できます。

  • 変数名と一致する「名前」に対応する「値」,およびリテラル文字は,英数字項目として扱われます。

(例)'100'と'99'を比較する場合

英数字項目の比較なので'99'の末尾に空白が補われる。したがって,比較結果は,

'100' < '99 '

となる。

  • $%IF%$文による条件比較は,コンパイラオプションの影響を受けません。

注意事項
  • CGIリストが不定で,変数名があるかどうかわからない場合は,書き方3で変数があることを確認してから処理を実行することを推奨します。

  • $%IF%$文に指定した変数名に一致する「名前」がCGIリストにない場合は,変数名の値にはNULLが仮定されます。

使用例

CGIリスト中にある「名前」が"ITEM"の項目の「値」と,リテラル文字'VALUE-X'を比較し,結果を表示する例です。なお,この使用例は,HTMLトランスレータを使用するCGIプログラムの作成例です。

HTMLテンプレート(CGISUB.htm)
Content-type: text/HTML
 
<HTML>
<HEAD>
<TITLE>IF ELSE END-IF</TITLE>
</HEAD>
<BODY>
$%IF ( ITEM = 'VALUE-X' )%$
  ITEM IS 'VALUE-X'. <BR>
$%ELSE%$
  NOT FOUND 'VALUE-X'. <BR>
$%END-IF%$
</BODY>
</HTML>
COBOL主プログラム(CGIMAIN.cbl)
       IDENTIFICATION DIVISION.
       PROGRAM-ID. CGIMAIN.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       01 NAMELIST USAGE ADDRESS VALUE NULL.
       01 NAMEX PIC X(28).
       01 VALUEX.
         02 VALUE-LEN PIC S9(9) USAGE COMP.
         02 VALUE-STRING.
           03 PIC X OCCURS 1024 DEPENDING ON VALUE-LEN.
       PROCEDURE DIVISION.
      *> CGIリスト作成
           CALL 'CBLCREATELIST' USING NAMELIST.
           MOVE 'ITEM' TO NAMEX.
           MOVE 7 TO VALUE-LEN.
           MOVE 'VALUE-X' TO VALUE-STRING.
           CALL 'CBLADDPAIR' USING NAMELIST NAMEX VALUEX.
      *> COBOL副プログラムの呼び出し
           CALL 'CGISUB' USING NAMELIST.
      *> CGIリスト削除
           CALL 'CBLDESTROYLIST' USING NAMELIST.
           STOP RUN.
Webブラウザの出力例
ITEM IS 'VALUE-X'

(4) コメント

形式
$%-- コメント --%$
機能

HTMLテンプレートにコメントを記述します。"$%--","--%$"で囲まれた部分は,HTMLトランスレータで生成されるCOBOL副プログラムに展開されません。

構文規則

$%--:コメントの始まり

--%$:コメントの終わり

使用例

コメントの使用例です。

HTMLテンプレート(CGISUB.htm)
Content-type: text/HTML
<HTML>
<HEAD>
<TITLE>COMMENT</TITLE>
</HEAD>
<BODY>
Webページに出力される
<!-- Webページに出力されるが表示されない -->
$%-- Webページに出力されないコメント --%$
</BODY>
</HTML>
COBOL主プログラム(CGIMAIN.cbl)
       IDENTIFICATION DIVISION.
       PROGRAM-ID. CGIMAIN.
       DATA DIVISION.
       WORKING-STORAGE SECTION.
       PROCEDURE DIVISION.
      *> COBOL副プログラムの呼び出し
           CALL 'CGISUB'.
           STOP RUN.
Webブラウザの出力例
Webページに出力される
Webブラウザに表示されたWebページの内容
<HTML>
<HEAD>
<TITLE>COMMENT</TITLE>
</HEAD>
<BODY>
Webページに出力される
<!-- Webページに出力されるが表示されない -->
</BODY>
</HTML>

(5) HTML拡張言語を使用するときの注意事項