6 モデル項目特性

この章では、bind要素を使って、インスタンスデータのノードに束縛することができる、情報集合の寄与を定義する(3.3.4 bind要素参照)。インスタンスデータのノードへのこれらの寄与の組み合わせは、 モデル項目と呼ばれる。これらの寄与をひっくるめてモデル項目特性と呼び、次に続く項で定義する。一方、 スキーマ制約という用語は、与えられたデータ型のファセットによるXMLスキーマの制約のみを指す。

6.1 モデル項目特性定義

モデル項目特性は、様々な軸に沿って区別される。

計算表現と固定特性:

継承規則:

いくつかのモデル項目特性は、継承規則を定義する。これにより、、XForms処理系は、1) bind要素の属性から適用された局所値、及び2) インスタンスデータの祖先ノードで評価された値と、評価された局所値の組み合わせで決定される, 継承値という2つの別々の値の経過を記録する必要がある。

注:

D 再計算列アルゴリズムで定義される再計算アルゴリズムの例は、モデル項目特性の局所値のみを操作するように定義されている。これは、実装がノードの祖先の組み合わせ値を伝播させていることを仮定している。

局所値の割り当て:

局所値は、XFormsモデルの全bind要素を文書順序で処理することによって割り当てられる。同じノードに二度モデル項目特性を設定しようとすると、エラーとなる。この処理の詳細は4.2.1 xforms-model-constructイベントで与えられている。

次の項では、全モデル項目の一部として利用できるモデル項目特性を列挙している。それぞれに対して、次の説明が提供されている。

説明
計算表現(はい又はいいえ)
正当な値
デフォルトの値
継承規則

6.1.1 type特性

説明: データ型と結び付ける。

計算表現: いいえ。

正当な値: データ型の定義を表す任意のxsd:QName

デフォルトの値: xsd:string.

継承規則: 継承しない。

このモデル項目特性の効果は、インスタンスデータ上にxsi:type属性を置くことと同じである。しかしながら、xsi:typeと違い、typeは、要素にも属性にも追加することができる。

XMLスキーマの型制約を加える
<instance>
  <my:person-name>
    <my:first-name />
    <my:last-name xsi:type="my:nonEmptyString" />
  </my:person-name>
</instance>
<bind type="my:nonEmptyString" nodeset="/my:person-name/my:first-name" />

ここでは、XMLスキーマの型を要素に結び付ける2通りの方法を説明している。

6.1.2 readonly特性

説明: 値の変更が制限されているかどうかを表現する。

計算表現: はい。

正当な値: boolean()でXPathのbooleanと変換可能な任意の表現

デフォルトの値: calculate特性が指定されていなければfalse()、指定されていればtrue()

継承規則: 祖先のノードのどれかがtrueと評価されれば、trueとして扱われる。そうでなければ、局所値が使われる。

注:

これは、局所及び全ての祖先ノード上で評価されたreadonly特性の論理ORを取ることと等価である。

trueと評価されれば、このモデル項目特性は、XForms処理系に対して、束縛されたインスタンスデータのノードを変更することを許容すべきでないということを指示する。

値の変更を制限するのに加えて、readonlyモデル項目特性は、XForms利用者インタフェースに対して、ヒントを提供する。readonlyモデル項目特性を使ってインスタンスデータに束縛されたフォームコントロールは、入力や値の変更が許容されていないことを表示すべきである。この仕様書は、視覚、フォーカス、ナビゲーション順序についていかなる効果も定義しない。

readonly特性を加える
<instance>
  <my:person-name>
    <my:first-name>Roland</my:first-name>
    <my:last-name/>
  </my:person-name>
</instance>
<bind nodeset="/my:person-name/my:first-name" readonly="true()"/>

ここでは、要素にreadonly特性を結び付けている。

6.1.3 required特性

説明: 投稿される際に値が必須かどうかを表現する。

計算表現: はい。

正当な値: boolean()でXPathのbooleanと変換可能な任意の表現

デフォルトの値: false().

継承規則: 継承しない。

フォームは、特定の値を必須とすることがあり、この必須条件は動的であってもよい。trueと評価されれば、このモデル項目特性は、空でないインスタンスデータノードが、インスタンスデータの投稿がなされる際に必須であることを指示する。空でないとは、次のように定義されている。

  1. もし束縛されたインスタンスデータのノードが要素であれば、要素はxsi:nil属性がtrueに設定されていなければならない。

  2. 束縛されたインスタンスデータのノードの値が、1以上の長さのXPath stringに変換可能でなければならない。

