この章は規範的である。
バインディングはばらばらのXFormsの部品 -- XFormsモデル、インスタンスデータ、フォームコントロール -- を繋げる糊(glue)である。bindingはXFormsモデルで用いられている言語 (Schema あるいはsimple シンタックス)から独立しており、また使用されているユーザーインターフェース言語からも独立している。
バインディング は バインディング式を用いて指定される。 バインディング式のシンタックスと詳細については動的制約言語の章 で定義されている。 この章はバインディング式をXFormsで用いる方法について、より広汎なトピックで説明している。
この章の将来のリビジョンではXForms モデル間を渡るバインディング 、たとえばあるXForms モデル の中で「アドレス」を宣言して、それを他の場所で参照することなどについて言及するであろう。
[編集者のフィードバックリクエスト 8.1.バインディング: この章の例は、フォームコントロールとインスタンスデータの間のバインディング の重荷になっている。 XFormsの将来のリビジョンではより大きなフォームコントロールとXForms モデルの間のバインディング の表現を含むことになろう。 この章に関するフィードバックは特にありがたい。]
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ネームスペースを表すために用いられていることに注意。
バインディング式の命令の詳細についてはこの章の残りを通して説明する。
ドキュメントが、ほとんどの場合の、単一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>これは上記の例のインスタンスデータである。
このシンタックスが有効であるためには、以下の状態が成立していなければならない:
以下の点にも注意:
フォームが、共同作業の(グラフィックデザイナーとデータベース/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>これは上記の例のインスタンスデータ である。
これによって次のことが実現されている:
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に、このドキュメントの早期バージョンについて多くの建設的な批判と現在の内容に対する貢献を頂いたことに感謝する。