
目次
はじめに ▼ 1 SGMLとは? ▼ 2 文書の分析 ▼ 3 文書型の定義 ▼ 4 文書インスタンスの作成 ▼ 5 SGML文書の検証 ▼ 6 中間形式への変換 ▼ 7 後処理 ▼ 付録A ESISの形式 ▼ 付録B ESISの要素構造情報 ▼
小文は,JAGATのSGML/Perlセミナーで使っているテキストです。自習書ではありませんので,説明が不十分なところが多々あると思います。今後,時間をかけて増補していくつもりです。(岸 和孝)
SGML(文書記述言語)は,機種や装置に依存しない,多目的の,公的な文書交換規格です。
SGMLという用語には,次のような意味があります。
| Standard | 標 準 | 国際規格のISO 8879-l986,国内規格のJIS X 4151-1992として公的に制定されているという意味です。 |
| Generalized | 汎 用 | 用途を特定しない,汎用であるという意味です。 |
| Markup | マーク付け | テキストに「しるし」を付ける方法であることを意味します。 |
| Language | 言 語 | コンピュータ言語であることを意味します。 |
SGMLに関連した,次のような規格があります。
| HTML | ハイパーテキストマーク付け言語。ウェブで使われている文書様式で,SGMLの一つの文書型です。W3Cによって制定されました。 |
| XML | 拡張可能なマーク付け言語。ネットワークでの文書交換を効果的にするために,SGMLの一部の規格を制限したものです。W3Cによって制定されました。 |
| DSSSL | 文書スタイル意味指定言語。SGMLで表わした文書を別の文書型の文書へ変換したり,紙媒体や電子媒体における特定の形式(TeX,RTF,HTMLなど)へフォーマッティングしたりする指定を表わすものです。ISO/IEC 10179として制定されました。 |
SGML以外の文書交換規格には,次のようなものがあります。
| 日本語文書交換用ファイル仕様 | 異なる日本語ワードプロセッサー間の文書交換のために,JIS X 4001として制定された国内規格ですが,現在では殆ど使われていないようです。 |
| 開放型文書体系及び交換様式 | 開放型システム間相互接続(OSI)における文書交換のために,ISO 86xxとして制定された国際規格で,国内規格でもJIS X 41xxとして制定されていますが,関連ツールは殆ど製品化されていません。 |
| TeX | 主にUNIXで使われている組版ツールのTeXにおける文書様式です。 |
| PS | ポストスクリプトの略。ページ記述言語の一種で,アドビシステムズ社によって制定されました。 |
| ポータブルドキュメントフォーマットの略。異なるシステム間におけるポストスクリプト準拠の文書交換のために,アドビシステムズ社によって制定されました。 | |
| RTF | リッチテキストフォーマットの略。マイクロソフト社のワープロWORDにおける文書様式です。 |
SGMLのワークフローとは,次のような段階です。これを順を追って体験しましょう。
文書の分析とは,文書に含まれるデータを整理し,その「かたち」を分類することです。
「名刺」や「手紙」にはどのようデータが含まれているか,考えてみましょう。
P型の文書分析とは,文書の「表示面」に注目して,その「かたち」を分析することです。
岸 和孝 飯豊山書林 店主 〒966-0901 喜多方市松山町鳥見山字下堰下4608 エ0241-22-3981
フリーライター&百姓 野部 迩良美 熱塩加納村大字熱塩字寺の前 FAX 0241-21-1581
各位 1997年10月12日 テキスト処理に関するセミナーのご案内 拝啓 貴社ますますご清栄のこととお慶び申し上げます。 さて,この度,本校では,これからの拡印刷(1)の技術教育の一環として, コンピュータ支援(2)によるテキストの処理(入稿・編集・加工)に関する セミナーを企画致しました。必ずや貴社のお役に立つ内容と存じます。 つきましては,拡印刷(1)を目指す貴社に別紙応募要領に基づいてご参加い ただくたく,ご案内申し上げます。 ○△学校 ------ (1)いままでの印刷事業の枠を拡大するという意味で用いています。 (2)パソコン,ワークステーション,専用機を使ったシステムです。
「名刺」を名刺らしくしている「かたち」とか,「手紙」を手紙らしくている「かたち」とは,どのようなものでしょうか?
S型の文書分析とは,文書の「内容面」に注目して,その「かたち」を分析することです。
管理またはデータベースの観点(言い替えれば,検索の観点)から「名刺」や「手紙」として必要なデータは何でしょうか?
文書型とは,「名刺」とか「手紙」とかいった特定の文書の「かたち」のことです。
文書型は,原則的に利用者が自由に決めるものです。
よく知られたHTMLはSGMLの一つの文書型です。
文書型の定義では,要素を区別するための「しるし」,その「しるし」の現われ方,「しるし」で区別される要素どうしの関係(要素構造)を明らかにします。
「しるし」とは,「タグ」のことです。
タグによって区別される要素の「なかみ」が通常のデータです。
タグそのものに「属性」と呼ぶ特別なデータを持つことができます。
文書型定義のことをDTD(Data Type Definition)といいます。
SGMLでは,「名刺」の文書型定義を次のように表わします。
「要素名」=「共通識別子」=「タグ名」です。
属性は,タグごとに「属性名」で区別します。
<!DOCTYPE database [ <!ENTITY % stuff "INCLUDE" -- INCLUDE or IGNORE --> <!ENTITY amp CDATA "&" -- & -- > <!ENTITY lt CDATA "<" -- < -- > <!ENTITY gt CDATA ">" -- > -- > <!ELEMENT database - - (customer+) -- データベース -- > <!ELEMENT customer - O (name,company?,division?,status?,address,tel) -- 顧客情報 -- > <!ELEMENT name O O (family,first) -- 姓名 -- > <!ELEMENT family - O (#PCDATA) -- 姓 -- > <!ELEMENT first - O (#PCDATA) -- 名 -- > <!ELEMENT company - O (#PCDATA) -- 会社名 -- > <!ELEMENT division - O (#PCDATA) -- 部門名 -- > <!ELEMENT status - O (#PCDATA) -- 役職 -- > <!ELEMENT address - O (#PCDATA) -- 住所 -- > <!ATTLIST address postno CDATA #IMPLIED -- 郵便番号 -- > <!ELEMENT tel - O (#PCDATA) -- 電話番号 -- > ]>
<!DOCTYPE LETTER [ <-- 一般実体宣言 -- > <!ENTITY amp CDATA "&" -- & -- > <!ENTITY lt CDATA "<" -- < -- > <!ENTITY gt CDATA ">" -- > -- > <-- 文書構造 -- > <!ELEMENT LETTER - - (HEAD,BODY,FROM) -- 手紙 -- > <!ELEMENT HEAD O O (TO,DATE,TITLE) -- 頭書き -- > <!ELEMENT BODY O O (P)+ +(FN|FNREF) -- 本文 -- > <!ELEMENT FN - - (#PCDATA) -- 脚注 -- > <!ATTLIST FN ID ID #IMPLIED > <!ELEMENT FNREF - O EMPTY -- 脚注参照 --> <!ATTLIST FNREF ID IDREF #REQUIRED > <!ELEMENT TO - O (#PCDATA) -- 宛先 -- > <!ELEMENT DATE - O (#PCDATA) -- 日付 -- > <!ELEMENT TITLE - O (#PCDATA) -- 表題 -- > <!ELEMENT P - O (#PCDATA) -- 段落 -- > <!ELEMENT FROM - O (#PCDATA) -- 発信人 -- > ]>
| 文書型定義 | <!DOCTYPE 文書型名 [ 定義リスト…] > |
| 要素宣言 | <!ELEMENT 要素名 省略タグ最小化指定 内容モデル > |
| 属性定義リスト宣言 | <!ATTLIST 要素名 属性名 宣言値 省略時値 > |
| 一般実体宣言 | <!ENTITY 一般実体名 パラメターリテラル > |
| 注釈宣言 | <!-- 注釈 --> |
次の例では,文書型定義は,「文書型名」がLETTERであり,「定義リスト」が“……”の部分です。この定義リストの書き方が学習のポイントです。定義リストとして後述する各宣言を並べます。
<!DOCTYPE LETTER [ …… ]>
文書型定義はすべて“<! …… >”という形式で表わされていることに注目して下さい。DOCTYPEは文書型定義,ELEMENTは要素宣言,ENTITYは一般実体宣言をそれぞれ指示しているキーワードです。
要素宣言は,文書を構成する要素の一つひとつについて,それらが文書上でどのように現われるのかを「内容モデル」で定義します。次の例で,“(HEAD,BODY,FROM)”は,LETTER要素(文書型名=最上位の要素)がHEAD要素,BODY要素,FROM要素から構成される(これらはLETTER要素を「親」とした「兄弟」の関係になる)ことを意味します。次の“(TO,DATE,TITLE)”は,HEAD要素がTO要素,DATE要素,TITLE要素から構成される(これらはHEAD要素を「親」とした「兄弟」の関係になる)ことを意味します。どの要素も最終的に文字データを意味する“(#PCDATA)”として定義します。
<!ELEMENT LETTER - - (HEAD,BODY,FROM) -- 手紙 -- > <!ELEMENT HEAD O O (TO,DATE,TITLE) -- 頭書き -- > <!ELEMENT BODY O O (P)+ +(FN|FNREF) -- 本文 -- > <!ELEMENT FN - - (#PCDATA) -- 脚注 -- >
“- -”や“- O”の部分を「省略タグ最小化指定」と言います。最初の文字が開始タグ,次の文字が終了タグについて,そのタグが省略できない(-)か省略できる(O)かを指定します。
属性定義リスト宣言は,要素が属性を持つ場合に書きます。次の例で,address要素はpostno属性を持ちます。postno属性の値はCDATA(文字データ)で表わし,省略した場合は#IMPLIED(応用が決めた値を取る)となることを表わしています。
<!ELEMENT address - O (#PCDATA) -- 住所 -- > <!ATTLIST address postno CDATA #IMPLIED -- 郵便番号 -- >
文書の中に不等号を表わす意味で文字“<”が現われることがあります。この文字はタグを表わすために用いていますので,代替表現を必要とします。文字“<”を文書インスタンスの内容として表わすために“<”と表現します。こうした表わし方を決めるのが一般実体宣言で,それを参照する(その文字そのものとして表わす)形式を一般実体参照と言います。ここで,一般実体参照に文字“&”を使いますので,文字“&”を内容として表わすために,同様に“&”と表現します。
<!ENTITY amp CDATA "&" -- & -- > <!ENTITY lt CDATA "<" -- < -- >
一般実体宣言は,そうした代替文字の他に,括弧で囲んだ「株」のような標準外の文字(外字)を表わすことができます。置き換えるべき文字が標準文字の場合,CDATA(文字データ)とし,外字の場合は,SDATA(システムデータ)とします。システムデータはSGML処理の外側で扱われることになります。
<!ENTITY kabu SDATA "[kabu]" --(株)-- >
注釈宣言は,文書型定義としては何の意味もありません。しかし,その作成者にとっての備忘録として,また他の利用者への情報として重要な役割があります。前述の各宣言の中にインライン注釈を書くことができます。
<-- これは注釈です -- >
次の要素を追加してみましょう。
次の要素を追加してみましょう。
文書インスタンスは,タグ付けした,具体的な文書そのものです。
文書インスタンスは,文書型と完全に一致していなければなりません。
マーク区間を使うと,一つのファイルの中で複数通りの内容を表わすことができます。
次の文書インスタンスは,マーク区間を利用して,パラメーター引き数%stuff;の値をINCLUDE(含める)かIGNORE(含めない)とすることによって,「野部さん」の名刺を含めるか含めないかを制御しています。
<database> <customer> <family>岸<first>和孝 <company>飯豊山書林 <status>店主 <address postno="966-0901">喜多方市松山町鳥見山字下堰下4608 <tel>0241-22-3981 </customer> <![ %stuff; [ <customer> <family>野部<first>迩良美 <status>フリーライター&百姓 <address>熱塩加納村大字熱塩字寺の前 <fax>0241-21-1581 </customer> ]]> </database>
<LETTER> <TO>各位 <DATE>1997年10月12日 <TITLE>テキスト処理に関するセミナーのご案内 <P>拝啓 貴社ますますご清栄のこととお慶び申し上げます。 <P>さて,この度,本校では, これからの拡印刷 <FN ID="拡印刷">いままでの印刷事業の枠を拡大するという意味で 用いています。 </FN>の技術教育の一環として, コンピュータ支援 <FN ID="コンピュータ支援">パソコン,ワークステーション, 専用機を使ったシステムです。 </FN>によるテキストの処理(入稿・編集・加工)に関する セミナーを企画致しました。 必ずや貴社のお役に立つ内容と存じます。 <P>つきましては, 拡印刷<FNREF ID="拡印刷">を目指す貴社に 別紙応募要領に基づいてご参加いただきたく, ご案内申し上げます。 <FROM>○△学校 </LETTER>
具体的な「名刺」や「手紙」を文書インスタンスに表わしてみましょう。
文書型は,少なくとも二,三種類の「名刺」や「手紙」を表わせる「かたち」に発展させましょう。
SGML文書は,次の三点セットからなります。
次の図のように,SGML文書が正しいかどうかをNSGMLSなどのSGMLパーザーによって検証します。
ここで誤りを除いておかないと,「ゴミを入れるとゴミが出る」というコンピューターの法則どおりになってしまいます。

文書インスタンスは,SGMLパーザーによって中間形式であるESIS(要素構造情報集合)データへ変換されます。
(DATABASE (CUSTOMER (NAME (FAMILY -岸 )FAMILY (FIRST -和孝 )FIRST )NAME (COMPANY -飯豊山書林 )COMPANY (STATUS -店主 )STATUS APOSTNO CDATA 966-0901 (ADDRESS -喜多方市松山町鳥見山字下堰下4608 )ADDRESS (TEL -0241-22-3981 )TEL )CUSTOMER (CUSTOMER (NAME (FAMILY -野部 )FAMILY (FIRST -迩良美 )FIRST )NAME (STATUS -フリーライター&百姓 )STATUS APOSTNO IMPLIED (ADDRESS -熱塩加納村大字熱塩字寺の前 )ADDRESS (TEL -0241-21-1581 )TEL )CUSTOMER )DATABASE C
「手紙」では,段落(P)の繰り返しの中に脚注(FN)と脚注参照(FNREF)が混じる複雑な構造をしていますが,ESISはそれを正確に表現します。
(LETTER (HEAD (TO -各位 )TO (DATE -1997年10月12日 )DATE (TITLE -テキスト処理に関するセミナーのご案内 )TITLE )HEAD (BODY (P -拝啓 貴社ますますご清栄のこととお慶び申し上げます。 )P (P -さて,この度,本校では,これからの拡印刷 AID TOKEN 拡印刷 (FN -いままでの印刷事業の枠を拡大するという意味で用いています。 )FN -の技術教育の一環として,コンピュータ支援 AID TOKEN コンピュータ支援 (FN -パソコン,ワークステーション,専用機を使ったシステムです。 )FN -によるテキストの処理(入稿・編集・加工)に関するセミナーを 企画致しました。必ずや貴社のお役に立つ内容と存じます。 )P (P -つきましては,拡印刷 AID TOKEN 拡印刷 (FNREF )FNREF -を目指す貴社に別紙応募要領に基づいてご参加いただきたく, ご案内申し上げます。 )P )BODY (FROM -○△学校 )FROM )LETTER C
後処理とは,SGML文書の中間形式で表わされたESISデータをターゲットに合わせてさらに別の形式へ変換することです。
一般に,紙への出力であれば,PageMakerやTeXのタグ付きテキストの形式へさらに変換します。
SGMLパーザーが出力するESISデータは,要素構造情報集合(ESIS)を表わしています。
ESISのデータの内容は一連の行からなり,行の長さは任意です。各行は,コマンド文字と一つ以上の引数からなっています。引数は一つの空白で区切られますが,幾つかの引数が続く場合は,最後の引数の後にも空白が置かれます。コマンドと最初の引き数の間には空白はありません。
引数には,次のエスケープシーケンスが含まれることがあります。
| \\ | 一つの“\”を表わします。 |
| \n | レコード終了文字を表わします。 |
| \| | 内部SDATA実体は,この記号で囲んで表わします。 |
| \nnn | コードが8進数でnnn>である文字を表わします。 |
レコード開始文字は“\012”で表されます。大半のアプリケーションでは“\012”を無視して,“\n”を改行に変換しなければならないでしょう。
コマンド文字と引数の意味は,次のとおりです。
| (共通識別子 例:(LETTER | この共通識別子(この例では,LETTER)を持つ要素が開始したことを表わします。この要素の属性は,Aコマンドで指定されます。 |
| )共通識別子 例:)LETTER | この共通識別子(この例では,LETTER)を持つ要素が終了したことを表わします。 |
| -データ 例:-各位 | データ(この例では,“各位”)を表わします。 |
| &外部データ実体名 | この外部データ実体名を持つ外部データ実体への参照を表わします。外部データ実体名は,Eコマンドで指定されます。 |
| ?データ | このデータを含む処理命令を表わします。 |
| A属性名 IMPLIED | 属性名が省略され,その値が#IMPLIEDであることを表わします。 |
| A属性名 CDATA 文字データ | 属性名の内容型がCDATAであることとその値を表わします。 |
| A属性名 NOTATION 記法名 | 属性名の内容型がNOTATIONであることとその記法名を表わします。 |
| A属性名 ENTITY 一般実体名 … | 属性名の内容型がENTITYまたはENTITIESであることとその一般実体名のリストを表わします。各実体名は,I コマンド,E コマンド,S コマンドで指定されます。 |
| A属性名 TOKEN 字句 … 例:AID TOKEN 拡印刷 | 属性名(この例では,ID)の内容型がその他の属性で,字句のリスト(この例では,“拡印刷”)が値を表わします。 |
| D外部実体名 名前 値 | 外部実体名のデータ属性を表わします。コマンドが適用される実体を指定するEコマンドの後,ただしその実体を参照する &コマンド,Aコマンドよりも前に現われます。 |
| N記法名 | 記法名を表わします。記法が公開識別子で宣言されている場合はpコマンドの後に現われます。システム識別子で宣言されている場合はsコマンドの後に現われます。記法は,値としてNOTATIONが宣言されている属性に対するEコマンドまたはAコマンドにおいて参照される場合にだけ現われます。 |
| E外部データ実体名 内容型 記法名 | SGML文書型定義で内容型がCDATA,NDATA,SDATAで,記法名の記法で表わされた外部データ実体名を表わします。システム識別子および公開識別子から実体管理機能が生成したファイル名を示す一つ以上のfコマンドの後に現われます。また,実体に対して公開識別子が宣言されている場合はpコマンドの後,システム識別子が宣言されている場合はsコマンドの後に現われます。記法名は,Nコマンドで指定されます。実体のデータ属性は,Dコマンドで指定されることがあります。外部データ実体は,値としてENTITYまたはENTITIESが宣言されている属性に対する&コマンドまたはAコマンドにおいて参照される場合にだけ現われます。 |
| I内部データ実体名 内容型 実体文 | 内容型がCDATAまたはSDATAで,実体文を持つ内部データ実体名を表わします。内部データ実体は,値としてENTITYまたはENTITIESが宣言されている属性に対するAコマンドにおいて参照される場合にだけ現われます。 |
| S副文書実体名 | 副文書実体名を表わします。システム識別子および公開識別子から実体管理機能が生成したファイル名を示す一つ以上のfコマンドの後に現われます。実体に対して公開識別子が宣言されている場合はpコマンドの後に現われます。システム識別子が宣言されている場合はsコマンドの後に現われます。副文書実体は,ENTITY属性またはENTITIES属性に対する{コマンドまたはAコマンドにおいて参照される場合にだけ現われます。 |
| s関連システム識別子 | 関連システム識別子を表わします。次に出現するEコマンド, SコマンドまたはNコマンドに適用されます。 |
| p関連公開識別子 | 関連公開識別子を表わします。次に出現するEコマンド,SコマンドまたはNコマンドに適用されます。 |
| f関連ファイル名 | 関連ファイル名を表わします。次に出現するEまたはSコマンドに適用されます。システム識別子にセミコロンが使用されている場合は,一つのEコマンドまたはSコマンドに対して複数のfコマンドが現われます。 |
| {副文書実体名 | この副文書実体名を持つSGML副文書実体が開始したことを表わします。副文書実体名は,S コマンドで指定されます。 |
| }副文書実体名 | この副文書実体名を持つSGML副文書実体が終了したことを表わします。 |
| L行番号 ファイル名 | 現在の行番号およびファイル名を表わします。行番号だけが変更された場合は,ファイル名が省略されます。これは,Lコマンドオプションが指定されている場合にだけ現われます。 |
| #応用特有情報 | SGML宣言のAPPINFOに応用特有情報が指定されたことを表わします。これは厳密にはESISの一部ではありませんが,要素構造を扱う際に,これに対して処理することができます。“APPINFO NONE”が指定された場合には,#コマンドは現われません。#コマンドはせいぜい一度しか現われず,その前に一つのLコマンドが現われる場合があります。 |
| C | 入力した文書実体がSGMLに準拠した文書であることを表わします。一番最後のコマンドとして現われます。準拠していない副文書実体を参照するSGML文書では,非準拠になります。 |


(1999年4月記,同改訂増補,2000年7月増補)