Maya と XHTML その 4 グローバル属性
これまでは元記事の [例 1] が「XHTML 仕様では許されていない」という ASIP さんの指摘について考察してきましたが,今回は [例 2] に進みます.
本当は ASIP さんとの議論でも [例 1] を片づけてから [例 2] へ進みたかったのですが,[例 1] を終えることなく対話拒否されてしまい... 無念だ.
ともあれ,[例 2] に関する元記事は以下の通り.
[例2]<span m:inject="c:out" c:value="hello">
このような記述をMaya的には許しているようだが、XHTML仕様には準拠していない。
最初はそもそも「XHTML 仕様でも XML 仕様でも許されていない」となっていたのですが,それは打ち消されて「XHTML 仕様には準拠していない」に訂正されたようなのですが...
これのどこが「XHTML 仕様には準拠していない」のでしょう?
本人に確認できなかったので確かなことは分かりませんが,[例 1] での議論から推測するに,以下の理由を挙げることが出来るのかな,と.
1 は XHTML 以外の名前空間を許さない厳密適合文書を「正しいXHTMLが仕様として最低限満たすべき」と ASIP さんが解釈していたことからの推測です.そして ASIP さんのその解釈が誤りであることは昨日の「その 3」で見たとおり.
2 については「その 2」で考察したように,ASIP さんが XML 名前空間仕様を正しく理解していなかった (たぶん) ことからの推測です.
他にも何かあるのかな? よく分かりませんが,とりあえず [例 2] を掘り下げていくことにしましょう.
まずは XML と XML 名前空間における属性について復習.
そもそもの XML における属性は,要素に従属するものしか許されていませんでした.例えば
<div id="foo"> <span id="bar"/> </div>
ここで出てくる二つの id
という属性はそれぞれ <div>
および <span>
という要素型に従属したものであり,独立した存在です.もし DTD があるなら,それぞれの属性リスト宣言は独立しています.たまたま名前が同じというだけで別物なのです.XML 文書内では ID 型の属性は一つの名前しか持てないので,この場合はたまたまではなく必然的に同じ名前の属性になるけどそれは別の話ということで.
ともあれ (JW),元の XML 仕様では,複数の要素型にまたがる属性という考え方は存在しませんでした.
そこに XML 名前空間仕様が登場したことによって追加されたのがグローバル属性です.
グローバル属性というのは要素型に従属せずに直接名前空間に従属している属性です.
例えば
<div m:id="foo"> <span m:id="bar"/> </div>
ここで出てくる二つの m:id
という属性は <div>
および <span>
という要素型に従属したものではなく,接頭辞 m で宣言された名前空間に従属するグローバル属性です.これらはたまたま名前が同じ属性が 2 種類あるのではなく,もし名前空間に対応したスキーマ定義があるなら単一の属性リスト宣言として定義されたものになるはずです.ただし,名前空間仕様以前に作られた DTD ではグローバル属性を直接表現することができないので,全ての要素型に個別の属性リスト宣言をしなければならないのだとか.うひゃー.まぁ,どっちみち DTD はまともに名前空間をサポートしていないわけだし...
ともあれ (JW),XML 名前空間によってグローバル属性が導入されたことにより,従来からあった要素型に従属する属性のことをローカル属性と呼ぶようになりました.
これらはそれぞれ独立した「区画」(名前空間の中の名前空間みたいなもの) にあるため,同じ名前のグローバル属性とローカル属性を使うことも出来たりします.これは <div>
および <span>
という要素型がそれぞれ同じ名前の属性を持つことが出来たのと同じようなものです.
そしてグローバル属性を使用する場合には,名前空間接頭辞で修飾しなければなりません.一方でローカル属性は,名前空間接頭辞で修飾してはなりません.
例えば
<x:foo id="foo" x:id="foo"/>
名前空間接頭辞のない属性 id
はローカル属性であり,接頭辞 x で宣言されている名前空間に属する要素型 <foo>
に従属します.間接的にではありますが,名前空間ボキャブラリの一部であることに注意.
一方,名前空間接頭辞の付いた属性 x:id
はグローバル属性であり,どの要素型にも従属せず,直接名前空間に属します.
この二つの属性は同じローカル名 id
を持ちますが,独立したものであることに注意しませう.
と,XML 名前空間について復習したところで元記事の指摘を再掲.
[例2]<span m:inject="c:out" c:value="hello">
このような記述をMaya的には許しているようだが、XHTML仕様には準拠していない。
この [例 2] を詳細に見てみましょう.
まずは唯一の要素 <span>
があります.これは名前空間接頭辞がありません.これが XHTML だとすると XHTML 名前空間がデフォルト名前空間として宣言されているはずなので,<span>
要素は XHTML 名前空間に属する要素と考えることにします.
その <span>
要素は二つの属性を持っています.いずれも名前空間接頭辞で修飾されているのでグローバル属性であり,それぞれ名前空間接頭辞 m
および c
で宣言された名前空間に直接従属します.
二つのグローバル属性は要素 <span>
を間借りする形で存在していますが,決して XHTML 名前空間を拡張したりボキャブラリを追加しているわけではありません.これを処理する XHTML 対応のユーザエージェントがちゃんと名前空間仕様をサポートしていればこれらグローバル属性は無視するはずであり,何の問題もなく動作するはずです (妥当性検査についてはまた後日).
で,ASIP さんの指摘なんですが...
やっぱり [例 2] で出てくる m や c などの接頭辞で宣言されている名前空間のボキャブラリが XHTML 名前空間のボキャブラリを拡張したり追加したりするという誤解に基づいたものなのかな,と.
別の見方としては XHTML がグローバル属性の使用を認めていないと主張している可能性もある??
でもでも,XHTML 仕様ではそんな記述見あたらないし (おいらが見つけられないだけかもしれませんが).
微妙なところでは,XHTML 1.1 では Namespaces is XML を informative として参照しているわけですが... うーみゅ.
でも大丈夫です.XHTML 1.1 は (文書としては) 厳密適合文書を規定しているだけで,そこでは XHTML 名前空間に制限されているものなので,今の場合は関係ありません.
[例 2] の場合は参照するなら Modularization of XHTML であり,それは Namespaces in XML を Normative に参照しているので,特に明記されていない限り XML 名前空間仕様で認められているグローバル属性の使用が制限されることはないでしょう.
よって,[例 2] が「XHTML仕様には準拠していない」という ASIP さんの指摘は気にしなくてもいいのかな,というのが私の結論.
っていうか,この連載も 4 回目だというのに,的を射た指摘が全然見当たらないんですけど.(^^;
それなのに,元記事は未だに訂正されることも補足されることもなく公開されっぱなしなんですよね...
オレンジニュース経由で参照した延べ 300 人を超える人達が誤解したままじゃないか心配です〜.
ともあれ (JW),ここからは ASIP さんの指摘を離れて,まさたかさんによる XML 名前空間仕様の「歪曲」について考えてみます.
さて、次は.mayaファイルの名前空間の利用方法です。こちらは、基本的にXMLですが故意にMayaにて仕様拡張していることがあります。それは、名前空間の指定を省略した際の解釈方法です。名前空間やそのマッピングプレフィックスを省略せずに完全に記述した場合には、なんらXML仕様に反するものはありません。しかし、プレフィックス記述を省略したときにも状況依存でMayaが解釈する機能が搭載されています。私はこの一点をもって、あえて「歪曲」と言ってますが、どうですかね。
その「歪曲」の一例が「Maya 簡易マニュアル」に出てくるのですが...
まずは前振り.
例としてJSTL coreのoutタグを使うよう設定します。 <c:out m:id="greeting" c:value="こんにちは" />
この要素は名前空間接頭辞 c で宣言された名前空間に属しています.そして二つのグローバル属性を持ちます.
そして XML 名前空間仕様を「歪曲」した例がこちら.
タグの名前空間は"c"なので、outタグの属性"value"の名前空間を 省略できます。Maya属性は名前空間"m"なので省略できません <c:out m:id="greeting" value="こんにちは" />
属性 value
の名前空間 (接頭辞) を「省略」できること,その場合に要素の名前空間を参照することがまさたかさんの言う「歪曲」です (たぶん).たしかに XML 名前空間仕様的には属性の名前空間接頭辞を「省略できます」という表現はおかしな話.
が,しかし.
XML 名前空間仕様としては,この属性 value
は名前空間接頭辞で修飾されていないため,接頭辞 c で宣言された名前空間に属する要素型 <out>
に従属するローカル属性です.そのため,属性 value
は間接的ではありますが,接頭辞 c で宣言された名前空間ボキャブラリの一部ということになります.それは結果的に Maya における属性 value
の解釈と一致します.つまり,Maya はグローバル属性とローカル属性のどちらも扱えるというだけで,その振る舞いは XML 名前空間仕様のとおり (笑).
まぁ,微妙なところとしては,もし名前空間接頭辞 c で宣言された名前空間のためのスキーマ定義がある場合,そこで属性 value
がグローバル属性としてしか定義されていなければ (ローカル属性として定義されていなければ)「省略できます」はまずいということになります.なのですが,実際にはそんなスキーマ定義はないとのことなので問題ありません.たぶん.
そんなわけで (どんなわけで?),Maya は結果として XML 名前空間仕様を「歪曲」していないというのが私の解釈です.
細かいことを言うと,「Maya 簡易マニュアル」の「名前空間を省略できます」という表現は XML 名前空間仕様と照らし合わせるとちょっと変かなぁと思わないではありません.
おそらく,XML 名前空間仕様を知っている人には奇妙な感じを与えるのではないかと.「名前空間を省略できます」よりも「ローカル属性を使うこともできます」という方が正確な感じはしますね.
とはいえ,Maya を利用する人の多くにはズバリと「名前空間を省略できます」の方が分かりやすいだろうと思うので,「簡易マニュアル」としては現状のままでいいのではないかと個人的には思います.
さすがに Maya 仕様書では XML 名前空間仕様に従った表現があってもいいかなぁとは思いますけど.
[例 1][例 2] についての考察は以上.
となると次は [例 3] になるわけですが,これは XHTML の話じゃないですよね.おいら JSTL (っていうか Taglib) は全然チェックしてないし...
そんなわけで (どんなわけで?),[例 3] についてはまさたかさんにお任せして (シカトされてますねぇ (^^;
),次回は妥当性検査について書いてみようかなぁと思ってます.
それでこの件は終了かな.たぶん.