鳩丸よもやま話

bakera.jp > 鳩丸よもやま話 > SGML の短縮タグ機構

SGML の短縮タグ機構

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

※ただし HTML+ では SHORTTAG NO です。また XHTML は XML のルールに従いますので、SHORTTAG NO と同じ扱いです。これらでは、以下の省略記法は全く使うことができません。

属性の略記

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

引用符の省略

特定の条件を満たしている場合、属性値の引用符は省略することができます (厳密な言い方をすると、「属性値表記」の代わりに「属性値」をそのまま使用できます)。その条件とは、属性値が「名前字句(name token)」である場合です。

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

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

<div align=center>
<table border=5>
<font size=-1>
<img src=vaskyre.jpg>
<span title=my.1st-class>

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

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

<h1 title=HTML::Template>
<div class=my_class>

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

<table width=50%>
<font size=+1>
<body bgcolor=#ffff00>

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

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

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

  • HTML2.0 や HTML3.2 において、属性値がアルファベットと数字、.(ピリオド)、-(ハイフン)だけで構成されていて、かつ 72文字以内の場合。
  • HTML4 において、属性値がアルファベットと数字、.(ピリオド)、-(ハイフン)、_(アンダースコア)、:(コロン)だけで構成されている場合。

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

属性名の省略

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> の略記です。

※ただし前者は OMITTAG YES で </p> が省略できるとき、後者は OMITTAG NO のときにできます。HTML では OMITTAG YES なので後者の例は不可です。

直前に何もないとき(つまり、一番最初に用いられたとき)は、ルートエレメントとみなされます。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パーサーでさえ解釈できないことがあるらしいですし)。ですから、これらの略記は出来る限り行わないようにしましょう。

最近の日記

関わった本など