[1] 一般に、「[[属性]]」と呼ばれるものの[[値]]のことを[DFN[[RUBY[属性値][ぞくせいち]@en[attribute value]]]]といいます。 * 属性値 (HTML) [5] [CITE['''['''whatwg''']''' Allowing ">" in attribute values]] ([TIME[2010-08-10 09:35:29 +09:00]] 版) * 属性値 (SGML) [2] [[SGML]] の世界で[Q[属性値]]と言うと、 文脈によって2つの意味があります。 一つは、一般に、[[属性]]の[[値]] (1)。 もう一つは、生成規則[CODE[属性値]] (2) です。 [[SGML文書]]では、属性の値は、 [CODE[[[属性値指定]]]]で指定されます。 [CODE[属性値指定]]は、[CODE[属性値]][SUP[2]]と[CODE[[[属性値表記]]]]の二種類があります。 [CODE[属性値]][SUP[2]] (例: [SAMP(SGML)[value]]) も[CODE[属性値表記]] (例: [SAMP(SGML)["value"]]) も構文が違うだけで、 属性値[SUP[1]] (例: [Q[value]]) を表すという点では同じです。 - [3] [CODE(ABNF)[[DFN[属性値]][SUP[2]] := 1*[[名前文字]]]] [4] ふと、まさか[CODE(ABNF)[属性値指定]]が[CODE(ABNF)[属性値]]のとき、[CODE(SGML)[[[NAMECASE]]]] によっては大文字化されるのではと思いましたが、 仕様をよく読んでみるとそんなことは全然ありませぬな。 [CODE(ABNF)[[[名前字句]]]]なら大文字化されてしまうけど、 [CODE(ABNF)[属性値]]は (実質的に構文はまったく同じながら) そうはならないようで。 (もちろん、属性型によっては大文字化がなされる。) * 属性値 (MathML) ** 仕様書 - [7] [CITE[MathML Fundamentals]] ([TIME[2010-10-21 05:51:46 +09:00]] 版) ** 空白の扱い [6] [[MathML]] では、[[応用]]ごとに[[空白]]の[[正規化]]が異なることを理由に、[[属性値]]の中の各部分を区切るときは[RUBYB[[[空白]][[文字]]]@en[whitespace character]]を1文字だけ使うことを[RUBYB[勧めて]@en[advisable]]います。更に、[[空白]]を最初や最後に置くことは避ける[RUBYB[べき]@en[should]]であるとしています。 [SRC[>>7]] ** 数値と値域 [8] [[数値]]を扱う[[属性]]のほとんどでは、構文的に表現可能な[[数値]]のうちの一部分しか意味がありませんが、それ以外の値を指定したとしても、特に規定が無い限り[RUBYB[[[誤り]]]@en[error]]とはされません。 範囲外の値は[[切捨て]]や[[切上げ]]によって[[丸め]]られて最も近い適切な値として扱われます。 このときの「適切な値」の範囲や、[[切捨て]]や[[切上げ]]のどちらを選択するかは、 [[MathML]] ではなく[RUBYB[[[レンダリンク器]]]@en[renderer]]により決められるとされています。 これは、構文的に [CODE(char)[[[-]]]] をつけることが認められている [CODE[[[integer]]]] や [CODE[[[number]]]] の[[属性値]]であって、[[負]]の値が意味を持たない場合も含んでいます。 [SRC[>>7]] [9] この[[丸め]]は [CODE[[[length]]]] でも認められています。 * value 属性 (DOM Attr 界面) [55] 属性 [CODE[[VAR(DOMi)[[[Attr]]]].[CODE(DOMa)[value]]]] の値は、その属性節の[[属性値]]です。 設定する値・得られる値の型は [CODE(DOM)[[[DOMString]]]] です。その属性節の子節は複数個の文節や実体参照節があるかもしれませんが、 一つの文字列として設定又は取得します。 値を設定した時は、子節は一つの文節になります。 [56] この属性は method [CODE[[VAR(DOMi)[[[Element]]]].[CODE(DOMm)[[[getAttribute]]]]]], [CODE[[VAR(DOMi)[Element]].[CODE(DOMm)[[[setAttribute]]]]]] と同様に機能します。 [11] >>56 というか [CODE(DOMa)[[[nodeValue]]]] だよなあ、 もろ同じじゃない? なんで2つあるんだろう。どっちかは正規化するとかでもないみたいだし。 [57] 属性節が読取専用の時は当然値を設定することはできません。 例外 [CODE(DOM)[NO_MODIFICATION_ALLOWED_ERR]] が発生します。 - [DOM2] ''Document Object Model Core'' [54] [[DOM水準1]] [[FE]] の[[正誤表]]、[[DOM水準1]] [[SE]]、 [[DOM水準2]]、[[DOM水準3]]によると、[[節点]]が[[読取専用]]なら [CODE(DOMc)@en[[[NO_MODIFICATION_ALLOWED_ERR]]]] です。 ** 実装 [36] [[WinIE 6]] の [CODE(DOM)@en[[VAR(DOMi)[[[Attr]]]].[CODE(DOMa)[[[value]]]]]] は[CODE(InfoProp)@en[[[指定]]]]されていないと [CODE(DOM)@en[[[null]]]] になりますが、 [[内在事象属性]]ではなぜか文字列の [CODE(JS)@en['[[null]]']] になります。 [CODE(DOM)@en[[[nodeValue]]]] では両方 [CODE(DOM)@en[[[null]]]] になります。 ([[名無しさん]] [WEAK[2005-09-03 11:14:50 +00:00]]) ** XML 情報集合との関係 [37] [CODE(DOM)@en[[CODE(DOMi)@en[[[Attr]]]].[CODE(DOMa)[[[value]]]]]] は[[XML情報集合]]で[CODE(InfoProp)[[[正規化値]]]]に対応するとされています。 ;; [CODE(DOM)@en[[CODE(DOMi)[[[Attr]]]].[CODE(DOMa)[[[value]]]]]] と [CODE(DOM)@en[[CODE(DOMi)[[[Node]]]].[CODE(DOMa)[[[nodeValue]]]]]] (等価) は[[構文解析器]]から渡された[[正規化値]]が最初の値になると明記もされています。 その一方で、[[実体参照]]が[[属性値]]に含まれる場合は実装と読み込みのオプションに依存するともされています。 ;; ちなみに、[CODE(DOM)@en[[CODE(DOMi)@en[[[Node]]]].[CODE(DOMa)@en[[[textContent]]]]]]は定義が少し異なっていて、[[子供]]の[CODE(DOMa)@en[[[textContent]]]]の[[連接]]とされています。 ;; [[XML]] では、[[属性値表記]]内で[[参照]]されている[[実体]] (の[[実体値]]) に[[空白]][[文字]]が含まれている場合は、 [CODE(charname)@en[[[SPACE]]]] に[[正規化]]するとしています。 ;; [[XML//空白]] [[DOM]]の[CODE(DOMi)@en[[[EntityReference]]]]は対応する[CODE(DOMi)@en[[[Entity]]]]と同じ[[子孫]]を持つ、ただし[[名前空間]]に関する場合だけ例外だ、とされています。 そして[[正規化]]が行われるとき[CODE(DOMi)@en[[[EntityReference]]]]が問題になるかもとは書いてありますが、その時どうしろとはいっていません。 ;; 以上を踏まえた上で、[[DOM]]で[[属性値]]内の[[一般実体参照]]を[CODE(DOMi)@en[[[EntityReference]]]]にする場合、[[正規化]]はどうしたらよいのでしょう?? [38] [CODE(DOMi)@en[[[EntityReference]]]]は使わないというのが、一番楽で正当な方法。 [[実体参照]]が入ったら[[属性値]]の[[正規化]]は諦めるというのが、楽なものの邪道な方法。 [CODE(DOMi)@en[[[Attr]]]]の[[子供]]の[CODE(DOMi)@en[[[EntityReference]]]]だけは[CODE(DOMa)@en[[[textContent]]]]の[[空白]][[文字]]を[CODE(charname)@en[[[SPACE]]]]に置き換えて[CODE(DOMa)@en[[[value]]]] ([CODE(DOMa)@en[[[nodeValue]]]], [CODE(DOMm)@en[[[getAttribute]]]], ...) を作るというのが、面倒だけどあまり不都合なくうまく動きそうな方法。 ただし[CODE(DOM)@en[[CODE(DOMi)[[[Attr]]]].[CODE(DOMa)@en[[[textContent]]]]]]と[CODE(DOM)@en[[CODE(DOMi)[[[Attr]]]].[CODE(DOMa)@en[[[value]]]]]]が違ってしまうのがちょっとアレ。 [58] [CITE@Ja[各ブラウザのクォートの URL エンコード状況 / ''''''[''''''win'''''']'''''''''['''HTTP''']''' | 戯術者の日記]] ( ([TIME[2012-06-20 01:50:19 +09:00]] 版))