下に言及されているようなものを除き、requiredモデル項目特性は、視覚、フォーカス、ナビゲーション順序に関して、XForms利用者インタフェースにヒントを提供しない。XFormsの制作者は、requiredのデータを受け取るフォームコントロールが間違いなく明白となるようにすることを強く推奨される。XForms処理系は、フォームコントロールが必須である指示を提供してもよいし、ナビゲーションの制限を含め、即時フィードバックを提供してもよい。4 処理モデルの章が、XForms処理系が必須の値をどのように強制するかについての詳細を含んでいる。

required特性を加える
<instance>
  <my:person-name>
    <my:first-name>Roland</my:first-name>
    <my:last-name />
  </my:person-name>
</instance>
<bind nodeset="/my:person-name/my:last-name" required="true()"/>

ここでは、値が与えられる必要があることを指示するために、my:last-name要素にrequired特性を結び付けている。

注:

XMLスキーマは、use="required|optional|prohibited"という似た名前の概念を持っている。これは、1) useは属性にのみ適用されるが、XFormsのrequiredが任意のノードに適用される、2) useは、属性全体を指定する必要があるかどうかに関係していた(値は関係なかった)が、requiredは、投稿の際に、値がノードに必須かどうかを決定するという二つの点で、XFormsモデルと異なっている。

6.1.4 relevant特性

説明: モデル項目が現在関係しているかどうかを指示する。falseと評価されるこの特性を持つインスタンスデータのノードは、投稿の際に直列化されない。

計算表現: はい。

正当な値: boolean()でXPathのbooleanと変換可能な任意の表現

デフォルトの値: true().

継承規則: 祖先のノードのどれかがXPathのfalseと評価されれば、falseとして扱われる。そうでなければ、局所値が使われる。

注:

これは、局所及び全ての祖先ノード上で評価されたreadonly特性の論理ORを取ることと等価である。

多くのフォームには、他の条件に依存する記入項目がある。例えば、回答者が車を所有しているかどうかフォームで尋ねたとしよう。自分の車についての情報をさらに尋ねるのが適切になるのは、所有していると指し示した場合のみである。

relevantモデル項目特性は、視覚、フォーカス、ナビゲーション順序に関して、XForms利用者インタフェースにヒントを提供する。概して、trueの場合、結び付けられたフォームコントロールは目に見えるべきである。falseの場合、結び付けられたフォームコントロール(及び全ての子供)と、groups及びwitch要素(内容を含む)は、利用できなくなるべきであり、ナビゲーション順序から削除されるべきであり、フォーカスを許可されないべきである。

注:

フォームコントロール、group又はswitchは、インスタンスノードと結び付けるのに、単一のノードの束縛として表現されなければならない。

relevant特性を加える
<instance>
  <my:order>
    <my:item>
      <my:amount />
      <my:discount>100</my:discount>
    </my:item>
  </my:order>
</instance>
<bind nodeset="my:item/my:discount" readonly="true()"
      relevant="../my:amount &gt; 1000"/>

ここでは、注文数が1000より大きいときに割引が関係するように、my:discount要素にrelevant特性を結び付けている。

次の表は、利用者インタフェースへのrequiredrelevantとの相互作用を示す。

required="true()" required="false()"
relevant="true()" フォームコントロール(及び全ての子供)は、利用者にとって、見え、利用可能なものでなければならない。XForms利用者インタフェースは、値が必須であることを指示してもよい。 フォームコントロール(及び全ての子供)は、利用者にとって、見え、利用可能なものでなければならない。XForms利用者インタフェースは、値がオプションであることを指示してもよい。
relevant="false()" フォームコントロール(及び全ての子供)は、利用者にとって、隠され、利用不可能なものでなければならない。XForms利用者インタフェースは、フォームコントロールが関係するようになれば、値が必須となることを指示してもよい。 フォームコントロール(及び全ての子供)は、利用者にとって、隠され、利用不可能なものでなければならない。値を入力したり、フォーカスを得たりすることは許容されない。

6.1.5 calculate特性

説明: 結び付けられたインスタンスデータのノードの値を計算するのに使われる表現を与える。

計算表現: はい。

正当な値: 任意のXPath表現。

デフォルトの値: なし。

継承規則: 継承しない。

XFormsモデルは、他の値で計算されたモデル項目を含んでもよい。例えば、単位料金の数量倍としての行項目の和や、注文に応じて払うべき税金の額である。そのような計算値は、他のモデル項目の値を用いた計算表現で表現される。4 処理モデルの章は、計算がいつどのように実行されるかについての詳細を含む。

calculate特性を加える
<instance>
  <my:order>
    <my:item>
      <my:amount />
      <my:discount />
    </my:item>
  </my:order>
