SGMLの短縮タグ機構

この文書の最新版は「鳩丸よもやま話 : SGML の短縮タグ機構」に移転しています。以下の文章は古くなっているかも知れません。

短縮タグ機構

SGML には短縮タグ機構と呼ばれる仕組みがあって、タグを書くときにいろいろな省略をすることが許されています。ただし、それには「SGML宣言」の FEATURES - MINIMIZE の項目で SHORTTAG YES と指定されていることが条件となります。HTML でも SHORTTAG YES となっていますから、短縮タグ機構を利用することができます(ただし HTML+ は SHOTTAG NO です)。

短縮タグ機構には、タグの略記と属性の略記があります。属性の略記から解説しましょう。

属性の略記

SHORTTAG YES となっているときには属性の略記が出来ます。引用符の省略、属性名の省略があります。

引用符の省略

属性値の引用符は省略することが出来ます。ただし、それは属性値が「名前字句(name token)」である場合だけです。

名前字句とは名前文字だけで構成された値のことです。名前文字は SGML 宣言の NAMING LCNMCHAR(Lower-Case Name Character=小文字名前文字)と UCNMCHAR(Upper-Case Name Character=大文字名前文字)で定められていて、これが "" であれば、アルファベットと数字のみであることを意味します。実際には、HTML2.0 や HTML3.2 では ".-" と宣言されていますし、HTML4.0 では ".-_:" ですから、アルファベットの他にこれらの記号が名前文字として使用できます。

従って、以下のようなケースは許されます。

<DIV align=center>
<TABLE border=5>
<FONT size=-1>
<IMG src=vaskyre.jpg>
<SPAN title=my.1st-class>

いずれも、属性値が名前文字だけで構成されているからです。

また、以下のようなものは、HTML4.0 では可能ですが、HTML2.0 や 3.2 では不可です。過去との互換性のために、引用符の省略はしないようにすることを強く推奨します。

<H1 title=1:2>
<DIV class=my_class>

以下のようなものは文法違反です。

<TABLE width=50%>
<FONT size=+1>
<BODY bgcolor=#FFFF00>

% も + も # も名前文字に含まれていないので、これらを含む文字列は名前字句にはなり得ません。よって引用符の省略は出来ません。

また、名前字句には長さ制限もあって、それは SGML宣言の QUANTITY NAMELEN で宣言されています。HTML2.0 や 3.2 では 72 、HTML4.0 では 65536 です。実際にはそれほど長い属性値が使われることは希でしょうから、気にする必要はほとんどありません。また、HTML4.0 では属性値そのものの限界と同じですから、全く気にする必要はありません。

まとめると、属性値の引用符を省略できるのは、次のような場合です。

もちろん、いずれの場合も引用符をつけておいて問題ありません。出来るだけ引用符をつけるようにしましょう。

属性名の省略

SHORTTAG YES であるときは、属性名の省略もできます。ただしこれは、属性値が択一式の時に限られます。

たとえば HTML3.2 において、P の align 属性の値は left, center, right の三者から一つを選ぶようになっています。こんな時は、属性名を省略することが可能です。すなわち、

<P center>

と表記することが可能となっています(不思議なことに <P "center"> は不可です)。また、一者択一(?)であるような属性もこれに該当します。たとえば HTML3.2 における DL の compact 属性は、compact="compact" 以外の値を取ることが出来ません。この場合も属性名を省略可能です。

よって、以下のような表記が可能です。

<DIV right>
<INPUT checked>
<TABLE border>

それぞれ、<DIV align="right"><INPUT checked="checked"><TABLE frame="border"> の略記です。特に最後は <TABLE border="1"> の略記ではありえないことに注意して下さい。

希に勘違いしている人がいますが、たとえば <IMG alt="right"> を <IMG right> と略記することは出来ません。IMG の alt 属性は "right" という値を取れますが、これは択一式で与えられた属性値ではありません。

気をつけなければならないのは、この略記法をヘンな風に実装しているブラウザが存在しているということです。たとえば、あるブラウザは <DIV align=right> を認識できるのに <DIV right> を認識できず、それでいて <INPUT checked> は認識し、そしてどういうわけか <INPUT checked="checked"> を認識できなかったりします。

ですから、rules="groups" のように属性名と属性値が異なるものは省略しないで書き、defer="defer"compact="compact" のように属性値と属性名の同じものは省略して書くようにした方が賢明です。

タグの略記

SGML 宣言で SHORTTAG YES とされている場合、タグそのものを略記することも可能です。が、これはほとんど使われません。対応しているブラウザもほとんどありません。

タグの略記には、エンプティタグ、タグのまとめ閉じ、そして簡略終了タグ(NET)があります。

