5 XFormsモデル


Contents

この章は規範的である。

5.1 イントロダクション

XFormsモデルは、stringなどのXML Schemaの既定データ型、およびXML Schemaシンタックスにそって定義されたカスタムデータ型をサポートしている。

この章はXForms simpleのシンタックスの詳細を説明する。XForms simpleのシンタックスは手軽に扱えるように、HTMLの作成者をターゲットとして設計されている。 SimpleのシンタックスはHTMLの作成者のための覚えやすいインターフェースを提供する; これはXML Schemaで達成された機能よりも少ない範囲を提供することで実現される。特に、XForms simpleのシンタックスが作成者に可能とするのは:

簡単であり続けるため、simpleのシンタックスはデータ型の再利用定義を許さない その代わりに、再利用可能なデータ型はXML Schemaで定義することができ、それはここで説明するとおりにXForms simpleのシンタックスを用いてインスタンス化される。

以降、この章ではXForms simpleシンタックスとXML Schemaを結びつける方法を説明する。

5.2 モデルアイテムプロパティ

以降のモデルアイテム のプロパティはデータタイプファセットを制約するシンタックスに似ている。しかし、データタイプの値空間を制約する代わりに、それらは個々のモデルアイテムreadOnlyrequiredのようなプロパティを追加するものである。 以降のプロパティは全てのデータ型に利用でき、そのシンタックスはこのドキュメントの以降の部分で説明される。

多くのモデルアイテム のプロパティは動的制約言語によって表すことができ、いつでも変更できる値を評価できる。フォームコントロールを実装するXForms処理系は、評価されたプロパティの変更に応じて動的な更新を行わなければならない。

5.2.1 モデルアイテムプロパティ: name

説明: 宣言されたデータ型を指定するための名前を表す。

有効値:xsd:NCNAME型の値のみ

デフォルト値: なし

作成者はnameプロパティの利用を通して、人間が読むこための名前を関連付けることができる。それぞれのnameは、それが宣言されたXFormsモデルのスコープで一意でなければならない。

インスタンスデータの中に出現するエレメントを定義するのにsimpleシンタックスを用いる場合、このnameプロパティは、以降の原始データ型の例として表されるような、該当するエレメント名を提供する。

5.2.2 モデルアイテムプロパティ: readOnly

説明: 値が変更を制限されるかどうかを表す。 フォーカスを取得し、またタブ出現順序を表すフォームコントロールの能力はこのプロパティに影響しない。

有効値: xform:booleanとして評価できる任意の式

デフォルト値: false

値の変更の制限に加え、readOnlyプロパティはXFormsユーザーインターフェースにヒントを与える。readOnlyプロパティのあるモデルアイテムに対するフォームコントロールは、値の代入または変更は許されていないことを示すべきである。そこで提示されるヒントは、可視性、フォーカス、タブ順序には影響しない。

[編集者のフィードバックリクエスト 5.2.2.定数: readOnlyファセットを不可変(immutable)にすることができて良いのか? つまり、あるエレメントがread-onlyであり不可変でもあるとされたとき、XForms処理系ファセットが変更されず、異なるレンダリングを採用するということをあてにできることになる。「定数」は必要なのか? ]

5.2.3 モデルアイテムプロパティ: required

説明: インスタンスデータが送信される前に値が必須となるかを表す。

有効値: xform:booleanとして評価できる任意の式

デフォルト値: false

しばしばフォームは一定の値が代入されていることを要求する。XFormsでは、これはスタティック(静的)な要求であり、XML Schemaで定義されるものである(たとえばxsd:minOccurs="1"として)。 そうでなければ、値はいくつかの条件を満たした場合のみ必須となりうる。

以下で示す場合を除いて、requiredプロパティはXFormsユーザーインターフェースに可視性、フォーカス、タブ順序に関するヒントを提供するものではない。XForms作成者は確実に、requiredデータを受信するようなフォームコントロールはvisible(可視)であると考えて良い。XForms処理系は、フォームコントロールが要求されているという一意の指示を行っても良い。

