XHTMLを text/html で配信すると、xml:lang属性に対する言語疑似クラス指定が効かない

IE対策として、XHTML文書を text/html で配信しているサイトは多いかと思います。しかし、そういった場合にCSSの言語疑似クラス(W3C) を使うには注意が必要です。

たとえばこんなHTMLの場合。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
<title>言語疑似クラスのテスト</title>
<style type="text/css">
li:lang(en) {
  font-style: italic;
}
</style>
</head>
<body>
<ul>
<li>日本語</li>
<li lang="en">English-1</li>
<li xml:lang="en">English-2</li>
</ul>
</body>
</html>

これを text/html で配信した場合、italic指定が効くのは2番目の(lang属性を指定した)リストのみです。

つまり、XHTML1.1のようにlang属性が使えないバージョンの場合、 application/xhtml+xml に対応していないIEでは実質的に言語疑似クラスを使うことができなくなってしまいます。解決策としては、rubyを使う必要がなければXHTML1.0にするか、仕様違反覚悟でlang属性も併記してしまうか、といったところでしょうか。

  • もっとも、IE7以下は言語疑似クラス自体に対応していないようなので、互換性を重視するなら class="en" を付けるなどして、そもそも言語疑似クラスによるスタイル指定を行わないのが最良かもしれませんが…。