</instance>
<bind nodeset="my:item/my:discount" calculate="../my:amount * 0.1"
      relevant="../my:amount &gt; 1000"/>

ここでは、10% の割引が注文数が1000より大きいときに関係するということを指示するように、my:discount要素にrelevant特性を結び付けている。

6.1.6 constraint特性

説明: 結び付けられたインスタンスデータのノードを妥当と考えるために、充足する必要がある述語を指定する。

計算表現: はい。

正当な値: boolean()でXPathのbooleanと変換可能な任意の表現

デフォルトの値: true().

継承規則: 継承しない。

XPath falseと評価されると、結び付けられたモデル項目は妥当ではない。逆は必ずしも真ではない。4 処理モデルの章は、いつどのように制約が計算されるか、及びいつ検証が実行されるかについての詳細を含む 。

constraint特性を加える
<instance>
  <my:range>
    <my:from />
    <my:to />
  </my:range>
</instance>
<bind nodeset="my:to" constraint=". &gt; ../my:from" />

ここでは、my:to要素に結び付けられたconstraint特性が、値がmy:from要素のそれより大きくなければならないことを指示する。

注:

インスタンスデータ内の最小及び最大の存在数を指定するには、constraint特性内でcount()関数を使えばよい。

6.1.7 p3ptype特性

説明: そこで収集されるデータの具体的な種類を指示する、P3Pデータ要素をインスタンスデータのノードに加える。

計算表現: いいえ。

正当な値: xsd:string.

デフォルトの値: なし

継承規則: 継承しない。

このモデル項目特性は、P3Pのデータ型システム[P3P 1.0]に基づいて、結び付けられたインスタンスデータのノードで収集されるデータの種類についての説明を持つ。

束縛を用いた型制約を加える
<instance>
  <my:person-name>
    <my:first-name />
    <my:last-name />
  </my:person-name>
</instance>
<bind type="my:nonEmptyString" nodeset="my:first-name"
      p3ptype="user.name.given"/>

ここでは、bind要素によってfirst-name要素にXMLスキーマ及びP3Pの型情報の両方を加えている。

6.2 スキーマ制約

5 データ型の章では、XFormsモデルによって収集されるデータ値の値空間を制約するXMLスキーマのデータ型を使う方法を説明した。このデータ型制約は、XMLスキーマで提供できる。代わって、この項では、インスタンスデータに加える型制約に対して様々な仕組みを列挙する。xsi:schemaLocation及びxsi:noNamespaceSchemaLocation属性は、スキーマの場所を決める目的では無視される。

6.2.1 小さなデータ型

XForms処理モデルは、検証処理の一部として、XMLスキーマのファセットを適用する。もっとも単純な水準では、ファセットの集合(XMLスキーマのデータ型による)をモデル項目と結び付けることが必要となる。これは、データ型の字句空間の妥当な表現に結び付けられた、インスタンスデータのノードの許容できる値を制限する効果を持つ。

モデル項目と結び付けられたファセットの集合は、与えられた順序で処理されるように、次のリストによって決定されなければならない。複数のデータ型制約が同じモデル項目に適用されると、全ての与えられた制限の組み合わせが適用されなければならない。満たすことのできない制約の組み合わせが生成されることがありうることに注意すること。制作者はこの実行を避けることを推奨される。

  1. インスタンスデータに結び付けられたXMLスキーマ。

  2. インスタンスデータ内のXMLスキーマxsi:type属性。

  3. XFormsの束縛を用いてインスタンスデータのノードに結び付けられたXForms type制約。

  4. もし型制約が何も提供されなければ、インスタンスデータのノードは、type="xsd:string"をデフォルトにする(文字列規則をデフォルトにする)。

次に続くのは、追加の制約ファセットを用いて、xsd:stringに基礎付けられたデータ型を宣言している。

XMLスキーマを用いた型制約
<xsd:simpleType name="nonEmptyString">
  <xsd:restriction base="xsd:string">
    <xsd:minLength value="1"/>
  </xsd:restriction>
</xsd:simpleType>

この新しいデータ型は、ここで概要を述べた手法の一つによって、一つ以上のモデル項目と結び付けられる。

型制約を加える
<my:first-name xsi:type="my:nonEmptyString"/>

これは、my:nonEmptyString型であるべきfirst-name要素を定義する。

XFormsの制約を用いた型制約を加える
<instance>
  <my:first-name />
</instance>
<bind type="my:nonEmptyString" nodeset="/my:first-name"/>

ここでは、bind要素でfirst-name要素に型情報を加えている。このように、XFormsの制作者は、変更することができなくても、外部スキーマを拡張することができる。