備考: サスペンドおよびレジューム命令はこのrequiredプロパティによっては制限されない。

備考: ファセットの制約に関して、競合するプロパティは最も制限に適合するものを選ぶことで解決(resolve)される。たとえば、もしxform:required="false"が指定されているが、そのエレメントにxsd:minOccurs="1"もスキーマで定義されている場合、このエレメントはrequiredとなる。

[編集者のフィードバックリクエスト 5.2.3.null: 完全なXFormsモデルのための必須属性にdefaultを設定した方が便利かもしれない。デフォルトとしてdefaultはどうか? 単一のXFormsモデルをデフォルトに設定することはできないか? これはreadOnlyなど、他の属性についても考えられる。]

[編集者のフィードバックリクエスト 5.2.3.null: Null値; XML Schemaならnullable="true"nullについては議論がまだ足りないのではないか。reuiredのアイテムに特有の関連問題である。]

5.2.4 モデルアイテムプロパティ: relevant

説明: そのモデルアイテムが現在XFormsモデルの残りの部分に関係するかどうかを表す。XForms処理系は、その値がfalseであれば、通常、関連付けられたフォームコントロール、およびその子をレンダリングしない。

有効値: xform:Booleanとして評価できる任意の式

デフォルト値: true

多くのフォームでは、他の状態に依存するフィールドをもつ。たとえば、応答者が車をもっているかどうかを質問するフォームがあるとする。もっている車の情報について質問するのは、彼らが持っていると指定した場合にのみ適切である。XFormsでは、これはrelevantプロパティを通じて表す。

relevantプロパティはXFormsユーザーインターフェースに可視性、フォーカス、タブ順序に関するヒントを与える。一般的には、trueのときは、関連するフォームコントロールはvisibleとされる。falseのときは、関連するフォームコントロールは、たとえXForms処理系フォームコントロールを禁止するだけであるとしても、hiddenにされる。どちらの場合でも、そのフォームコントロールはタブ順序から削除され、フォーカスを受け取ることはできない。

以下の表はrequiredrelevantのインタラクションを表している。

  required="true" required="false"
relevant="true" このフォームコントロール (およびその全ての子)はvisibleでありユーザーから利用できる。XFormsユーザーインターフェースは値が必須であることを示しても良い。 このフォームコントロール (およびその全ての子)はvisibleでありユーザーから利用できる。XFormsユーザーインターフェースは値が任意であることを示しても良い。
relevant="false"

このフォームコントロール (およびその全ての子)はhiddenでありユーザーから利用できない。値の代入またはフォーカスの取得は許されるべきではない。XFormsユーザーインターフェースはこのフォームコントロールが関連項目であり、値が必須になるかもしれないことを示しても良い。

このフォームコントロール (およびその全ての子)はhiddenでありユーザーから利用できない。値の代入またはフォーカスの取得は許されるべきではない。

5.2.5 モデルアイテムプロパティ: calculate

説明: 宣言されたデータ型が動的に計算されるものかどうかを表す。

有効値: 宣言されたデータ型に評価できる任意の式

デフォルト値: なし

XFormsモデルは、どこかの他の値から計算されたモデルアイテムを含んでも良い。たとえば、時間単位の価格(quantity times unit price)を表す行アイテムの合計、あるいは注文にかかる税金額などである。計算された値は他のモデルアイテムの値を用いた動的制約として表される。

5.2.6 モデルアイテムプロパティ: priority

説明: モデルアイテムの計算の相対的な優先順位を示す。

有効値: 0-32767の範囲にある整数として評価できる任意の式

デフォルト値: 0.

計算されるモデルアイテムについては、このオプションのプロパティが計算順序を決定する。

5.2.7 モデルアイテムプロパティ: validate

説明: 宣言されたデータ型の値が動的に検証されるかどうかを表す。

有効値: xform:Booleanとして評価できる任意の式

デフォルト値: true

