[1] 一般に、「属性」と呼ばれるものの値のことを属性値といいます。
[67] XHTML 1.0 の互換性指針は、 属性値表記に改行や複数の空白を入れると実装によって扱いが違うので好ましくないとしています。
[5] [whatwg] Allowing ">" in attribute values ( 版) http://lists.whatwg.org/pipermail/whatwg-whatwg.org/2010-August/027792.html
[60] XML でも、大体は素の SGML と同じように処理されます。 Extensible Markup Language (XML) 1.0 3.3.3 Attribute-Value Normalization http://www.w3.org/TR/REC-xml#AVNormalize, http://www.w3.org/XML/xml-V10-2e-errata#E6
[69] なお、宣言されていないか読まれていない属性の型は、
CDATA
として扱います。
[66] 幸いなことに、 >>60 の規定は XML 1.1 では変更されませんでした。ただし >>70 のステップで
U+000A
に変換されている符号位置は増えています。
[72] 文字参照として (実体参照を介さず) 直接記述されている場合にのみ、
U+000D
、
U+0009
、U+000A
の3つの符号位置が正規化値に含まれることがあります。
[63] XML でも、 SGML 同様に属性値の構文一致 (妥当性制約。) が求められるのは正規化後の値です。 その辺、 XML 中核作業部会も認識が甘かったらしく、 二転三転の修正があったりしました。 http://www.w3.org/XML/xml-V10-2e-errata#E20
[64] ところで、 >>62 の3番目の例に示されていること、
つまり属性値表記に直接記述された数値文字参照の参照値が正規化の対象にならず、
#xD
とかがそのまま残る、というのは
SGML と話が全然違いませんか? Web SGML
にも、こういう解釈が出来るという話は書かれていない気がしますが。
<!ENTITY foo "あいうえお
">
<element attr="&foo;"/>
>>59 の手順に従うなら、 attr の値は、あいうえお
となり、 #x0A
#x0A
は RS
なので、無視されてあいうえお
になるはずです。
[68] Firefox でも Chrome でも、XML文書を読み込んだ直後に現れる Attr
の value
は正規化値のようです。
[62] XML 1.0 仕様書にある例:
<!ENTITY d "
"> <!ENTITY a "
"> <!ENTITY da "
">
.属性指定 ,a が CDATA
で,==
ない | ある | |
a="#xD #xA xyz" | x y z | #x20 #x20 x y z |
a="&d;&d;A&a; &a;B&da;" | A #x20 B | #x20 #x20 A #x20 #x20 #x20 B #x20 #x20 |
.a="

A

