この章は規範的である。
XFormsリファレンス処理モデルはコンポーネント、予定されている振る舞い、XForms処理系のメカニズムについての規範的な説明である。実装を制約する意図はない。XForms 処理系は、その最終結果がこの章で説明されているとおりになれば、どのようなマナーで実装されても良い。
この章ではRFC2119の通りに、しても良い(may)、しなければならない(must)、 すべきである(should) という言葉を(この章で記述される限りでは)使う。
[編集者のフィードバックリクエスト 10.1.processing: この章はまだ初期フェーズにあり、間違いや省略が含まれているかもしれない。この章に関するフィードバックは特にありがたい。]
この章で示されるリファレンス処理モデルは:
それぞれの<xform>
エレメントについて、XForms 処理系 はここで説明されるプロパティのセットを保持する。
version
conformance-level
locale
timezone
immediate-refresh
immediate-revalidate
immediate-recalculate
use-nulls
version
(readonly) は XForms 1.0 については文字列"1.0" と定義される。
conformance-level
(readonly) 文字列はTBD(今後説明する)
locale
(readonly) 文字列は文字通りロケールを決定するためのプロセスである。TBD
timezone
(readonly) 文字列はGMTからのオフセットとなる分の数を表す符号あり整数となる。
immediate-refresh
(read-write) は、インスタンスデータ の変更が直ちにUIによって更新されるかどうかを制御する。
immediate-revalidate
(read-write) は、インスタンスデータ の変更が直ちに検証(validation)をトリガーするかどうかを制御する。
immedate-recalculate
(read-write) は、インスタンスデータ の変更が直ちに再計算をトリガーするかどうかを制御する。
use-nulls
(read-write) は、XML Schema Instance のnull がインスタンスデータに配置されるかどうかを制御する。
このワーキンググループでは現在、これらのプロパティを動的制約言語上から操作するシンタックスについて議論している。
XForms では[DOM2 Events]で定義されるイベントシステムを、捕獲(Capturing)フェーズ、イベントターゲットへの到達、そしてその後の浮上(Bubbling)といったことついて用いる。
イベントは独立したグルーピングに帰属する。あるイベントのクラスは、何らかの処理が発生しようとしていることを示す。その処理は一旦停止して、そのイベントハンドラに渡される:
xforms-submit
xforms-reset
xforms-value-changing
xforms-interactive-value-changing
xforms-instance-changed
別のイベントのクラスでは、何らかの処理が既に発生した、あるいは進行中である、ということを示す。このような処理はイベントハンドラによって一旦停止されることはない:
xforms-construct
xforms-destruct
xforms-suspend
xforms-resume
xforms-exception
最後に、ある種のイベントは作成者あるいはXForms 処理系 によって用いられて、一定の処理を発生させる:
xforms-recalculate
xforms-refresh
特に何も記さない限り、全てのイベントのターゲットノードは<xform>
エレメントとする。もしコンテナとなるドキュメントが複数の<xform>
エレメントをもつ場合、そのbindingがどの <xform>
エレメントが使われるかを決定するように用いられる。
このワーキンググループではイベントハンドラのためのシンタックスを提案することを考えている。これは主に[XHTML Events]に基づくものとなろう。
コンテナとなるそれぞれのドキュメントについて、XForms 処理系 は、あたかも内部で1つのインスタンスデータのセットを保持するかのように振る舞わなければならない。これは仮想的なインスタンスデータと呼ばれる。
このドキュメントでは、これは仮想的な<instance>
エレメントとして表され、<xform>
エレメントと関連付けられた全てのインスタンスデータ を含み、また保持するものとする。
仮想的なインスタンスデータ 中のエレメントが、XFormsネームスペースであることは許されない(たとえば送信されるXMLデータが、XFormsエレメント自身から構成される場合など)。
仮想的なインスタンスデータの表現
<instance> ... ここからインスタンスデータ ... </instance>これはXFormsリファレンス処理モデルによって用いられる仮想的な This is an example of virtual インスタンスデータ の例である。
[編集者のフィードバックリクエスト 10.4.dom: 仮想的なインスタンスデータ はコンテナとなるドキュメントのDOMにマッピングされるべきだろうか、それとも独立したドキュメントスペースに存在すべきだろうか?]
[編集者のフィードバックリクエスト 10.4.access: DOMからすれば、仮想的なインスタンスデータ はread-onlyになるべきか、それともread-writeになるべきか? ここに安全性の意味合いがありうるのか?]
さらに、リファレンス処理モデルについては、仮想的なインスタンスデータ は、どのインスタンスデータアイテム (エレメント、属性、複合型etc.)が「ダーティ」であるか、そして更新の必要があるかについて記録する。
以下では、XFormsの初期化プロセスについて説明する。初期化はその他の全ての処理に先んじて起こらなければならない。コンテナとなるドキュメント中のそれぞれの<xform>
エレメントについて、ドキュメント順で、以下の処理が発生する:
xforms-construct
イベントが発動する; これは作成者があらゆる初期化のタスクを操作するための場所である。<model>
エレメントがローカルにないXForms Modelへの参照を含む場合、そのリンクを辿って取得する。何らかの理由で取得できないXForms モデル は、致命的エラーとみなしてそのフォームへのフィルを防がなければならない(must)。<instance>
エレメントがローカルにない
インスタンスデータへの参照を含む場合、そのリンクを辿って取得する。
何らかの理由で取得できないインスタンスデータ は無視される。この場合、XForms 処理系はワーニングを提示 してもよい 。<xform>
エレメントが 1) <instance>
の子をもたず、かつ 2) <model>
の子をもたない場合、以下の処理が発生する:
<xform>
エレメントにつながるそれぞれのフォームコントロール は、ドキュメント順で訪問され(visited)る。
それぞれのフォームコントロールのバインディング式 は評価されるuse-nulls
プロパティがtrueとなり、(どのようにSchemaがファイナライズする表現であっても)null値とともに移植される。
Schemaが指定する方法では、エレメントのみがnull値をもちうることに注意。
フォームコントロール はデフォルトの空白値を受け取る。
インスタンスデータアイテムを生成するアルゴリズムは次の通り:
厳格なバインディング式中のそれぞれのロケーションステップについて、左から右に、
仮想的なインスタンスデータ中でマッチするノードが存在しない場所で、新しいノードが追加される。xforms-resume
イベントが発動する。ナビゲーションはドキュメント・ワイド(ドキュメントの視野・視点)で決定される。ナビゲーション順序は次のように決定される:
navindex
をサポートし正の値を割り当てられたフォームコントロールは、最初にナビゲートされる。
ナビゲーションは最も低いnavindex
値をもつフォームコントロール からはじまって、最も高い値をもつフォームコントロール に向かって進む。
値は連続的である必要もなければ、特定の値から始まっている必要もない。
同一のnavindex
値をもつ
フォームコントロールは、ドキュメント順でナビゲートされるべきである。navindex
を提示する、あるいは"0"を提示するフォームコントロールが次にナビゲートされる。これらのフォームコントロールはドキュメント順でナビゲートされる。relevant
でないサブツリー上にあるフォームコントロールは、シーケンス全体を通して相対的な順序を割り当てられるが、ナビゲートできるコントロールに加わることはない。XForms はHTMLのonChange
イベントと同様の処理を提供する。
ユーザーがフォームコントロール へ入力してナビゲーションを移動する(complete ... by navigating away)のに応じて、以下が発生する:
xforms-value-changing
イベントが発動する。
もし表示値が変更されていない場合、このイベントの処理は完了する。
preventDefault()
メソッドの提供を思案中である)。
あるいば、リスナーは表示値から厳格な値にカスタム変換しても良い。
いかなるリスナーも、任意のインスタンスデータアイテムを変更するような副次的効果をもって良い。このような場合、修正された部分は「ダーティなもの」としてマークされる必要がある。immediate-revalidate
プロパティがtrueであれば、そのフォームコントロールに結びついた全ての検証 が実行される。
検証は厳格な値に対して行われ、表示値に対しては行われないことに注意。
immediate-recalculate
プロパティがtrueであれば、再計算 が発生し、定義された計算を行う。immediate-refresh
プロパティがtrueであれば、リフレッシュ が発生し、新しく変更された値に従って起こる任意のフォームコントロールの更新を行う。ある種のフォームコントロールは値の決定(ファイナライズ)がないうちに、インタラクティブなレスポンスを許容する。 この例にはエディットボックス(「タブ移動」する前にユーザーが多様な文字をタイプする)やスライダーコントロール(特定の値でリリースする前にユーザーが連続的に値を調整できる)などが含まれる。 このような、許容される値空間の範囲外にあるインタラクティブなテンポラリ値は、明示的に「無効」として許容される。 これは不完全なデータはユーザーが一時的な(transitional)値として入力する間に存在しうるからである。
例: 部分的に入力された "U" のcurrency値は、(まだ)3文字含まれていないために有効ではない。これはユーザーがそのフォームコントロールに残っている限り、一時的に許容される。 処理のリソースを十分にもつXForms 処理系は通常(typically)、全ての文字について更新/リフレッシュする。リソースの限られたXForms 処理系は、通常は最後の値についてのみ更新/リフレッシュする。
xforms-interactive-value-changing
イベントが発動する。
リソースの限られた
XForms 処理系 実装は、全てのxforms-interactive-value-changing
イベントを無視することを選択しても良い。
immediate-revalidate
の設定に関わりなく発生する。
もしそのフォームコントロール の全ての検証が成功した場合、インスタンスデータアイテム が更新され、「ダーティである」としてマークされる。もし何らかの検証が失敗した(一時的な値も含む)場合、同じinstance data item に結びついた全てのフォームコントロールは、表示値で更新されてもよい。 そうでない場合、以下が発生する:immediate-recalculate
プロパティがtrueの場合、再計算 が発生し、定義された任意の計算を行う。immediate-refresh
プロパティがtrueの場合、再計算 が発生し、新しく変更された値に依存する任意のフォームコントロールを更新する。xforms-interactive-value-changing
に反応することを選ぶ典型的な実装には、最適化処理が期待される(たとえば全スクリーンをそれぞれの文字についてフラッシュしない等)。
XForms 処理系は、結果が同一である限り、このアルゴリズムのステップを省略あるいは自由に変更して良い(そしてそれが推奨される)。各フォームコントロール は、計算順序を決定する主な要素となるモデルアイテム プロパティpriority
の値をもちうる。
以下は、xforms-recalculate
イベントのデフォルトの操作である:
calculate
モデルアイテム プロパティと結びつけられた各モデルアイテム は、次に定めるとおりに計算順序で訪問(visit)される:
calculate
モデルアイテム プロパティ中の式が評価される。その結果としてのあらゆるインスタンスデータアイテムの 変更が"dirty" フラグをマークされる。calculate
式の結果として更新され、"dirty" フラグがセットされる。以下はxforms-refresh
イベントのデフォルト動作である:
xforms-refresh
イベントの処理の開始時から存在したかのように用いる。relevant
制約が評価される。xforms-instance-changed
イベントが発動する。xforms-instance-changed
イベントのリスナーは新しい表示値を計算して良い。xforms-instance-changed
イベントのリスナーは、現存するフォームコントロールに対するいかなる直接的な更新も禁止されている。xforms-instance-changed
イベントのリスナーは、いかなる仮想的なインスタンスデータ(原文ではinnate dataだが、instanceの誤植として訳した)の一部でも置き換えることが禁止されている。
そのようにすることを試みた場合は、結果としてxforms-exception
が発動する。xforms-instance-changed
イベントのデフォルト処理を妨げても良い。編注: データ型のファセット あるいはモデルアイテム プロパティが変更されたときの処理については、なお言及を要する--何が"dirty"になるか?; 何が再計算されるか?; 何が再検証されるか?; 何がリフレッシュされるか?
妥当性再検証は常にコンテキストフォームコントロールのスコープで生じる。以下は妥当性再検証 のプロセスである:
validate
モデルアイテム プロパティがコンテキストフォームコントロールに結びつけられていれば、その式が評価される。
これがfalseと評価された場合、コンテキストフォームコントロール は妥当でないとみなされる。フォームのフィル処理(experience)は、フォームを送信する(submit)、後のために保存する(suspend)、最初からやり直す、といった形で完了する。これらのイベントのためのXForms 処理はここでカバーされる。
以下のセクションではどのようにインスタンスデータ が送信に備えて準備されるかについて説明する。
xforms-submit
イベントに対応して、以下が実行される:
xforms-suspend
イベントに対応して、以下が実行される:
xforms-reset
イベントに対応して、以下が実行される:
このフォーマットはXFormsをHTMLフォーム処理環境に結びつけるものであり、 階層的なインスタンスデータの本質を表す[XHTML 1.0]のフォーム内容タイプのエクステンションを表す。
このフォーマットはバイナリ内容を保持できないので向いていない。そこで、バイナリ内容を含むXFormsについては、multipart/form-dataあるいはtext/xmlのフォーマットを用いることを推奨する。
[編集者のフィードバックリクエスト 10.6.4.urlencoding: ここで提示されているURLエンコーディングの技術は、正確には過去の実装(legacy impletemntations)がURLエンコーディングされたデータを生成する方法にはマッチしない。(つまり、我々はコンテキスト情報をスラッシュと複数のロケーションステップで追加しようとしているのである) このアプローチは過去のURLエンコーディングのパーサの邪魔にならないか?]
[編集者のフィードバックリクエスト 10.6.4.utf8: 議論の中にあるのは、このデータがUTF8エンコードされるかどうかである; しかしながらこれはIETFの発展に依存している。 UTF8 はフォームのコミュニティの要求を満たしているだろうか?]
この保持フォーマットの設計のステップは次の通り:
application/x-www-form-urlencoded
/PersonName/@title=Mr&/PersonName/FirstName=Rolandこのフォーマットは厳格なバインディング式と値のペアのセットで構成される。
該当するインスタンスデータ
<PersonName title="Mr"> <FirstName>Roland</FirstName> </PersonName>これは上記の例のインスタンスデータである。
このフォーマットはXFormsをHTMLフォーム処理環境に結びつけるものであり、 階層的なインスタンスデータの本質を表す[XHTML 1.0]のフォーム内容タイプのエクステンションを表す。
application/x-www-form-urlencodedフォーマットとは異なり、このフォーマットはバイナリ内容も保持できる。このフォーマットは[RFC 2045]で枠組みを示された、マルチパートMIMEデータストリームの全てのルールに従う。それぞれのパートに含まれることが期待されているのは:
multipart/form-data
Content-Type: multipart/form-data; boundary=AaB03x--AaB03x Content-Disposition: form-data; name="/PersonName/@title" Mr --AaB03x Content-Disposition: form-data; name="/PersonName/FirstName" Roland --AaB03x ...Possibly more data... --AaB03x-このフォーマットは1つの厳格なバインディング式 と1つの値のペアのセットで構成される。
該当するインスタンスデータ
<PersonName title="Mr"> <FirstName>Roland</FirstName> </PersonName>これは上記の例のインスタンスデータである。
それぞれのパートはエンコードされ、"Content-Transfer-Encoding"ヘッダが、そのパートの値がデフォルト(7ビット)エンコーディングに該当しないかどうかを表す。
インスタンスデータ中の値がバイナリ内容を表す場合、この値は適切な内容タイプによって識別されるべきである(たとえば、"application/octet-stream")。もし単一のモデルアイテムの出力としてバイナリ内容の値が複数返される場合、それらは"multipart/form-data"の中に埋め込まれた"multipart/mixed"として返される。
XForms処理系はそれぞれのバイナリ内容の値についてファイルネームを期待しても良い。このファイルネームは、'Content-Disposition: form-data'の"filename"パラメータか、もしバイナリ内容の値が複数ある場合は、サブパートの'Content-Disposition: file'ヘッダで指定されれば良い。もしクライアントのオペレーティングシステムにおけるファイル名がUS-ASCIIでなかった場合、そのファイル名は類似名にされるか、[RFC 2045]の方法を用いてエンコードされる。これは、たとえばアップロードされたファイルがお互いへの参照を含んでいるかもしれないという場合に便利である(たとえばTeXファイルとその補助的なスタイル指定の".sty"など)。
このフォーマットはインスタンスデータ をXMLベースのフォーマットとして表すことを可能にしており、そのままXML処理ツールに渡して処理することができる。さらに、このフォーマットはバイナリ内容も保持する。
この保持フォーマットの設計のステップは次の通り:
バイナリ内容の扱いはXMLプロトコルワーキンググループの現在進行中の作業に基づく。
[編集者のフィードバックリクエスト 10.6.5.metadata: インスタンスデータ中の値がバイナリ内容を表す場合、我々は適切な内容タイプを反映したxform:mediaType
属性(たとえば"image/jpg")をもつメタ情報をもつことができないか?
XFormsは、そのサイズおよびリソース制限のバラエティの幅広いXForms処理系で用いられるように設計されている。このため、複数の適合性レベルについては議論中である。この章は将来より詳細なものとして更新されるであろう。