- ベストアンサー
HTMLの属性値の省略について
- HTML4では属性値の省略ができるかどうかについて、仕様書上の明確な記述はなく、慣習として省略が広く行われています。
- HTML5では属性値の省略についても明確な記述はありませんが、省略が許可されている場合が多くなっています。
- HTML5のDTDは以下の通りです。 <!DOCTYPE html>
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
DTD を参照しておられますが、まず見るべきはそこではなく、SGML 宣言の内容です。 http://www.asahi-net.or.jp/~sd5a-ucd/rec-html401j/sgml/sgmldecl.html FEATURES / MINIMIZE / SHORTTAG YES となっています。すなわち、SGML の短縮タグ機構を許可する、ということです。 短縮タグ機構とは何か。 http://www1.u-netsurf.ne.jp/~7l1rll/SGMLsec6_0.html (a). 属性値が名前文字のみであるなら、引用符を省略して良い。 <input type=text> (b). 列挙値(<input type="text"> のように取りうる値が決まっている)の場合、属性名を省略して良い。デフォルト値は初回に用いられた値。 <input text> (c). 空タグを使って良い。 <p>段落<>段落</><>段落</> (d). タグをまとめて良い。 <div<p>段落</p</div> (e). 簡略終了タグを使って良い。 <p/段落/ ちなみに、XML における空要素の省略表記 <input/> は (e) のルールを応用したものです。 --- ですから「HTML を正規表現で処理したい」なんてのは、本当は現実離れした話なのです。とは言え、SGML パーサでさえこれらを全部認識できるものはありませんので、HTML4: B.3.3 ではこれらを使わないように、と注意書きがあります。 それなら、最初から SHORTTAG NO にしておけば良いではないか。ところが、古いブラウザの中にはこれらを中途半端に実装しているものがありました。例えば、disabled などについてです。 <input disabled> これは (b) の応用です。それでいて、<input disabled="disabled"> は認識できなかった。つまり、属性名と属性値が同じ場合に限り省略でき、しかも省略した形しか認識できないブラウザがあったので、仕様書でもこの省略を許可せざるをえなかったのです。その上で、もうそういうのは止めてね、と注意を促したのです。 --- しかしながら、この省略法は使われ続けました。そこで、HTML(5) ではいっそ「属性名と属性値が同じ場合に限り、disabled のように省略できる」というのを仕様化してしまい、これを「論理型属性」と呼ぶことにしました(参考 URL)。すなわち、DOM 上では true/false として露出する属性です。 なお、注意書きにもあるように、contentEditable="true" のように "true" または "false" を取る属性は、論理型属性ではありません。混同しないようにして下さい。 それと、HTML(5) に DTD はありません。HTML(5) は SGML でも XML でもない、第三の形式です。どうしても必要なら、有志が DTD、RELAX NG、Schematron などのスキーマを作って配布しています。Validator.nu はそれを利用しています。
その他の回答 (2)
- Chaire
- ベストアンサー率60% (79/130)
No.2 にも書きましたが、タグ短縮をマトモにサポートしているブラウザなんてありませんよ。しかし、中途半端に実装しているブラウザがちらほらあり、そのままでは相互運用性に支障をきたすので、とりあえずそれまでの分については仕様上もタグ短縮を認めるけれども、今後はやらないようにね、というのが HTML 4.0 規定の付録 B. 3 です。付録なので規範性はなかったんですけどね。 Fx 11、Ch 18 なら、すでに HTML(5) の解析ルールで動いているはずです。誤解している方をたまに見かけるので念のため申し上げておきますが、今後のブラウザは例えページが HTML 4.0 で書かれていようと XHTML 1.0 で書かれていようと、原則として全て HTML(5) のルールで解析します。文書型宣言によって解析ルールを切り替える、なんて器用なことはしてくれません(もちろん、文書型宣言の有無だけはモード切替のスイッチになります)。これによって、全てのブラウザは同じ DOM 木を構築する「はず」です。 HTML(5) のルール上、<input radio>、<input checkbox>、<input button> などは未知の論理型属性として無視されます(将来的にそれらが追加される可能性を考慮して、内部的に保存はされる)。つまり、<input my-extend-attr="my-extend-attr"> のように書いたのと同じことです。
お礼
>No.2 にも書きましたが、タグ短縮をマトモにサポートしているブラウザなんてありませんよ。 すみません。理解不足でした。 スッキリしました。ありがとうございました。 (それにしても本当にお詳しいですね。敬服します)
- t_ohta
- ベストアンサー率38% (5238/13705)
HTML4の場合は checked と記述するだけでよく、XHTMLの場合は checked="checked" と記述しなければいけません。 質問者さんが示されている HTML4のDTDでもcheckedの値は括弧書きで書かれている通りオプション扱いですので省略可能です。 HTML5でも今の所は属性名だけの記述で良いという解釈のようです。
- 参考URL:
- http://www.w3.org/TR/html5/
お礼
ありがとうございました。
お礼
>列挙値の場合、属性名を省略して良い。 これはびっくりしました。「<input type="radio" checked>」等とだけ書いた場合、省略されているのは値だと思い込んでいました。しかしそうではなく属性名が省略されているのですね。 >HTML(5) に DTD はありません。HTML(5) は SGML でも XML でもない、第三の形式です。 おお、そうなんですか。以前自分でHTML5のDTDを探した時もあったのですが、どうしても見つかりませんでした。そもそも無いのですね。というか本来はDTDが適用されるべき対象ではなくなっているのですね。 少し難しかったのですが大変参考になりました。 ありがとうございました。
補足
属性名の省略を試してみようと ・<input radio> ・<input checkbox> ・<input button> を書いたHTMLで試してみたのですが、FireFox11/Chrome18/IE8では認識しませんでした…。(すべてデフォルト値「type="text"」として処理されてしまいました) 属性名の省略として正式にサポートしているブラウザはないのですかね?(昔はあった?)