-パース時の名前空間の取り扱い仕様の変更
いくつかの実装上の可能性実現のため、パース時の名前空間の取り扱いの仕様に変更を行います。骨子は以下のとおりです。
- ノードの名前空間が省略されたときには、.mayaはhttp://www.seasar.org/maya名前空間(MAYA_URI)、テンプレートは暗黙のHTML名前空間(HTML_URI)を補完する。
- 属性の名前空間が省略されたときには、ノードの名前空間で補完する。
- TagProcessorResolverでは、インジェクトされるTLDを指定した名前空間URIによって定義されている属性をタグに設定する。
- {MAYA_URI}mayaIDは、{MAYA_URI}idと改名。
- {MAYA_URI}mayaPathは、{MAYA_URI}xpathと改名。
- {MAYA_URI}replaceは、{MAYA_URI}renderedと改名し値の意味をtrue-false逆転
テンプレートは以下のような感じ。
<html xmlns:m="{MAYA_URI}" xmlns:c="{CORE_URI}"> <!-- .mayaを参照する例 --> <span id="message"> body text </span> <!-- 設定を埋めこむパターン例 --> <span m:inject="c:out" c:value="${ greeting }" m:rendered="true"> body text </span> <!-- 直に書いちゃう例 --> <c:out m:id="message" value="${ greeting }" m:rendered="true"> body text </c:out> </html>
.mayaをidで引く場合はまったく変りません。このidは、{HTML_URI}idと解釈されるとおりです。これと、.maya中の{MAYA_URI}id属性で同じ値を持つものを探します。m:injectを使う場合は、c:outタグの属性は、c:valueのように同じプレフィックスを用いる点に違いがあります。テンプレートには直にかける機能もすでにあって、その際はノードがc:プレフィックスなのでvalue属性はプレフィックスを省いてもOKとします。
.mayaは以下のような感じ。
<m:maya xmlns:m="{MAYA_URI}" xmlns:c="{CORE_URI}"> <!-- カスタムタグインジェクト --> <c:out m:id="message" c:value="${ greeting }" m:rendered="true"/> <!-- 上記を、valueのプレフィックス省略 --> <c:out m:id="message" value="${ greeting }" m:rendered="true"/> <!-- 基本形 --> <m:ignore m:id="idForDHTML"/> <!-- ノードのプレフィックスを省略--> <ignore m:id="idForDHTML"/> <!-- idのプレフィックスを省略--> <m:ignore id="idForDHTML"/> <!-- ノード・idのプレフィックスをともに省略--> <ignore id="idForDHTML"/> </m:maya>
c:outのほうは、CORE_URI名前空間なので、idやrenderedはプレフィックスを省略できません。省略すると、それぞれ、c:idやc:renderedとなります。もしタグにidやrenderedがあったら?という問題はこれで解決できます。ignoreノードのほうは、MAYA_URIなのでノードのプレフィックスも省略できますし、属性もプレフィックスを省略するとノードのプレフィックスというルールから、idもm:idと評価されます。
このルールから仕様錯誤によるプレフィックスの打ち間違い、もしくはプレフィックスの省略は出来るだけ検出し、例外とします。たとえば、非MAYA_URI名前空間のタグにおいて、idやrenderedといったMAYA_URI名前空間の属性のプレフィックスが省略されているとき、MAYA_URI名前空間にて定義されていないものにMAYA_URIを貼ったり、プレフィックスを省略したときなどです。