B
" ,#xD #xD A #xA #xA B #xD #xA ,#xD #xD A #xA #xA B #xD #xD
[2] SGML の世界で属性値
と言うと、
文脈によって2つの意味があります。
一つは、一般に、属性の値 (1)。
もう一つは、生成規則属性値
(2) です。
SGML文書では、属性の値は、
属性値指定
で指定されます。
属性値指定
は、属性値
2と属性値表記
の二種類があります。
属性値
2 (例: value)
も属性値表記
(例: "value")
も構文が違うだけで、
属性値1 (例: value
) を表すという点では同じです。
[4]
ふと、まさか属性値指定
が属性値
のとき、NAMECASE
によっては大文字化されるのではと思いましたが、
仕様をよく読んでみるとそんなことは全然ありませぬな。
名前字句
なら大文字化されてしまうけど、
属性値
は (実質的に構文はまったく同じながら) そうはならないようで。
(もちろん、属性型によっては大文字化がなされる。)
という手順を経ます。なお、属性値表記の内容は、その属性がどんな型と宣言されていようと、 このように解釈されます。 ですから、例えば id="&id;" のような属性値指定は間違いではありません。
属性値の型が CDATA
以外の場合は、更に
空白文字が元々存在していたのが CDATA
実体だろうが SDATA
実体だろうが、この通りに処理されます。
(以上、 JISX4151‐1992 6.9.3 参照。)
実際に属性値として使用することが出来るのは、 以上の処理の結果得られた値です。 型ごとに決められた構文への一致が求められたり、 「属性値の正規の長さ」の算出の元になるのはこの値であって、 元の表記の値ではありません。
[6] MathML では、応用ごとに空白の正規化が異なることを理由に、属性値の中の各部分を区切るときは空白文字を1文字だけ使うことを勧めています。更に、空白を最初や最後に置くことは避けるべきであるとしています。 >>7
[8] 数値を扱う属性のほとんどでは、構文的に表現可能な数値のうちの一部分しか意味がありませんが、それ以外の値を指定したとしても、特に規定が無い限り誤りとはされません。
範囲外の値は切捨てや切上げによって丸められて最も近い適切な値として扱われます。
このときの「適切な値」の範囲や、切捨てや切上げのどちらを選択するかは、 MathML
ではなくレンダリンク器により決められるとされています。
これは、構文的に -
をつけることが認められている integer
や number
の属性値であって、負の値が意味を持たない場合も含んでいます。
>>7
[55] 属性 Attr.
の値は、その属性節の属性値です。value
設定する値・得られる値の型は DOMString
です。その属性節の子節は複数個の文節や実体参照節があるかもしれませんが、
一つの文字列として設定又は取得します。
値を設定した時は、子節は一つの文節になります。
[56] この属性は method
Element.
,
getAttribute
Element.
と同様に機能します。setAttribute
[11] >>56 というか nodeValue
だよなあ、
もろ同じじゃない? なんで2つあるんだろう。どっちかは正規化するとかでもないみたいだし。
[57] 属性節が読取専用の時は当然値を設定することはできません。
例外 NO_MODIFICATION_ALLOWED_ERR
が発生します。
[54]
DOM水準1 FE の正誤表、DOM水準1 SE、
DOM水準2、DOM水準3によると、節点が読取専用なら
NO_MODIFICATION_ALLOWED_ERR
です。
[12] Attr
インターフェイスには
value
, nodeValue
,
textContent
の3つのIDL属性があり、
ほとんど同じですが、後の2つだけは TreatNullAs=Empty
となっています。 JavaScript では null
を設定した時に value
なら文字列 null
になり、それ以外なら空文字列になります。
[36]
WinIE 6 の Attr.
はvalue
指定
されていないと
null
になりますが、
内在事象属性ではなぜか文字列の 'null'
になります。
nodeValue
では両方
null
になります。
(名無しさん 2005-09-03 11:14:50 +00:00)
[37]
はXML情報集合でAttr
.value
正規化値
に対応するとされています。
と
Attr
.value
(等価) は構文解析器から渡された正規化値が最初の値になると明記もされています。
その一方で、実体参照が属性値に含まれる場合は実装と読み込みのオプションに依存するともされています。Node
.nodeValue
ちなみに、
は定義が少し異なっていて、子供のNode
.textContent
textContent
の連接とされています。
XML では、属性値表記内で参照されている実体
(の実体値) に空白文字が含まれている場合は、
SPACE
に正規化するとしています。
DOMのEntityReference
は対応するEntity
と同じ子孫を持つ、ただし名前空間に関する場合だけ例外だ、とされています。
そして正規化が行われるときEntityReference
が問題になるかもとは書いてありますが、その時どうしろとはいっていません。
以上を踏まえた上で、DOMで属性値内の一般実体参照をEntityReference
にする場合、正規化はどうしたらよいのでしょう??
[38]
EntityReference
は使わないというのが、一番楽で正当な方法。
実体参照が入ったら属性値の正規化は諦めるというのが、楽なものの邪道な方法。
Attr
の子供のEntityReference
だけはtextContent
の空白文字をSPACE
に置き換えてvalue
(nodeValue
, getAttribute
, ...) を作るというのが、面倒だけどあまり不都合なくうまく動きそうな方法。
ただし
とAttr
.textContent
が違ってしまうのがちょっとアレ。Attr
.value
[58] 各ブラウザのクォートの URL エンコード状況 / [win][HTTP] | 戯術者の日記 ( ( 版)) http://www.jp-z.jp/changelog/2004-12-07-1.html
[75] Clarify Attr.prototype.value's setter · 2b8a26c · whatwg/dom ( ( 版)) https://github.com/whatwg/dom/commit/2b8a26c742edf0520ba96f63dcf2fd6e8a594c55
[76] Put Attr.prototype.ownerElement back; give Attr.prototype.value a setter... · f64b0c8 · whatwg/dom ( ( 版)) https://github.com/whatwg/dom/commit/f64b0c82896d68ad534544ed8109ac41c175840d
[77] 169521 – newline in XML attributes should be serialized as 
 ( ( 版)) https://bugzilla.mozilla.org/show_bug.cgi?id=169521
[78] IRC logs: freenode / #whatwg / 20140929 ( ( 版)) http://krijnhoetmer.nl/irc-logs/whatwg/20140929
[10] Add [TreatNullAs=EmptyString] to Attr.nodeValue/textContent · whatwg/dom@df9901c ( 版) https://github.com/whatwg/dom/commit/df9901c05ea6a966925cc2ec110c9e8779ca4526
[13] Editorial: clarify value space of attribute values · whatwg/html@ca5ae09 ( 版) https://github.com/whatwg/html/commit/ca5ae09610eb5af3b3b8bf4e3f9cf1af14bc73a8
[14] Add [CEReactions] annotations to mutating methods · whatwg/dom@3cd02d1 ( 版) https://github.com/whatwg/dom/commit/3cd02d139c159a31fbb400e03932652c72fc7812
[15] Make Attr inherit from Node again (annevk著, ) https://github.com/whatwg/dom/commit/625a0747f137454c155a7b577a9e45be1aa35a34
[16] Editorial: use noncharacter and control from Infra (annevk著, ) https://github.com/whatwg/html/commit/70925237a88d9802bfe7224fe9c78b146af615be
[17] SVG should specify what CSS attribute selectors and class selectors match on · Issue #328 · w3c/svgwg () https://github.com/w3c/svgwg/issues/328