この章は規範的である。
XFormsモデルは、string
などのXML Schemaの既定データ型、およびXML Schemaシンタックスにそって定義されたカスタムデータ型をサポートしている。
この章はXForms simpleのシンタックスの詳細を説明する。XForms simpleのシンタックスは手軽に扱えるように、HTMLの作成者をターゲットとして設計されている。 SimpleのシンタックスはHTMLの作成者のための覚えやすいインターフェースを提供する; これはXML Schemaで達成された機能よりも少ない範囲を提供することで実現される。特に、XForms simpleのシンタックスが作成者に可能とするのは:
string
などのエレメントの(elementary)データ型のいずれにも合致するエレメントの宣言USPostalAddress
などの、XML Schemaを用いて他の場所で定義された複雑型に合致するエレメント誕生日は卒業日に先行するといった、ランタイムの(動的な) XFormsの制約に関する追加制約
簡単であり続けるため、simpleのシンタックスはデータ型の再利用定義を許さない その代わりに、再利用可能なデータ型はXML Schemaで定義することができ、それはここで説明するとおりにXForms simpleのシンタックスを用いてインスタンス化される。
以降、この章ではXForms simpleシンタックスとXML Schemaを結びつける方法を説明する。
以降のモデルアイテム のプロパティはデータタイプファセットを制約するシンタックスに似ている。しかし、データタイプの値空間を制約する代わりに、それらは個々のモデルアイテムにreadOnly
やrequired
のようなプロパティを追加するものである。
以降のプロパティは全てのデータ型に利用でき、そのシンタックスはこのドキュメントの以降の部分で説明される。
多くのモデルアイテム のプロパティは動的制約言語によって表すことができ、いつでも変更できる値を評価できる。フォームコントロールを実装するXForms処理系は、評価されたプロパティの変更に応じて動的な更新を行わなければならない。
説明: 宣言されたデータ型を指定するための名前を表す。
有効値:xsd:NCNAME
型の値のみ
デフォルト値: なし
作成者はname
プロパティの利用を通して、人間が読むこための名前を関連付けることができる。それぞれのname
は、それが宣言されたXFormsモデルのスコープで一意でなければならない。
インスタンスデータの中に出現するエレメントを定義するのにsimpleシンタックスを用いる場合、このname
プロパティは、以降の原始データ型の例として表されるような、該当するエレメント名を提供する。
説明: 値が変更を制限されるかどうかを表す。 フォーカスを取得し、またタブ出現順序を表すフォームコントロールの能力はこのプロパティに影響しない。
有効値: xform:boolean
として評価できる任意の式
デフォルト値: false
値の変更の制限に加え、readOnly
プロパティはXFormsユーザーインターフェースにヒントを与える。readOnly
プロパティのあるモデルアイテムに対するフォームコントロールは、値の代入または変更は許されていないことを示すべきである。そこで提示されるヒントは、可視性、フォーカス、タブ順序には影響しない。
[編集者のフィードバックリクエスト 5.2.2.定数: readOnly
はファセットを不可変(immutable)にすることができて良いのか? つまり、あるエレメントがread-onlyであり不可変でもあるとされたとき、XForms処理系はファセットが変更されず、異なるレンダリングを採用するということをあてにできることになる。「定数」は必要なのか? ]
説明: インスタンスデータが送信される前に値が必須となるかを表す。
有効値: 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のアイテムに特有の関連問題である。]
説明: そのモデルアイテムが現在XFormsモデルの残りの部分に関係するかどうかを表す。XForms処理系は、その値がfalse
であれば、通常、関連付けられたフォームコントロール、およびその子をレンダリングしない。
有効値: xform:Boolean
として評価できる任意の式
デフォルト値: true
多くのフォームでは、他の状態に依存するフィールドをもつ。たとえば、応答者が車をもっているかどうかを質問するフォームがあるとする。もっている車の情報について質問するのは、彼らが持っていると指定した場合にのみ適切である。XFormsでは、これはrelevant
プロパティを通じて表す。
relevant
プロパティはXFormsユーザーインターフェースに可視性、フォーカス、タブ順序に関するヒントを与える。一般的には、true
のときは、関連するフォームコントロールはvisibleとされる。false
のときは、関連するフォームコントロールは、たとえXForms処理系がフォームコントロールを禁止するだけであるとしても、hiddenにされる。どちらの場合でも、そのフォームコントロールはタブ順序から削除され、フォーカスを受け取ることはできない。
以下の表はrequired
とrelevant
のインタラクションを表している。
required="true" | required="false" | |
---|---|---|
relevant="true" | このフォームコントロール (およびその全ての子)はvisibleでありユーザーから利用できる。XFormsユーザーインターフェースは値が必須であることを示しても良い。 | このフォームコントロール (およびその全ての子)はvisibleでありユーザーから利用できる。XFormsユーザーインターフェースは値が任意であることを示しても良い。 |
relevant="false" |
このフォームコントロール (およびその全ての子)はhiddenでありユーザーから利用できない。値の代入またはフォーカスの取得は許されるべきではない。XFormsユーザーインターフェースはこのフォームコントロールが関連項目であり、値が必須になるかもしれないことを示しても良い。 |
このフォームコントロール (およびその全ての子)はhiddenでありユーザーから利用できない。値の代入またはフォーカスの取得は許されるべきではない。 |
説明: 宣言されたデータ型が動的に計算されるものかどうかを表す。
有効値: 宣言されたデータ型に評価できる任意の式
デフォルト値: なし
XFormsモデルは、どこかの他の値から計算されたモデルアイテムを含んでも良い。たとえば、時間単位の価格(quantity times unit price)を表す行アイテムの合計、あるいは注文にかかる税金額などである。計算された値は他のモデルアイテムの値を用いた動的制約として表される。
説明: モデルアイテムの計算の相対的な優先順位を示す。
有効値: 0-32767の範囲にある整数として評価できる任意の式
デフォルト値: 0.
計算されるモデルアイテムについては、このオプションのプロパティが計算順序を決定する。
説明: 宣言されたデータ型の値が動的に検証されるかどうかを表す。
有効値: xform:Boolean
として評価できる任意の式
デフォルト値: true
XFormsモデルは、検証を必要とするモデルアイテムを含んでも良い。
指定された動的制約は、宣言されたデータ型の値が変更されたときに、毎回呼び出される。
妥当と思われるモデルアイテムについては、この式はtrue
として評価しなければならない。
この仕様の将来のバージョンでは、直接的な検証と送信時の検証について、詳しく説明する予定である。
ここで用いられている動的制約は、それらを呼び出したインスタンスデータアイテムだけを評価するよう制限されているものではない。動的制約言語はインスタンスデータをトラバースする手段と同様に、外部スクリプトの呼び出し(call-out)も提供する。
このXForms ユーザーインターフェースは、そのフォームコントロールが現在妥当か、妥当でないかを示しても良い。
[編集者のフィードバックリクエスト 5.2.7.cascade: validate
プロパティは、その全ての親または子となるモデルアイテムについても、値が変更された時は評価されるのか? モデルアイテム間の制約が評価されることを明確にしなければならない。]
XFormsで定義された基本データ型は、XFormsアプリケーションで用いるために、個別に用いられても良いし、適切な構造体を構成するために集合しても良い。XFormsは、XML Schemaの構造に該当する対応するいくつかの構造体を提供する。
スキーマに忠実なXForms処理系は、XFormsモデルの中で、任意の複雑なスキーマ構造を用いることができる。完全なスキーマシンタックスは[XSchema-1]および[XSchema-2]で見ることができる。
説明: 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
- 動的に列挙型リストを生成するオプションの動的制約。
例外のシンタックス:
<string>
は任意の数の(0 or more)mask
ファセットのリストメンバーを表す子<mask>
をもつ。mask
は属性としては許されない。<money>
は任意の数のallowedCurrency
ファセットのリストメンバーを表す子<allowedCurrency>
をもつ。allowedCurrency
は属性としては許されない。<uri>
は任意の数のscheme
ファセットのリストメンバーを表す子<scheme>
をもつ。scheme
は属性としては許されない。<binary>
は任意の数のmediaType
ファセットのメンバーを表す子<mediaType>
をもつ。mediaType
は属性としては許されない。enumeration
ファセットは以降のセクションで説明されている。name
モデルアイテムプロパティは必須である。
編注: <money>
は原始データ型として考えることはできない(データ型の章における編集者のフィードバックリクエストを参照)が、そのためデータ型ではなく構造であると考えることはできる。
他の場所で定義されているデータ型(Schemaフォーマットにあるような)をXFormsモデルにインクルードする方法が必要になる。1つのシンタックスの提案としては:
<xform:element type="スキーマデータ型" />
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>
説明: 限定列挙の原始データ型をXFormsモデルに設定する。列挙はその特別なシンタックスのため、ここで特別に言及する。
Simpleシンタックス: 列挙データ型は上記のように原始データ型として宣言されるが、以下に追加のシンタックスがある:
enum
は、open
(the default)またはclosed
となりうる。closed
の場合、列挙は厳格に定義された値に限定される。open
の場合、その他の全ての制約ファセットを満足する限り、他の値も許容される。<value>
を指定されることで、列挙された値空間に制限されうる。choice
を指定されることで、列挙された値空間に制限されうる。このリストは子<value>
によってさらに用いられる。
XML 表現 : <value>
<value id = xsd:ID > <!-- Content: #PCDATA --> </value>属性定義:
id
= xsd:ID
- オプションの一意識別子。
参考までに、open列挙型は次のような、複数選択の質問に「その他」の選択肢があるような状況で便利である:
編注: 機能的に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()"/>
説明: 順序づけられたデータ型の階層的集合を利用可能にする。
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.順序のないグループ: このワーキンググループでは、上記の順序付きグループに加えて順序のないグループというオプションが必要かどうか、フィードバックを求めている。]
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>
説明: 同類のコレクション(つまり、配列の全メンバーは同じ構造をもつ)を利用可能にする。
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 -->
説明: 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つの
case
がcondition
を伴わなくて良く、これはデフォルトの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)を構築したり、実行時にどの単一可変構造がインスタンス中で生成されるべきかを決定することができる。
XML Schemaは外部ネームスペースの属性に目印をつけることができる。エレメントを追加する方が問題になりやすい。この仕様の将来のバージョンではより詳細にどのようにXFormsデータ型、プロパティ、構造がXML Schema中で用いられることができるかについて説明する。
XForms作成者は、既に外部XML Schemaで定義されているデータ型と構造体を利用したいと考えるであろう。XFormsアプリケーションで用いる場合、このようなスキーマはXFormsの実行時制約を表す動的プロパティを用いて参照(annotate)されることが必要になる。
この仕様の将来のバージョンでは、どのようにオリジナルのスキーマを変更することなくXFormsに外部スキーマへの参照を追加するかについて説明する。
1つのシンタックスとして提案されるのは:
<xform:annotateElement elementID="age" min="17" max="63" />