8 バインディング


Contents

この章は規範的である。

8.1 イントロダクション

バインディングはばらばらのXFormsの部品 -- XFormsモデルインスタンスデータフォームコントロール -- を繋げる糊(glue)である。bindingXFormsモデルで用いられている言語 (Schema あるいはsimple シンタックス)から独立しており、また使用されているユーザーインターフェース言語からも独立している。

バインディングバインディング式を用いて指定される。 バインディング式のシンタックスと詳細については動的制約言語の章 で定義されている。 この章はバインディング式をXFormsで用いる方法について、より広汎なトピックで説明している。

この章の将来のリビジョンではXForms モデル間を渡るバインディング 、たとえばあるXForms モデル の中で「アドレス」を宣言して、それを他の場所で参照することなどについて言及するであろう。

[編集者のフィードバックリクエスト 8.1.バインディング: この章の例は、フォームコントロールインスタンスデータの間のバインディング の重荷になっている。 XFormsの将来のリビジョンではより大きなフォームコントロールXForms モデルの間のバインディング の表現を含むことになろう。 この章に関するフィードバックは特にありがたい。]

8.2 バインディング属性

XFormsはどのフォームコントロールにも置くことができる属性refを定義する。 XFormsの外側にあるフォームコントロールに置かれた場合、これは適切にネームスペースを設定されなければならないことに注意。 この属性の値はXForms動的制約言語に基づくバインディング式となり、フォームコントロールインスタンスデータ中の特定のロケーション(そして特定のモデルアイテム)にリンクする。たとえば:

バインディング属性を伴うXFormsユーザーインターフェースの記述
<xform:textbox ref="binding-expression">
   <xform:caption>Your first name</xform:caption>
</xform:textbox>
ref属性は、フォームコントロールインスタンスデータおよびこれを含むドキュメントのどこかで宣言されたXFormsモデルにリンクする。

これはたとえばXHTMLのような非XForms フォームコントロールにも利用できる:

バインディング属性を伴うXHTML
<html:input type="text" name="ncname" xform:ref="binding-expression" />
ここではref属性はlinks an XHTML フォームコントロールインスタンスデータこれを含むドキュメントのどこかで宣言されたXFormsモデルにリンクする。html:プレフィックスがXHTMLネームスペースを表すために用いられていることに注意。

バインディング式の命令の詳細についてはこの章の残りを通して説明する。

8.3 直接バインディング

ドキュメントが、ほとんどの場合の、単一XFormsモデルと、ほとんどの場合の、単一のインスタンスデータのセットのみをもつとき、バインディングは どのXFormsモデルインスタンスデータが連携するかについては曖昧さの入り込む余地がないので、簡潔になる。以下のシンタックスはバインディング式として用いることができる:

たとえば:

XForms動的制約を用いたバインディング式
<xform:textbox ref="orderForm/shipTo/firstName">
...

ここではref属性はXForms モデルあるいはインスタンスデータ中の求めるパスを指定している。

インスタンスデータ
<orderForm>
  <shipTo>
    <firstName>value</firstName>
  </shipTo>
</orderForm>

これは上記の例に該当するインスタンスデータである。

xsd:ID型の属性をもつインスタンスデータ中のエレメントに対してバインディングがなされたときは、スペシャルケースが当てはまる。このケースでは、XPath関数id()が利用できる:

XPathのid()シンタックスを用いたバインディング式
<xform:textbox ref="id('myfirstname')">
...

ここではref属性はインスタンスデータmyfirstnameのidをもつエレメントに対するリンクを指定している。

インスタンスデータ
<a>
  <b id="myfirstname">value</b>
</a>

これは上記の例のインスタンスデータである。

このシンタックスが有効であるためには、以下の状態が成立していなければならない:

以下の点にも注意:

8.4 間接バインディング

フォームが、共同作業の(グラフィックデザイナーとデータベース/XMLのスペシャリストなど)形で設計されているような状況では、 コンテナとなるドキュメント中の単一のエリアにおける全てのバインディング式のロケーションを示せることが望ましい。 XFormsはバインディング式<model> および<instance>の兄弟となるような独立のエレメント<bind>中で出現することを許している。

<bind> の属性は、xsd:ID型のid およびbinding expressionを取るrefである。 あるバインディング式 がこの方法で定義された場合、フォームコントロール<bind> エレメントの id を、次のようにして参照することができる:

間接指定を用いたバインディング式
<xform:textbox ref="id('myfirstname')">
...

ここではref 属性は、他の場所で定義されているバインディング式 へのリンクを指定している。

インスタンスデータ
<xform:bind id="myfirstname" ref="orderForm/shipTo/firstName"/>
<xform:instance>
  <orderForm>
    <shipTo>
      <firstName>value</firstName>
    </shipTo>
  </orderForm>
</xform:instance>

これは上記の例のインスタンスデータ である。

これによって次のことが実現されている:

8.5 ページ毎の複数フォーム

XFormsの設計の目標点のひとつは、ページ毎の複数フォームをサポートすることである。これはドキュメント中に複数の<xform> エレメントをもつことによって達成される。 それぞれの<xform> エレメントはばらばらに定義された1つのXForms モデルあるいは インスタンスデータをもつ。これはバインディングを多少複雑なものにしている。正しい<xform> エレメントが参照されなければならないためである。

デフォルトでは、バインディング式 は、ドキュメント順で最初の<xform> エレメントの子となるような、 XForms モデル あるいは インスタンスデータ をベースにしている。 続く<xform> エレメントの内容を参照するには、xsd:ID型の属性id で修飾されていなければならない。 追加属性xform は、フォームコントロール エレメントに結びつけられて、マッチするidをもつ<xform> エレメントと関連付けられた、仮想的なインスタンスデータ あるいはXForms モデル に結びつけられたバインディング式 のためのコンテキストノードを調整する。

たとえば:

デフォルトでない<xform>を指定するバインディング式
<xform:textbox xform="b" ref="/orderForm/shipTo/firstName">
...

ここでは xform およびref の属性は、そのインスタンスデータ および XForms モデルに対するバインディング を指定する。

インスタンスデータ
<xform:xform id="b">
  <xform:model>
...
  </xform:model>
  <xform:instance>
    <orderForm xmlns="...">
	    <shipTo>
	      <firstName>value</firstName>
	    </shipTo>
	  </orderForm>
  </xform:instance>
</xform:xform>

これは上記の例のためのマークアップである。

Scoped resolution of バインディング式のスコープ内での解決は、動的制約言語の章 で定義されるとおり、いくつかのケースでxform 属性の反復的な使用を回避するために用いることができる。

謝辞: 編集者はKai Scheppe, Malte Wedel, Götz Bockに、このドキュメントの早期バージョンについて多くの建設的な批判と現在の内容に対する貢献を頂いたことに感謝する。