XFormsモデルは、検証を必要とするモデルアイテムを含んでも良い。 指定された動的制約は、宣言されたデータ型の値が変更されたときに、毎回呼び出される。 妥当と思われるモデルアイテムについては、この式はtrueとして評価しなければならない。 この仕様の将来のバージョンでは、直接的な検証と送信時の検証について、詳しく説明する予定である。

ここで用いられている動的制約は、それらを呼び出したインスタンスデータアイテムだけを評価するよう制限されているものではない。動的制約言語はインスタンスデータをトラバースする手段と同様に、外部スクリプトの呼び出し(call-out)も提供する。

このXForms ユーザーインターフェースは、そのフォームコントロールが現在妥当か、妥当でないかを示しても良い。

[編集者のフィードバックリクエスト 5.2.7.cascade: validateプロパティは、その全ての親または子となるモデルアイテムについても、値が変更された時は評価されるのか? モデルアイテム間の制約が評価されることを明確にしなければならない。]

5.3 データ型を用いる

XFormsで定義された基本データ型は、XFormsアプリケーションで用いるために、個別に用いられても良いし、適切な構造体を構成するために集合しても良い。XFormsは、XML Schemaの構造に該当する対応するいくつかの構造体を提供する。

スキーマに忠実なXForms処理系は、XFormsモデルの中で、任意の複雑なスキーマ構造を用いることができる。完全なスキーマシンタックスは[XSchema-1]および[XSchema-2]で見ることができる。

5.3.1 原始データ型

説明: inserts an atomic datatype into the XFormsモデル.

Simpleシンタックス: 全てのデータ型の章の中の原始データ型について、simpleシンタックスではXFormsネームスペースで対応する名前のエレメントを規定している。XFormsネームスペースで許されたオプション属性は、以下に記した場合を除いて、ファセットモデルアイテムプロパティを制約するXFormsである。エレメントの内容は以下に記した場合を除いてemptyである:

XML 表現atomic datatypes
<datatype-name
  id = xsd:ID
  datatype-facet-name  = value
  <!-- ... 追加のデータ型 ファセット ... -->
  model-item-property-name = value
  <!-- ... 追加の model item プロパティ ... -->
  enum = ("open" | "closed") : "open"
  choices = dynamic-constraint

  <!-- 以下で説明される例外 -->
>
  <!-- Content: これ以降のセクションで説明する -->
</datatype-name>

属性定義:

id = xsd:ID
オプションの一意識別子。
enum = ("open" | "closed") : "open"
それ以降で詳細が示される、オプションの列挙指定。
choices = dynamic-constraint
動的に列挙型リストを生成するオプションの動的制約。

例外のシンタックス:

編注: <money> は原始データ型として考えることはできない(データ型の章における編集者のフィードバックリクエストを参照)が、そのためデータ型ではなく構造であると考えることはできる。

他の場所で定義されているデータ型(Schemaフォーマットにあるような)をXFormsモデルにインクルードする方法が必要になる。1つのシンタックスの提案としては:

Simpleシンタックスの例:

<xform:string name="foo" minLength="1" />

同等のスキーマシンタックスの例:

<xsd:element name="foo">
  <xsd:complexType>
    <xsd:restriction base="xform:string">
      <xform:minLength value="1"/>
    </xsd:restriction>
  </xsd:complexType>
</xsd:element>

Simpleシンタックスの例その2:

<xform:binary name="foo">
  <xform:mediaType>image/jpg</xform:mediaType>
  <xform:mediaType>image/png</xform:mediaType>
</xform:binary>

同等のスキーマシンタックスの例その2:

<xsd:element name="foo">
  <xsd:complexType>
    <xsd:restriction base="xform:binary">
      <xsd:mediaType value="image/jpg"/>
      <xsd:mediaType value="image/png"/>
    </xsd:restriction>
  </xsd:complexType>
</xsd:element>

5.3.2 列挙データ型

説明: 限定列挙の原始データ型をXFormsモデルに設定する。列挙はその特別なシンタックスのため、ここで特別に言及する。

