CSS Namespaces

@namespace 規則 (CSS)

[35] CSS@namespace @規則は、名前空間接頭辞を宣言すると共に、 名前空間URLと関連付けます >>30 3.

仕様書

意味

[32] CSS名前空間は、 XML名前空間を使った要素属性を表すために使うことができます。 しかし、 XML名前空間以外の名前空間に対して適用することもできます >>30 2.1.

[36] @namespace宣言した名前空間接頭辞は、 CSS修飾名で使うことができるようになります >>30 3., 3.3

[39] 名前空間接頭辞自体に意味はなく、展開名 (名前空間URL局所名の組) に意味があります >>30 3.

[40] ですから、 XML文書

<qml:elem xmlns:qml="http://example.com/q-markup"></qml:elem>

... と CSS スタイル・シート

@namespace Q "http://example.com/q-markup";
@namespace lq "http://example.com/q-markup";

... があるとき、型選択子 Q|elemlq|elem はいずれも (名前空間接頭辞こそ異なりますが、名前空間URL局所名が同じなので) 先の要素と一致します。型選択子 qml|elem は、 CSS において名前空間接頭辞宣言されていないので、非妥当となります。 >>30 3.

[57] 名前空間接頭辞を省略すると、既定名前空間名前空間URLを宣言していることになります >>30 3.3.

構文

[50] @namespace @規則の構文は次のように定義されています >>30 3.1.

[51] @namespcae は、 @charset@import よりも後、 無視されない他の@規則規則集合よりも前になければなりません >>30 3.1.

[52] 構文的に非妥当@namespace無視なければなりません >>30 3.1.非妥当@namespace を含むスタイル・シート妥当なスタイル・シートではありません >>30 3.1.

[66] 構文的に非妥当な宣言には、 @namespace の後が前記の構文に沿ってないものや、 他の@規則よりも後にある @namespace や他の規則集合@規則の中に含まれている @namespace が該当するのでしょう。

[65] 同じ名前空間接頭辞を複数回宣言したり、既定名前空間を複数回宣言したりするのは不適合です。 利用者エージェントは複数回宣言されている場合には最後の宣言だけを使わなければなりません>>30 3.3.

構文解析

[10] 空白の扱いのテスト用:

[13] 規則集合の後の @namespace無視しなければなりません。

[14] >>13 のテスト用:

[15] >>13-14 Firefox 2 は正しいですが、 Opera 9 は無視しないみたいです。

適用範囲

[55] @namespace で宣言された名前空間接頭辞適用範囲は当該スタイル・シートです。 @import などによって他のスタイル・シートに波及することはありません。 >>30 3.2

[56] 明記されていませんが、既定名前空間も同じだと思われます。

名前空間接頭辞

[58] 名前空間接頭辞大文字・小文字を区別します >>30 3.3.

[59] 以前は大文字・小文字を区別しないとされていました。

[16] 大文字小文字の区別のテスト用:

[17] >>16 Firefox 2、Opera 9 とも、 大文字小文字の扱いは正しいです。

Firefox 2 は @namespacecssText名前空間接頭辞の部分を小文字正規化し、 それを参照している selectorText でも小文字正規化するようです。

一方 Opera 9 は、より後に出てきた @namespace で使われている大文字小文字の使い方を selectorText で採用するようです。

[18] >>16-17 Firefox 2, Opera 9 とも、 Unicode大文字小文字不区別のようです。 (名無しさん)

[19] 大文字小文字以外の違いがある、同じ名前空間URI名前空間接頭辞 (や既定名前空間) が複数定義されている場合、 selectorText で使われるのは、

(名無しさん)

[20] Firefox 2 の insertRuledeleteRuleselectorText名前空間接頭辞の解釈についての推測

実験用:

[74] Chrome では名前空間接頭辞が宣言されてなくても CSSOMスタイル規則が現れます。 ただし適用はされません。 (Firefox では仕様通り CSSOM に現れません。)

既定名前空間

[60] 既定名前空間は、名前空間接頭辞が明示されていない名前に対して適用されます >>30 3.3.

[61] 例えば型選択子名前空間接頭辞がない時に既定名前空間が適用されます。 しかし属性選択子は同じように見えても既定名前空間は適用されません。

[62] 既定名前空間の既定値はありません。名前空間接頭辞がなく、既定名前空間も指定されていない時、 どう解釈されるかはそれぞれの文脈によって定められていなければなりません>>30 3.3.

[63] 例えば型選択子では既定名前空間が指定されていなければ * と同じ意味になると定義されています。

[64] なお、既定名前空間が指定されていると @namespace に対応している利用者エージェントと対応していない利用者エージェント型選択子の解釈が変わってしまいます。

名前空間 URL

[53] 名前空間URISTRING として指定されている場合であっても URI (url()) として指定されている場合であっても、 URL としての正規化などは行われません >>30 3.1

[54] 名前空間URL空文字列URL として非妥当であったとしても、 @namespace としては妥当です >>30 3.1

[22] Firefox 2 も Opera 9 も、名前空間URI の前後の空白を除去しません (正しい動作)。

相対 URL

[6] Firefox 2 も Opera 9 も、勝手に名前空間URI絶対URI参照解決したりなんてことはしないようです。

Opera 9 検証用 (Firefox 2 では base が機能しない):

前者は背景画が描画されるが、後者はされないことでわかる。

空文字列 URL

[33] 空文字列名前空間URLを指定することは、null名前空間 (名前空間なし) を指定するのと同じことです >>30 2.1.

[34] 従って

@namespace empty "";
@namespace "";

... という状態で elem (既定名前空間要素), |elem (null名前空間要素), empty|elem という型選択子はいずれも同じ意味となります >>30 2.1.

