ホームページも HTML から XHTML、さらには XML と進化していますが、 このとき、それらの流れの基盤となっているのが SGML です。 ここでは、SGML を非常に簡単に紹介します。
SGML では「DTD 文書」という、書き方を定義したものが必要です。 以下はシンプルな一例です(simple.dtd)。
<!DOCTYPE test [ <!ELEMENT test - O (name,writer,body)> <!ELEMENT name - O (#PCDATA)> <!ELEMENT writer - O (#PCDATA)> <!ELEMENT body - O (p+)> <!ELEMENT p - O (#PCDATA)> ]>
これは test という文書型を作るものです。 test という文書型(ワープロでいう書式の感じ)の中に何があるかを定義してます。
大雑把に言えば、test という文書型の中に、name, writer, body という本文の部分があり、 body の中に p という段落がある。 この文書型定義では、それだけを宣言しています。 その他に、見出しも、センタリングも、何もありません。
XHTML なども SGML 文書なので、xhtml1-strict.dtd などを入手したら、 このような DTD ファイルを自分で作る必要はありません。 その代わり、XHTML の文法を覚える必要があります。
<test> <name>オズの魔法使い <writer>ライマン・フランク・バーム <body> <p>おまえ、いったい、どこにいたんだい?」 <p>ドロシーは涙をふきながら、それでもせいいっぱいいかめしくこたえました。 <p>「きいてちょうだい、おばさん、オズの国よ、トトもいっしょだったの。 <p>ああ、それにしてもわたし、おうちにかえれてどんなにうれしいか!」 </test>
これ(simple.sgm)は、上の DTD で定義した要素だけで書いた test 型の SGML 文書です。
SGML では「タグ」と言われる <...> という形式で、いろいろな書式情報を指定します。 <xxx> が開始タグ、</xxx> が終了タグです。
よって、上の例では、<test> から </test> までを test 型文書の範囲と指定したことになります。
さらに、<body> から </body> までが本文、その中に、<p> で始まる段落(パラグラフ)がいくつか。 </p> が見あたりませんが、SGML パーサというソフトは、こうした多少の省略やつけ忘れを勝手に補ってくれます(XML は補わない)。
<name> <writer> は作品や作者などを別に示すためのものです。
SGML 文書の作成はこんな感じです。LaTeX、roff などといった、特定のマークをテキストファイルに埋めこむことによって、 テキストで書式情報を扱えるようにしようという指向と似ています。 ただ SGML は『文書構造と体裁の情報を分離する事によって、情報通有をしやすくする』という方向性を持つ点で違います。
SGML に体裁のための情報を含めてしまうのは、一時的に有効であるものの、将来的なメリットを多少失います。 本来ならば文書構造を中心に考えて書くべきものが、体裁の情報を中心に考えて書くようになってしまうからです。
SGML が文書構造と体裁の情報を分離するのは、一つの SGML 文書から印刷物、テキスト文書、ワープロ文書、テキストデータベース、 ホームページなど複数のメディアへの変換を考えるためですが、HTML 文書で、例えば、 『センタリング』という体裁のためだけのタグがあった場合、 それは『強調したい』からなのか『タイトル表示したい』からなのか、わかりません。 つまり、他のメディアに意味を失わないままでコンバートできないわけです。
また、LaTeX は dviprt simple とすることで整形結果を印刷できるのに対し、SGML は少々面倒です。 基本的には SGML の守備範囲には表示、印刷という部分はなく、これらは DSSSL や SPDL が対処すべき分野だからです。
ととらえることもできます。確かにお客さん(SGML)が下線、太字、斜体を指定するということは可能ですが、 せっかく編集、組版のプロ(DSSSL)がいるのに、素人が指定するのはもったいないということです。 でも、そういう指定をしたくなるのは事実で、それはイメージがきちんと伝わらないからです。 このためには、説明(DTD)をより詳しく書いてあげる、そういう流れなわけです。
ではここで、Perl に DSSSL 的な役割を担当させ、ブラウザに SPDL 的な役割を担当させるといる方向で、 先に進んでみましょう(DTD による SGML 文書の検証は行いません。目で見てタグ付けを確認したとします)。 Perl をお持ちの方は試してください。
while (<>) {
chomp;
if (m#^<name>(.*)#) {
$name = $1;
next;
}
if (m#^<writer>(.*)#) {
$writer = $1;
}
s#<test>#<html>\n<head>#;
s#<writer>(.*)#<title>$name - $writer</title>#;
s#<body>#</title>\n<body>\n<h1>$name - $writer</h1>#;
s#</test>#</body>\n</html>#;
print "$_\n";
}上を simple.pl とし、コマンドラインから以下のように入力すると、
perl simple.pl simple.sgm > simple.html
simple.html が得られるでしょう。これは HTML 文書となっており、ブラウズできます。 だいたい、SGML というもののイメージがつかめたでしょうか。
<html> <head> <title>オズの魔法使い - ライマン・フランク・バーム</title> </title> <body> <h1>オズの魔法使い - ライマン・フランク・バーム</h1> <p>おまえ、いったい、どこにいたんだい?」 <p>ドロシーは涙をふきながら、それでもせいいっぱいいかめしくこたえました。 <p>「きいてちょうだい、おばさん、オズの国よ、トトもいっしょだったの。 <p>ああ、それにしてもわたし、おうちにかえれてどんなにうれしいか!」 </body> </html>