Simpleシンタックス: 列挙データ型は上記のように原始データ型として宣言されるが、以下に追加のシンタックスがある:

XML 表現<value>
<value
  id = xsd:ID
>
  <!-- Content: #PCDATA -->
</value>

属性定義:

id = xsd:ID
オプションの一意識別子。

参考までに、open列挙型は次のような、複数選択の質問に「その他」の選択肢があるような状況で便利である:

showing radio buttons, Visa, Master Card, Diner's Club, American Express, and 'other', where the user can freely enter a value

編注: 機能的にopen列挙型に類似したものが、XML Schemaでは共用体(union)と列挙の機能の結合(combination)を通して利用できる。

Simpleシンタックス:

<xform:string name="foo" enum="closed">
  <xform:value>Visa</xform:value>
  <xform:value>MasterCard</xform:value>
  <xform:value>Diner's Club</xform:value>
  <xform:value>American Express</xform:value>
</xform:string>

同様のスキーマシンタックス:

<xsd:element name="foo" enum="closed">
  <xsd:complexType>
    <xsd:restriction base="xform:string">
      <xsd:enumeration value="Mastercard"/>
      <xsd:enumeration value="Diner's Club"/>
      <xsd:enumeration value="American Express"/>
    </xsd:restriction>
  </xsd:complexType>
</xsd:element>

動的な選択のsimpleシンタックス:

<xform:string name="foo" enum="closed" choices="getCreditCardList()"/>

5.3.3 グループ

説明: 順序づけられたデータ型の階層的集合を利用可能にする。

Simpleシンタックス: simpleシンタックスでは、エレメント<group>を規定し、モデルアイテム プロパティを表す有効な属性をもつものとする。

XML 表現<group>
<group
  id = xsd:ID
  name = xsd:NCNAME
>
  <!-- Content: (group | union | array | switch | atomic-datatypes)* -->
</group>

属性定義:

id = xsd:ID
オプションの一意識別子。
name = xsd:NCNAME
必須のグループ名。

Simpleシンタックスの例:

<xform:group name="person">
  <xform:string name="personName"/>
  <xform:string name="personTitle"/>
</xform:group>

同等のスキーマシンタックスの例:

<xsd:group name="person">
  <xsd:sequence>
    <xsd:element name="personName" type="xform:string"/>
    <xsd:element name="personTitle" type="xform:string"/>
  </xsd:sequence>
</xsd:group>

ここでは、XML Schemaシンタックスに対応させたとき、エレメントpersonは新しいデータ型を定義しているのではないことに注意。つまりpersonは再利用されない名無しの型である。

[編集者のフィードバックリクエスト5.3.3.順序のないグループ: このワーキンググループでは、上記の順序付きグループに加えて順序のないグループというオプションが必要かどうか、フィードバックを求めている。]

5.3.4 共用体

Description: 異なるデータ型を単一のモデルアイテムにすることを可能にする。

Simpleシンタックス: simpleシンタックスではエレメント<union>を規定し、モデルアイテム プロパティを表す有効な属性をもつものとする。子となるデータ型にはname属性を要求しない。