Firefox 2 では赤色、 Opera 9 では緑色になります。 Firefox名前空間URI空文字列だと指定しなかったのと同義とみなし、 Opera空文字列名前空間URIが指定されているとみなすようです。 (名無しさん)

[8] @namespace x ; <http://suika.fam.cx/gate/2007/cssom/viewer?c=%40namespace%20x%20''%3B%0Ax%7Cp%20%7B%0A%20%20color%3A%20green%3B%0A%7D%0A;h=%3Cp%3Exxxx;p=n;x=style-element>

Opera 9 は名前空間接頭辞が宣言されていないとみなします。

Firefox 2 は名前空間接頭辞null名前空間と関連付けられているとみなすようです。 selectorText では名前空間接頭辞空文字列正規化 (|p) されています。 (名無しさん)

[9] >>8 Opera名前空間URI空文字列だと @namespace 規則自体を無視しているようです。

<http://suika.fam.cx/gate/2007/cssom/viewer?c=%40namespace%20x%20''%3B%0A%40namespace%20x%20'x'%3B%0A%40namespace%20x%20''%3B%0Ax%7Cp%20%7B%0A%20%20color%3A%20green%3B%0A%7D%0A;h=%3Cp%3Exxxx;p=n;x=style-element>Firefox 2 だとnull名前空間Opera 9 だと x だとみなします。

CSSOM

[4] Opera 9 では CSSOMcssText に現れません。

CSSRule

[3] Firefox 2 では、 UNKNOWN_RULE として CSSOM]] に現れます (UNKNOWN_RULE の項を参照)。

[5] CSSOM ED では NAMESPACE_RULE という新しい定数が定義されています。

無視される規則の扱い

[11] Firefox 2 は、重複により無視される @namespace 規則CSSOM に出現させます。

[12] >>11 のテスト用:

応用

[67] @namespace で宣言された名前空間接頭辞既定名前空間が使われる場所:

歴史

[1] CSS Module: Namespaces <http://www.w3.org/TR/2006/WD-css3-namespace-20060828/>

[2] CSS3 Module: Namespace Declarations (2007-09-27 06:34:33 +09:00 版) <http://dev.w3.org/cvsweb/~checkout~/csswg/css3-namespace/Overview.html>

[71] CSS Namespaces Module ( 版) <http://dev.w3.org/cvsweb/~checkout~/csswg/css3-namespace/Overview.src.html>

[29] CSS Namespaces Module ( 版) <http://dev.w3.org/csswg/css3-namespace/>

[21] CSS Namespaces Module (2008-02-16 03:06:01 +09:00 版) <http://www.w3.org/TR/2008/WD-css3-namespace-20080215/>

[23] CSS Namespaces Module ( 版) <http://www.w3.org/TR/2008/CR-css3-namespace-20080523/>

[24] From the North — Anne’s Weblog ( 版) <http://annevankesteren.nl/2009/02/css-namespaces>

Lately I’ve been working on the CSS Namespaces Module Test Suite (not exclusively). @namespace must be one of the most pointless pieces of CSS syntax. Normal authors are not actually using namespaces in Web content. If MathML and SVG become more popular it is still not necessary because they work with scoped trees. RDFa hides namespaces in attribute values and therefore does not play well with the DOM or CSS per definition. I heard we use @namespace for something in the mail client. Some user agents use it in their user agent style sheet. HTML5 uses it to describe certain rendering rules. Yay! Definitely sounds like something that needs to be standardized including spending all the resources it takes to get several interoperable implementations. Here is hoping we more carefully consider these things going forward.

[69] CSS Namespaces Implementation Report ( 版) <http://www.w3.org/Style/CSS/Test/CSS3/Namespace/20090210/reports/implement-report.html>

[25] CSS Namespaces Module ( ( 版)) <http://www.w3.org/TR/2011/PR-css3-namespace-20110811/>

[26] CSS Namespaces Module ( ( 版)) <http://www.w3.org/TR/2011/REC-css3-namespace-20110929/>

[31] <http://www.w3.org/TR/css3-namespace/> は現時点で >>26 を指しています。

[27] >>26 の正誤表のリンク先が <http://www.w3.org/Style/2011/REC-css3-color-20110607-errata.html> になっています。面白いですねwwwww

[28] Errata in REC-css3-namespace-20110929 ( ( 版)) <http://www.w3.org/Style/2011/REC-css3-namespace-20110929-errata.html>

[76] >>75 の2014年版のW3C勧告では2011年版勧告と比べて、 qname, wqname, wqwname の3つの生成規則が追加されています。

関連

[68] XML では xml など特定の名前空間接頭辞が暗黙のうちに宣言された状態になっていますが、 CSS ではそのような制約はありません。また xmlns など特別な属性名に関する制約も CSS にはありません。

テスト・ケース

[37]

@namespace "http://www.w3.org/1999/xhtml";

これは名前空間接頭辞が指定されていないので、既定名前空間を設定する宣言となります >>30 3.

[38]

@namespace svg "http://www.w3.org/2000/svg";

これは svg という名前空間接頭辞名前空間URLを設定する宣言です >>30 3.

[72] HTML Editor (page 4) ( ( 版)) <http://www.siteexperts.com/ie5/htmlarea/page4.asp>

[73] HTML Editor (page 4) ( ( 版)) <http://www.siteexperts.com/ie5/htmlarea/page4.asp>

[77] CSS Namespaces Module Level 3 ( ( 版)) <http://www.w3.org/TR/2014/REC-css-namespaces-3-20140320/>

[78] CSS Namespaces Module Level 3 ( ( 版)) <http://www.w3.org/TR/2014/REC-css-namespaces-3-20140320/>