某所で、<a href="〜"><img 〜><a href="〜"></a> なる記述を見付けた。見ての通り </a> が足りない。当然 HTML として invalid なのだが、念の為に裏付けを、と調べてみる。
HTML 2.0 (RFC1866) の場合。
<!ELEMENT A - - %A.content -(A)>9.1. HTML DTD [Page 53]
HTML 3.0 の場合。
<!ELEMENT A - - %A.content -(A)>
HTML 3.2 の場合。
<!ELEMENT A - - (%text)* -(A)>
Anchors can't be nested and always require start and end tags.
HTML 4.01 の場合。
<!ELEMENT A - - (%inline;)* -(A) -- anchor -->
A要素で定めるリンク及びアンカーは、入れ子にしてはならない。すなわちA要素は、他のA要素を内容に含んではならない。
HTML 5 (W3C Working Draft 23 April 2009) の場合。a要素のタグ省略について明確な言及は見付けられなかったが、Optional tags に記述されていないため、おそらく従来の HTML と同様、省略不可。
- Content model:
- Transparent, but there must be no interactive content descendant.
HTML 5 ― HTML 4 からの変更点 (2009 年 4 月 23 日付 W3C 草案 (Working Draft)) によれば、
(
a要素について) これまで phrase content (インライン要素またはテキスト) のみに限定された内容モデルが変更され、flow content (ブロック要素) も含むことができるようになりました。
という変更が施されている。 これは 2009 年 2 月 12 日版で導入された模様。
ちなみに2008 年 1 月 22 日版から2008 年 6 月 10 日版までは Phrasing content, but there must be no interactive content descendant.
だった。
XHTML 1.0 の場合。
a- must not contain other
aelements.
Hypertext Module の Minimal Content Model を見ると
であり、(PCDATA | Inline - a)*a要素が除外されている。
XHTML 2.0 (W3C Working Draft 26 July 2006) の場合。
Hypertext Module の Content Model を見ると
であり、また Text Module は (PCDATA | Text)*a要素を含まない。ただし XHTML 2.0 では href属性はHypertext Attributes Module で定義されている。
If elements contained within an element using an href also use an href attribute, the User Agent must provide a mechanism for actuating any of these "nested" URIs.
HTML Tidy を通すと、
$ cat | tidy 2>&1 | fgrep href
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <title>sample</title> <a href="a">xxx<a href="b">yyyy</a>
閉じタグ </a> が補われた。
<a href="a">xxx</a><a href="b">yyyy</a>