HTML 4.01及びISO-HTML(ISO/IEC 15445:2000)に於けるid属性の値についての解説です。
これら在来HTMLではid属性値に小文字を使うべきでない事を、基礎となっているSGMLの見地から考えてみました。
制作者は通常在来HTMLと言う呼称を、XML応用言語化されていないHTMLの意味で用いておりますが、SGML応用言語でなくなる予定のHTML 5についてはここでは除外します。
すなわち、本記事に於ける在来HTMLとは、
の事を指します。
在来HTML(HTML 4.01及びISO-HTML(ISO/IEC 15445:2000))に於けるid属性の値については、問題点があります。
その問題点について、ISO-HTMLのDTDには解決策が記されております。
本来なら問題点
を先に書くべきですが、長くなり過ぎる事と、事情をまだ知らない方には却って分かり難いと思われる事から、解決策
を先に書いておきます。
在来HTML(HTML 4.01及びISO-HTML(ISO/IEC 15445:2000))に於いて、id属性値のとるべき値は在来HTMLに於いては以下のようになっております。
しかし、ISO-HTMLのDTDには、以下のように書かれております。
It is recommended that authors of HTML documents specify both ID and NAME attributes, and use values restricted to the 40 characters "ABCDEFGHIJKLMNOPQRSTUVWXYZ.-_:0123456789". When both attributes are specified, they shall have identical values.
つまり、
文書作成者にはid属性とname属性の双方を記述する事とともに、用いる文字は"ABCDEFGHIJKLMNOPQRSTUVWXYZ.-_:0123456789"の四十字に制限する事を推奨する。尚、両属性を記述する場合は、同じ値とする。
と書かれております。
すなわち、id属性の値に用いる英字は大文字のみを使うようにすべきであると書かれている訳です。
それでは、何故上記のような記述がされているのでしょうか。
在来HTMLはSGML応用言語であり、従ってSGMLの仕様に従ったものとなっております。
HTML 4.01のSGML宣言及びISO-HTMLのSGML宣言では、いずれも以下のように宣言されております。
NAMING LCNMSTRT ""UCNMSTRT ""LCNMCHAR ".-_:"UCNMCHAR ".-_:"NAMECASE GENERAL YESENTITY NO
SGML宣言とは、在来HTMLの仕様の根拠となっているSGMLに於いて、応用言語の細かい仕様を定めた宣言です。
SGML宣言についての詳細はここでは書きませんが、NAMINGとは、識別子の命名方法を指定するものです。
特にNAMECASE は小文字または小文字と見なす文字(LCNMCHARで指定)を対応する大文字ないし大文字と見なす文字(UCNMCHARで指定)に変換するかどうかを指定するもので、
GENERAL は文字実体参照以外の要素名, 属性名, ID値などの識別子を大文字変換するかどうかENTITY は文字実体参照を大文字変換するかどうかを示しております。
すなわち、HTML 4.01及びISO-HTML(ISO/IEC 15445:2000)では、
と言う事がSGML宣言に於いて宣言されている訳です。
更にid属性はHTML 4.01のDTD及びISO-HTMLのDTDともにID型、すなわち文書内に一意的に存在する識別子として定義されており、従ってid属性値に小文字が含まれる場合にはそれを大文字に変換して取り扱うべきとされております。
加えて、<a>要素のname属性値及びhref属性値は(<a>要素以外でもですが)、CDATA型、すなわち識別子ではないただの文字列で、従って小文字も変換されずに扱われる事となります。
さて、在来HTMLで上記のSGML宣言及びDTDに従うと、初めに述べたid属性及びname属性に於ける要件について矛盾が生じ得ます。
例えば、id属性値とname属性値をいずれも小文字で表記した場合、すなわち、
<a name="horikita_maki" id="horikita_maki">…</a>
と言うように記述した場合、
HORIKITA_MAKI と見なされ、horikita_maki と見なされ、結果同一性が損なわれてしまいます。
結局、ISO-HTMLのDTDに書かれている事は、この矛盾を生じさせないための指針と言えます。
XHTMLなどXML応用言語に於いては、識別子は常に大文字と小文字を区別する事になっているので、特に問題は生じません。
大文字小文字の揃えは実施されない事が定められているからです。
また、この事がXHTMLに於いて全ての要素名と属性名を小文字で書かなければならない理由となっております。
以上を纏めると、或いは以上から導かれる事は以下の通りです。
id属性が小文字を大文字に変換してから取扱うと言う決まりであれば、当然、
Horikita も,horikita も,HORIKITA もHoriKita も,全ての文字が大文字となっている HORIKITA と見なされてしまいます。
具体的には、在来HTML文書中に
<h1 id="horikita_maki">…</h1>
と小文字が含まれたid属性を持つ要素をフラグメントとして参照する場合(この場合、参照先のフラグメントは<a>要素でなくても良い)、参照元は
<a href="http://…#HORIKITA_MAKI">…</a>
とフラグメント名を全部大文字に直して記述しなければならないと言う事です。
フラグメントの参照に用いられるhref属性は、CDATA型であり識別子ではないので、当然小文字の大文字化は行われません。
一方、在来HTML文書のID属性値は全て大文字に変換されて扱われるため、小文字のフラグメント名を指定した場合該当するフラグメント名が存在しないと見なされる事になります。
<a name="…"> 要素で書かれたフラグメント名を参照する場合、小文字を大文字に変換して書いてはいけない。(平成20年 6月22日 修正)すなわち、在来HTML文書中に
<a name="horikita_maki">…</a>
とid属性を記述していない<a>要素をフラグメントとして参照する場合、参照元は
<a href="http://…#horikita_maki">…</a>
とフラグメント名はname属性値に従った記述にしなければならないと言う事です。
参照先のname属性値も参照元のhref属性値もCDATA型のため、大文字への変換は行われないのが理由です。
尚、HTML 4.01で<a>要素にフラグメント名を記述する場合、しばしばid属性とname属性を併記すべきとされておりますが、実際には HTML 4.01 の仕様書にはそのような記述はありません。但し、
この二つが、HTML 4.01に於いてもname属性とid属性の併記が推奨される根拠となっております。分かり易く言えば、
記述すべきと言う事になります。ですから、上記のような例はHTML 4.01に於いては文法違反ではないものの、今日では好ましくないものとされております。
参照先がXHTMLで記述されている場合、根拠となっているXMLの仕様に於いてid属性値の大文字小文字は明確に区別されるため、参照時には大文字小文字を変えずにそのままの形で記述しなければなりません。
これらの議論は、在来HTMLはSGMLの応用系であると言う前提があって、初めて意味があるものです。
実際、これまでIETFもW3CもHTMLはSGMLの応用系である事を前提にHTMLの仕様を策定してきておりました。
ですが、実際には在来HTMLをSGMLの応用形として取扱ってきたウェブブラウザのヴェンダは一つもなかったのです。
つまり、今までの議論は全て現実には建前どころか、逆に問題を引き起こす事さえあります。
例えば、リンク元・リンク先とも在来HTML文書であっても、実際にこの世にある大半のウェブブラウザでは小文字で書かれたIDを大文字に変換すると参照出来なくなってしまうのです。
とは言え、HTMLは4.01までSGMLの応用系と言う前提で規格化されてきたものですので、
ようにすれば良いでしょう。
XHTML文書も併用している場合には、
と良いでしょう。そうする事で、在来HTML文書からSGMLの建前に従った取扱が可能になります。
つまり、自分で守れる約束事は守るが、他人が約束事に従っていないからと無理に縛る事は出来ないと言う事です。
尚、HTMLの次世代仕様であるHTML 5では、SGMLの応用系と言う前提条件を放棄する事としました。その結果、HTML 5に於いてはXHTMLと同様に大文字小文字の違いを考慮する事となります。