[編集者のフィードバックリクエスト 5.3.4.names: 共用体中の個々のエレメントについてname属性が必要であろうか?

XML 表現<union>
<union
  id = xsd:ID
  name = xsd:NCNAME
>
  <!-- Content: (group | union | array | switch | atomic-datatypes)* -->
</union>

属性定義:

id = xsd:ID
オプションの一意識別子。
Name = xsd:NCNAME
必須の共用体名。

Simpleシンタックスの例:

<xform:union name="weekday">
  <xform:string enum="closed">
    <xform:value>Monday</xform:value>
    <xform:value>Tuesday</xform:value>
    <xform:value>Wednesday</xform:value>
    <xform:value>Thursday</xform:value>
    <xform:value>Friday</xform:value>
    <xform:value>Saturday</xform:value>
    <xform:value>Sunday</xform:value>
  </xform:string>
  <xform:number min="1" max="7" scale="0"/>
</xform:union>

同等のスキーマシンタックスの例:

<xsd:element name="weekday">
  <xsd:simpleType>
    <xsd:union>
      <xsd:simpleType>
        <xsd:restriction base="xform:string">
          <xsd:enumeration value="Monday"/>
          <xsd:enumeration value="Tuesday"/>
          <xsd:enumeration value="Wednesday"/>
          <xsd:enumeration value="Thursday"/>
          <xsd:enumeration value="Friday"/>
          <xsd:enumeration value="Saturday"/>
          <xsd:enumeration value="Sunday"/>
        </xsd:restriction>
      </xsd:simpleType>
      <xsd:simpleType>
        <xsd:restriction base="xform:decimal">
          <xsd:maxInclusive value="7"/>
          <xsd:minInclusive value="1"/>
          <xsd:scale value="0"/>
        </xsd:restriction>
      </xsd:simpleType>
    </xsd:union>
  </xsd:simpleType>
</xsd:element>

5.3.5 配列

説明: 同類のコレクション(つまり、配列の全メンバーは同じ構造をもつ)を利用可能にする。

Simpleシンタックス: simpleシンタックスではエレメント<array>を規定し、モデルアイテム プロパティを表す有効な属性をもつものとする。

XML 表現<array>
<array
  id = xsd:ID
  name = xsd:NCNAME
  minOccurs = xform:number : 1
  maxOccurs = (xform:number | "unbounded") : 1
>
  <!-- Content: (group | union | array | switch | atomic-datatypes)* -->
</array>

属性定義:

id = xsd:ID
オプションの一意識別子。
Name = xsd:NCNAME
オプションの配列名。備考: 作成者は反復エレメントをコンテナ(containing)エレメントが生成されるかどうかを指定する能力をもつ。もし1つのname がその配列に指定されていたら、 コンテナエレメントの名前は配列名から派生しているかもしれない。 もしその配列にname が与えられていなかった場合、コンテナエレメントは生成されない。
minOccurs = xform:number
その配列の中でエレメントが出現する最小数を表すオプションとなる制限。
maxOccurs = xform:number | "unbounded"
その配列の中でエレメントが出現する最大数を表すオプションとなる制限。あるいは "unbounded" は無制限を表す。

Simpleシンタックスの例:

<xform:array name="children" minOccurs="0" maxOccurs="unbounded">
 <xform:string name="child" />
</xform:array>

同等のスキーマシンタックスの例:

<xsd:element name="children">
  <xsd:complexType>
    <xsd:sequence>
      <xsd:element name="child" type="xform:string" minOccurs="0" maxOccurs="unbounded"/>
    </xsd:sequence>
  </xsd:complexType>
</xsd:element>

Simpleシンタックスの例その2:

<xform:array minOccurs="0" maxOccurs="unbounded">
 <xform:string name="child" />
</xform:array>

同等のスキーマシンタックスの例その2:

 <xsd:element name="child" type="xform:string"  minOccurs="0" maxOccurs="unbounded"/>
 
<!-- note this syntax is only valid inside a group -->

5.3.6 Switch

説明: simpleシンタックスおよび何がインスタンスデータ中で生成されるべきかを決定する動的制約で定義される、選択構造を利用可能にする。

Simpleシンタックス: simpleシンタックスではエレメント<switch>を規定し、モデルアイテム プロパティを表す有効な属性をもつものとする。内容モデルはそれぞれデータタイプ宣言を含む<case>エレメントで構成される。<case>エレメントは2つの属性をもつ: モデルアイテム プロパティのnameと、検証に用いるスクリプトからなるconditionである。

XML 表現<switch>
<switch
  id = xsd:ID
  name = xsd:NCNAME
>
  <!-- Content: (case)* -->
</switch>

属性定義:

id = xsd:ID
オプションの一意識別子。
Name = xsd:NCNAME
必須のswitch名。
XML 表現<case>
<case
  id = xsd:ID
  name = xsd:NCNAME
  condition = dynamic-constraint
>
  <!-- Content: (group | union | array | switch | atomic-datatypes)* -->
</case>

属性定義:

id = xsd:ID
オプションの一意識別子。
Name = xsd:NCNAME
必須の個々のcase名。
condition = dynamic-constraint
オプションの動的制約; case式を選択するために用いられる条件。 最大で1つのcaseconditionを伴わなくて良く、これはデフォルトのcaseとみなされる。

Simpleシンタックスの例:

<xform:switch name="address">
  <xform:case name="us" condition="property(locale) is 'US'" >
    <xform:string name="street"/>
    <xform:string name="city"/>
    <xform:string name="state"/>
    <xform:string name="zip"/>
  </xform:case>
  <xform:case name="uk" condition="property(locale) is 'UK'" >
    <xform:string name="street"/>
    <xform:string name="town"/>
    <xform:string name="county"/>
    <xform:string name="postcode"/>
  </xform:case>
  <xform:case name="default">
    <xform:string name="street"/>
    <xform:string name="town"/>
    <xform:string name="county"/>
    <xform:string name="postcode"/>
  </xform:case>
</xform:switch>

同等のスキーマシンタックスの例:

<xsd:choice>
  <xsd:element name="address">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="street"   type="xform:string"/>
        <xsd:element name="city"     type="xform:string"/>
        <xsd:element name="state"    type="xform:string"/>
        <xsd:element name="zip"      type="xform:string"/>
      </xsd:sequence>
      <xsd:attribute name="xform:caseName" type="xsd:string"
              use="fixed" value="us"/>
      <xsd:attribute name="xform:caseCondition" type="xform:xfmExpr" 
              use="fixed" value=" property(locale) is 'US'"/>
    </xsd:complexType>
  </xsd:element>
  <xsd:element name="address" >
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="street"   type="xform:string"/>
        <xsd:element name="town"     type="xform:string"/>
        <xsd:element name="county"   type="xform:string"/>
        <xsd:element name="postcode" type="xform:string"/>
      </xsd:sequence>
      <xsd:attribute name="xform:caseName" type="xsd:string" 
              use="fixed" value="UK"/>
      <xsd:attribute name="xform:caseCondition" type="xform:xfmExpr"
              use="fixed" value=" property::locale is 'UK'"/>
    </xsd:complexType>
  </xsd:element>
  <xsd:element name="address" >
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="street"   type="xform:string"/>
        <xsd:element name="town"     type="xform:string"/>
        <xsd:element name="county"   type="xform:string"/>
        <xsd:element name="postcode" type="xform:string"/>
      </xsd:sequence>
      <xsd:attribute name="xform:caseName" type="xsd:string"
              use="fixed" value="default"/>
    </xsd:complexType>
  </xsd:element>
</xsd:choice>

この機能はXML Schema choiceのエクステンションである。

編注: これはインスタンスデータXForms ユーザーインターフェースXForms モデル、そしてバインディングの相互に影響(impact)する。 XFormsモデルはスイッチ構造を利用して多くの可変構造(variant)を構築したり、実行時にどの単一可変構造がインスタンス中で生成されるべきかを決定することができる。

5.4 XFormsとXML Schemaを結びつける

XML Schemaは外部ネームスペースの属性に目印をつけることができる。エレメントを追加する方が問題になりやすい。この仕様の将来のバージョンではより詳細にどのようにXFormsデータ型、プロパティ、構造がXML Schema中で用いられることができるかについて説明する。

5.4.1 外部スキーマを参照する

XForms作成者は、既に外部XML Schemaで定義されているデータ型と構造体を利用したいと考えるであろう。XFormsアプリケーションで用いる場合、このようなスキーマはXFormsの実行時制約を表す動的プロパティを用いて参照(annotate)されることが必要になる。

この仕様の将来のバージョンでは、どのようにオリジナルのスキーマを変更することなくXFormsに外部スキーマへの参照を追加するかについて説明する。

1つのシンタックスとして提案されるのは: