TOP XML & CGI 目次

XMLでデータベース
編集フォーム
要素の属性とテキストがすべて配列に格納できたので「入力フォーム」から「編集フォーム」を作ってみる。フォームプログラムをサブルーチンにしてみる。$n=1として、第一番目のデータを表示する。
test05a.cgi初期
#!/usr/bin/perl

print "Content-type: text/html\n\n";

#データを配列に入れる
&data;

$n = 1;

#要素属性を配列に入れる/テキストの抽出
&zokusei;

#入力/編集フォーム
&edit;


exit;

#==========サブルーチン==========

#データを配列に入れる
sub data{
open (IN,"dtb.xml");
@data=<IN>;
close(IN);

$n=0;
foreach(@data){
$data[$n] =~ s/\<新聞雑誌記事\>//g; #ルート要素を除く
$data[$n] =~ s/</&lt\;/g; #htmlタグを禁止する
$data[$n] =~ s/>/&gt\;/g; #htmlタグを禁止する
chop($data[$n]); #行末の改行コードを除く
$n++;
}
}

#要素属性を配列に入れる/テキストの抽出
sub zokusei{
@zokusei = split(/" /,$data[$n]); #属性を各配列に納める
$zokusei[0] =~ s/&lt\;記事 //; #タイトルから<記事 を取り除く
$zokusei[11] =~ s/&lt\;\/記事&gt\;//g; #コメントから</記事>を取り除く
$l = index($zokusei[11],"\"&gt\;");
$text[$n] = substr($zokusei[11],$l+5); #テキストを取り出す
$zokusei[11] = substr($zokusei[11],0,$l-1); #属性の値を取り出す
$m = 0;
foreach(@zokusei){
$zokusei[$m] =~ s/"//g; #最後に残った " を取り除く
$l=index($zokusei[$m],"\="); #属性名を除く
$zokusei[$m]=substr($zokusei[$m],$l+1,length($zokusei[$m])-$l);
$m++;
}
}

#入力/編集フォーム
sub edit {
print <<"EOL";
<HTML>
<HEAD>
<META name="GENERATOR" content="IBM WebSphere Homepage Builder V6.0.1 for Windows">
<META http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<META http-equiv="Content-Style-Type" content="text/css">
<TITLE>新聞雑誌記事編集フォーム</TITLE>
</HEAD>
<BODY bgcolor="#bbccbb">
<CENTER><B><FONT size="+1">新聞雑誌記事 編集フォーム<BR>
<BR>
</FONT></B>
<FORM ACTION="test05a.cgi" METHOD="POST">
<INPUT TYPE="hidden" NAME="action" VALUE="edit">
<TABLE border="0">
<TBODY>
<TR>
<TD colspan="2" align="center">
<FONT size="-1">タイトル</FONT><INPUT size="139" type="text" name="title" value=$zokusei[0]>
</TD>
</TR>
<TR>
<TD colspan="2" align="center">
<FONT size="-1">サブタイトル</FONT>
<INPUT size="118" type="text" name="subtitle" value=$zokusei[1]>
</TD>
</TR>
<TR>
<TD valign="bottom"><FONT size="-1">文献<BR>
<INPUT size="20" type="text" name="bunken" value=$zokusei[2]><BR>
人物<BR>
<INPUT size="20" type="text" name="jinbutsu" value=$zokusei[3]><BR>
年月日<BR>
<INPUT size="20" type="text" name="nengappi" value=$zokusei[4]><BR>
<BR>
連続<INPUT size="4" type="text" name="renzoku" value=$zokusei[5]><BR>
<BR>
画像<BR>
<INPUT size="20" type="text" name="gazou" value=$zokusei[6]><BR>
横<INPUT size="5" type="text" name="yoko" value=$zokusei[7]> 縦<INPUT size="5" type="text" name="tate" value=$zokusei[8]></FONT></TD>
<TD valign="top" height="268">
<TEXTAREA rows="19" cols="90" name="text">$text[$n]</TEXTAREA>
</TD>
</TR>
<TR>
<TD align="left" colspan="2"><FONT size="-2">
リンク名</FONT><INPUT size="37" type="text" name="linkmei" value=$zokusei[9]><FONT size="-2">リンク</FONT><INPUT size="99" type="text" name="link" value=$zokusei[10]></TD>
</TR>
<TR>
<TD align="right" valign="top"><FONT size="-1">コメント</FONT></TD>
<TD>
<INPUT size="130" name="comment" value=$zokusei[11]></INPUT>
</TD>
</TR>
<TR>
<TD colspan="2" align="center">
<INPUT type="submit" value="書き込み">
</TD>
</TR>
</TBODY>
</TABLE>
</FORM>
<FORM ACTION="dtb.xml">
<INPUT TYPE="submit" VALUE="ファイルに戻る">
</FORM>
</CENTER>
</BODY>
</HTML>
EOL
}
テキストのデータをフォームに送る前に本当の改行コードに戻してやります。
test05a.cgi改
#データを配列に入れる
&data;

$n = 1;

#要素属性を配列に入れる/テキストの抽出
&zokusei;

$text[$n] =~ s/&lt\;br\/&gt\;/\n/g; #テキストの改行を有効にする

#入力/編集フォーム
&edit;

exit;
XML画面に編集ボタンを付けます。(以下プログラムの説明)
<xsl:number level="any"/>
は記事番号(読み込み順)を取得する関数です。
<form action="test06.cgi" method="POST">で編集ボタンが押された時にtest06.cgiプログラムを呼び出します。(プログラム名は作成中にどんどん変化します。現時点のプログラムです)
INPUT(type=hidden)で記事番号$nをデータ名「no」でプログラムに引き渡します。
<input type="submit" value="編集" />編集ボタンを設置します。
kiji.xsl
(前略)
<td width="77%" align="center">
<b><xsl:value-of select="@サブタイトル"/></b></td>
<form action="test06.cgi" method="POST">
<td width="10%" align="center">
 <input>
  <xsl:attribute name="type">hidden</xsl:attribute>
  <xsl:attribute name="name">n</xsl:attribute>
  <xsl:attribute name="value"><xsl:number level="any"/></xsl:attribute>
 </input>
 <input type="submit" value="編集" />

</td>
</form>
(後略)