属性値//正規化

属性値

[1] 一般に、「属性」と呼ばれるものののことを属性値 (ぞくせいち) (attribute value) といいます。

属性値 (HTML)

歴史

[67] XHTML 1.0 の互換性指針は、 属性値表記改行や複数の空白を入れると実装によって扱いが違うので好ましくないとしています。

[5] [whatwg] Allowing ">" in attribute values ( 版) http://lists.whatwg.org/pipermail/whatwg-whatwg.org/2010-August/027792.html

属性値 (XML)

仕様書

正規化

[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

  1. [70] XML//空白にあるように、改行は #xA に変換されている。ここから処理を開始する。
  2. [61] 最初から最後に向かって順に、次の処理を施す。
    • 文字参照は、その参照する文字とする。
    • 一般実体参照は、その置換文について、再帰的に >>61 の処理を行う。
    • 空白文字 (#x20, #xA, #xD, #x9) は、 #x20 とする。
    • その他の文字は、そのままとする。
  3. 属性値の型が CDATA 以外の場合は、更に
    • 先頭及び末尾に現れる SPACE を全て無視する。
    • 2個以上連続する #x20 を1個の #x20 に置換する。

[69] なお、宣言されていないか読まれていない属性の型は、 CDATA として扱います。

[66] 幸いなことに、 >>60 の規定は XML 1.1 では変更されませんでした。ただし >>70 のステップで U+000A に変換されている符号位置は増えています。

[72] 文字参照として (実体参照を介さず) 直接記述されている場合にのみ、 U+000DU+0009U+000A の3つの符号位置正規化値に含まれることがあります。

SGML との関係

[63] XML でも、 SGML 同様に属性値の構文一致 (妥当性制約。) が求められるのは正規化後の値です。 その辺、 XML 中核作業部会も認識が甘かったらしく、 二転三転の修正があったりしました。 http://www.w3.org/XML/xml-V10-2e-errata#E20

[64] ところで、 >>62 の3番目の例に示されていること、 つまり属性値表記に直接記述された数値文字参照の参照値が正規化の対象にならず、 #xD とかがそのまま残る、というのは SGML と話が全然違いませんか? Web SGML にも、こういう解釈が出来るという話は書かれていない気がしますが。

[65] >>64 は、次の例のような場合です。

<!ENTITY foo "あいうえお&#x0A;">
<element attr="&foo;"/>

>>59 の手順に従うなら、 attr の値は、あいうえお#x0A となり、 #x0ARS なので、無視されてあいうえおになるはずです。

ところが、 >>60 の手順に従うと、 あいうえお#x0Aあいうえお#x20 にならなければいけません。

XML で #x0ARS でないのなら、何も問題ではありませんが・・・。

DOM との関係

[68] Firefox でも Chrome でも、XML文書を読み込んだ直後に現れる Attrvalue正規化値のようです。

[62] XML 1.0 仕様書にある例:

<!ENTITY d "&#xD;">
<!ENTITY a "&#xA;">
<!ENTITY da "&#xD;&#xA;">

.属性指定 ,a が CDATA で,==

ないある
a="#xD#xAxyz"x y z#x20 #x20 x y z
a="&d;&d;A&a;&#x20;&a;B&da;"A #x20 B#x20 #x20 A #x20 #x20 #x20 B #x20 #x20

.a="&#xd;&#xd;A&#xa;&#xa;B&#xd;&#xa;" ,#xD #xD A #xA #xA B #xD #xA ,#xD #xD A #xA #xA B #xD #xD

属性値 (SGML)

[2] SGML の世界で属性値と言うと、 文脈によって2つの意味があります。 一つは、一般に、属性 (1)。 もう一つは、生成規則属性値 (2) です。

SGML文書では、属性の値は、 属性値指定で指定されます。 属性値指定は、属性値2属性値表記の二種類があります。 属性値2 (例: value) も属性値表記 (例: "value") も構文が違うだけで、 属性値1 (例: value) を表すという点では同じです。

[4] ふと、まさか属性値指定属性値のとき、NAMECASE によっては大文字化されるのではと思いましたが、 仕様をよく読んでみるとそんなことは全然ありませぬな。 名前字句なら大文字化されてしまうけど、 属性値は (実質的に構文はまったく同じながら) そうはならないようで。 (もちろん、属性型によっては大文字化がなされる。)

正規化

[59] 属性値表記属性値として解釈するに当たっては、

  1. lit 又は lita を取り除く。
  2. 参照 (文字参照及び一般実体参照) を置換する。
  3. Ee 及び RS を無視する。
  4. RE 又は SEPCHARSPACE に置換する。

という手順を経ます。なお、属性値表記の内容は、その属性がどんな宣言されていようと、 このように解釈されます。 ですから、例えば id="&id;" のような属性値指定は間違いではありません。

属性値の型が CDATA 以外の場合は、更に

  1. 2個以上連続する SPACE を1個の SPACE に置換する。
  2. 先頭及び末尾に現れる SPACE を無視する。

空白文字が元々存在していたのが CDATA 実体だろうが SDATA 実体だろうが、この通りに処理されます。 (以上、 JISX4151‐1992 6.9.3 参照。)

実際に属性値として使用することが出来るのは、 以上の処理の結果得られた値です。 型ごとに決められた構文への一致が求められたり、 「属性値の正規の長さ」の算出の元になるのはこの値であって、 元の表記の値ではありません。

属性値 (MathML)

仕様書

空白の扱い

[6] MathML では、応用ごとに空白正規化が異なることを理由に、属性値の中の各部分を区切るときは空白文字 (whitespace character) を1文字だけ使うことを勧めて (advisable) います。更に、空白を最初や最後に置くことは避けるべき (should) であるとしています。 >>7

数値と値域

[8] 数値を扱う属性のほとんどでは、構文的に表現可能な数値のうちの一部分しか意味がありませんが、それ以外の値を指定したとしても、特に規定が無い限り誤り (error) とはされません。 範囲外の値は切捨て切上げによって丸められて最も近い適切な値として扱われます。 このときの「適切な値」の範囲や、切捨て切上げのどちらを選択するかは、 MathML ではなくレンダリンク器 (renderer) により決められるとされています。 これは、構文的に - をつけることが認められている integernumber属性値であって、の値が意味を持たない場合も含んでいます。 >>7

[9] この丸めlength でも認められています。

value 属性 (DOM Attr 界面)

[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 SEDOM水準2DOM水準3によると、節点読取専用なら NO_MODIFICATION_ALLOWED_ERR です。

[12] Attr インターフェイスには value, nodeValue, textContent の3つのIDL属性があり、 ほとんど同じですが、後の2つだけは TreatNullAs=Empty となっています。 JavaScript では null を設定した時に value なら文字列 null になり、それ以外なら空文字列になります。

実装

[36] WinIE 6Attr.value指定されていないと null になりますが、 内在事象属性ではなぜか文字列の 'null' になります。 nodeValue では両方 null になります。

(名無しさん 2005-09-03 11:14:50 +00:00)

XML 情報集合との関係

[37] Attr.valueXML情報集合正規化値に対応するとされています。

Attr.valueNode.nodeValue (等価) は構文解析器から渡された正規化値が最初の値になると明記もされています。 その一方で、実体参照属性値に含まれる場合は実装と読み込みのオプションに依存するともされています。

ちなみに、Node.textContentは定義が少し異なっていて、子供textContent連接とされています。

XML では、属性値表記内で参照されている実体 (の実体値) に空白文字が含まれている場合は、 SPACE正規化するとしています。

DOMEntityReferenceは対応するEntityと同じ子孫を持つ、ただし名前空間に関する場合だけ例外だ、とされています。

そして正規化が行われるときEntityReferenceが問題になるかもとは書いてありますが、その時どうしろとはいっていません。

以上を踏まえた上で、DOM属性値内の一般実体参照EntityReferenceにする場合、正規化はどうしたらよいのでしょう??

[38] EntityReferenceは使わないというのが、一番楽で正当な方法。

実体参照が入ったら属性値正規化は諦めるというのが、楽なものの邪道な方法。

Attr子供EntityReferenceだけはtextContent空白文字SPACEに置き換えてvalue (nodeValue, getAttribute, ...) を作るというのが、面倒だけどあまり不都合なくうまく動きそうな方法。 ただしAttr.textContentAttr.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 &#xA; ( ( 版)) 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

[18] [CITE@”ja”[【論調比較・サマータイム】日経はシステム改修の問題を詳報 | News Socra (ニュース ソクラ)]] () https://socra.net/society/%E3%80%90%E8%AB%96%E8%AA%BF%E6%AF%94%E8%BC%83%E3%83%BB%E3%82%B5%E3%83%9E%E3%83%BC%E3%82%BF%E3%82%A4%E3%83%A0%E3%80%91%E6%97%A5%E7%B5%8C%E3%81%AF%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E6%94%B9%E4%BF%AE/

<html lang=”ja”>