エンプティタグ

エンプティタグとは、文字通り空っぽのタグです。通常、タグの中には GI(Generic Identifier=共通識別子。要するに要素名のこと)が入りますが、特定の場合にはそれを省略することが出来るのです。

たとえば、以下のように記述できます。

<P>段落そのいち。
<>段落そのに。
<P><Q>引用句。</Q>そして<>また引用句</Q></P>

エンプティスタートタグ <> は、直前に閉じた/開いた要素の名前が省略されているものとみなされます。最初の <> は <P> 、次の <> は <Q> の略記です。直前に何もないとき(つまり、一番最初に用いられたとき)は、ルートエレメントとみなされます。HTML の場合 <HTML> です。

同じように、エンプティエンドタグ </> を使うこともできます。

<P>段落そのいち。</>
<P>段落そのに。</>
<P><Q>引用句。</>そして<Q>また引用句</>

これは分かりやすいですね。いずれも、直前に開いた要素を閉じています。

ところで、市販の HTML 解説本には、何をどう勘違いしたのか <BR> などをエンプティタグだと解説しているものがあります。それは大嘘です。<BR> などは内容モデルが EMPTY と宣言されているエンプティエレメントです。エンプティタグとは何の関係もありません。

タグのまとめ閉じ

タグが連続する場合、前のタグの終了区切り子を省略することが出来ます。たとえば、以下のような記述が可能です。

<A href="../bakera/"<EM>リンクです。</EM</A>

<A> と </EM> の終了区切り子が省略されています。

これは ETAGO, STAGO に割り当てられた文字列(それぞれ <, </ )と同じ文字列の直前であれば省略できることになっていますので、タグに限らず注釈宣言の前でもOKです(とは言え、きちんと解釈してもらえるかどうかはまた別の問題です)。

簡略終了タグ(NET)

NET は簡略終了タグと訳されますが、Null End Tag の略です。その名の通り終了タグがなく、NET で代用されます。NET の区切り子は通常 / で、HTML でも / です。また、NET を使用するときには、開始タグ終了区切り子も NET にします。

……と言っても何が何だか分からないでしょうから、例を示します。

<A href="mawxiwts.png"/
おそろしい省略だ〜。
/

終了タグの代わりに / が使われています。これが NET です。また、開始タグの終了区切り子も / に置き換えられています(この形の開始タグを「NET 可能開始タグ」と呼びます)。

こんな例もあります。

<A href=bakera/html/hatomaru.html>

一見、何の変哲もないアンカーの開始タグように見えるかもしれませんが、よく見てください。属性値が引用符で括られていません。属性値が "/" を含むなら引用符で括らなければなりませんから、括られていない属性値は / の前で終わっており、/ は NET だと解釈されます。従って、これは以下のマーク付けと等価になります。

<A href="bakera">html</A>hatomaru.html>

……とは言え、このように「正しく」解釈するブラウザはおそらく存在しないでしょう。

XML における NET

XML は新しい SGML 仕様を先取りして採用していますので(と言うより SGML仕様の方が XML を見越しているのですが)、NESTC (NET-Enabling Start-Tag Closer, NET可能開始タグ終了区切り子) という区切り子があります。これは文字通り、NET可能開始タグの終了区切り子となる物です。つまり、新しい SGML 仕様では、NET可能開始タグの終了区切り子と NET に、それぞれ違う文字が使えるようになっているのです。XML において、前者は / であり、後者は > です。

たとえば、先に掲げた NET の例は以下のようになります。

<A href="mawxiwts.png"/
おそろしい省略だ〜。
>

最後の > が NET で、終了タグの代わりです。しかし実際には、XML で NET が使われるのは空要素の場合だけです。XML では空要素でも終了タグの省略が出来ません。たとえば XHTML の br 要素は <br></br> と書かねばなりませんが、これは面倒な上、旧来の SGML との互換性がありません。と言うのも、旧来の SGML では、空要素の終了タグは省略しなければならない事になっているからです。

そこで多くの場合、NET を使って <br /> と書きます("<br /" が <br> に、">" が </br> に相当します)。こうしておくと、旧来の SGML パーサでも、DELIM NET "/&#62;" などと宣言することで辻褄を合わせることができます。


タグの略記については以上ですが、これらをきちんと解釈できるブラウザはほとんどありません(SGMLパーサーでさえ解釈できないことがあるらしいですし)。ですから、これらの略記は出来る限り行わないようにしましょう。


マニアックな文法論議

HTML鳩丸倶楽部

水無月ばけら, MINAZUKI Bakera
E-mail: bakera@star.email.ne.jp