W3C(World Wide Web Consortium)は、プレゼンテーション用のXForms標準と、一連のフォーム・データを開発しました。W3C勧告の中に述べられているように、XFormsの目的は「Webのための次世代のフォーム」となることです。この勧告自体が宣言しているように、「XFormsは、通常のXHTMLフォームを3つの部分(XFormsモデルとインスタンス・データ、ユーザー・インターフェース)に分割することによってフォーム内容からプレゼンテーションを分離し、再利用を可能とし、強い型付けを実現しており、それによってサーバーとの間の往復が減少し、またデバイスからの独立、スクリプト記述の必要性低下を実現しています。」
XForms文書は、1つ以上のXMLインスタンス文書を含むデータ・モデルを特徴としています。フォームはインスタンス文書を操作し、そのXMLをバックエンド・システムに送信できるようになっています。Schematronはそれ自体がXMLであるため、XFormsはそれを、フォームに対するデータ・モデルの一部として容易に扱うことができます。
XFormsは、2006年の3月14日にXForms 1.0仕様の第2版がリリースされたことによって、重要なマイルストーンを達成しました。それから間もなく、Schematronサポートを含んだXML Forms Generatorへのアップデートが、alphaWorksから入手できるようになりました。
XML Forms Generatorを利用すると、フォーム開発を即座に開始することができます。XML Forms Generatorは、XHTML文書の中に埋め込まれたXFormsマークアップを含んだ、有効な、そして適切に動作するフォームを、自動的に生成します。フォーム生成のための入力は、XMLデータ・インスタンス(XML Schemaあり、なし)、あるいはWSDL(Web Services Description Language)文書です。
XML Forms Generatorは、オープンソースのEclipseワークベンチ(参考文献を見てください)へのプラグインとして、alphaWorksで2005年4月に最初にリリースされました。XML Forms Generatorに関するalphaWorksのページへのリンクを参考文献に挙げましたので、インストール方法を含め、詳細はそれを見てください。
XML Schemaは広く使われており、またXMLの構造や内容を静的に記述するために適しています。しかしXML Schemaは、インスタンスの動的な分析に関しては限定されています。例えばXML Schemaでは、「要素AとBの値の合計は100でなければならない」といった方法でXML文書に制約をかけることができません。
Schematronでは、こうした制約を容易に規定することができます。XML Schemaと同様、SchematronそのものがXMLであり、従ってXFormsとは非常にうまくなじみます(XFormsそのものが、XMLデータを操作するためのXMLマークアップです)。タグ・セットが小さいことや、おなじみの構文(XPathなど)を使うことことから、Schematronは簡単に学んで書くことができ、しかも非常に強力です。
ISO(International Organization for Standardization)は、Schematronの標準化に向けて作業を行っており、仕様の原案が入手できるようになっています(参考文献)。一方、Schematron 1.5は非常に広く受け入れられており、XML Forms GeneratorはSchematron 1.5文書のみを扱います。
Schematron文書は基本的に、XMLデータに適用される一連の制約です。具体的なSchematron制約は、下記の2つの方法のいずれかを使って表現することができます。
- アサーションとして。つまり、ある条件に対するテストがインスタンス文書に適用されます。インスタンス文書が有効であるためには、すべてのアサーションはtrueと評価される必要があります。
- レポートとして。この場合も、ある条件に対するテストが適用されます。しかし、テストの意味はアサーションの意味と逆です。つまり、もしテストを評価した結果がtrueの場合は、その文書は無効な状態にあると見なされます。
Schematronでは、『ルール』と言われる構成体の中にアサーションとレポートを一緒に集めることができ、そうしてから、こうしたルールを『パターン』の中に集めることができます。
XPathを使うとテスト条件を規定することができ、またテスト条件が適用されるコンテキストを規定することもできます。またSchematronを作成する人は、ある条件に違反した場合に適用されるテキストを提供することもできます。このテキストは人が読み取れるものであることが多く、データ・インスタンスを操作するエンド・ユーザーを対象にしています。あるいは、与えられたSchematron文書で定義される制約に合致すべきXMLインスタンスを構築するXML開発者を対象に、このテキストにもっと技術的な性格を持たせることもできます。
この記事では全体を通して、リスト1に示す単純なXMLインスタンス文書を使用します。
リスト1. 単純なXML文書
<?xml version="1.0"?>
<root xmlns="http://www.example.org"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.example.org Simple.xsd">
<A>100</A>
<B>0</B>
</root> |
リスト1のXMLインスタンス文書は、Simple.xsdというスキーマを参照しています。この内容をリスト2に示します。
リスト2. 単純なXML文書に対するXML Schema
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.example.org"
xmlns:ex="http://www.example.org"
elementFormDefault="qualified">
<xsd:element name="root" type="ex:rootType"/>
<xsd:complexType name="rootType">
<xsd:sequence>
<xsd:element name="A" type="xsd:integer"/>
<xsd:element name="B" type="xsd:integer"/>
</xsd:sequence>
</xsd:complexType>
</xsd:schema> |
リスト2のXML Schema文書は、要素Aと要素Bの両方をinteger型として宣言しています。しかしXML Schemaは、この2つの要素の値に対して制約を定義することができません(つまり2つの和が100でなければならない、と規定することができません)。しかしSchematronでは、この制約を容易に定義できるのです。これをリスト3に示します。
リスト3. 単純なXML文書に対するSchematron定義
<?xml version="1.0"?>
<sch:schema xmlns:sch="http://www.ascc.net/xml/schematron">
<sch:title>AB Example</sch:title>
<sch:ns uri="http://www.example.org" prefix="ex" />
<sch:pattern name="Our Only Pattern" id="pattern1">
<sch:rule context="/ex:root" id="sum100">
<sch:assert test="ex:A + ex:B = 100">
The sum of the values of A and B must be 100.
</sch:assert>
</sch:rule>
</sch:pattern>
</sch:schema> |
まだSchematronを簡単に紹介しただけですが、それでも、この文書が何を言っているかが分かると思います。これが適用されるXMLデータでは必ず、1つだけあるassert要素のtest属性のXPath式で宣言されている通り、Aの値とBの値の和は100である必要があるのです。
XML Forms Generatorの中でSchematron文書を表現する
XML Forms Generatorでは、プレファレンス・カテゴリーのグローバル・プレファレンス設定(Window > Preferences)を使って、フォーム生成中に処理したいSchematron文書を定義します。
指定されたSchematron文書に対して、2つのアクションのうち、いずれかを行います。これについては次に詳しく説明しますが、とりあえずは、Schematron schema locationプレファレンスをアクティブにするためには、この2つのオプションのいずれか、あるいは両方を選択するのだ、ということを知っていれば十分です。次にBrowseを選択して、生成したフォームに適用すべきスキーマ文書を指定します。
図1. XML Forms GeneratorでのSchematron処理オプション
場合によると、Schematron制約がXML Schema文書の中(通常はXML Schemaのappinfoの中)に含まれているかもしれません。しかしXML Forms Generatorは、スタンドアローンのSchematron文書しか処理できません。
XFormsでは、制約が満足されない限り送信されないように、インスタンス・データに制約を規定することができます。Schematronのプレファレンス・ページにある最初のオプション、Apply constraints found in a schematron schemaは、XML Forms Generatorが生成する全てのXForms文書に対してSchematron文書で規定される制約を適用するように、XML Forms Generatorに伝えます。
XFormsは、制約をインスタンス・データにバインドすることによって制約を適用します。XML Forms Generatorをリスト1のデータを使ってリスト3のSchematron文書に対して実行し、Apply constraintsオプションを選択すると、リスト4に示すXFormsバインドを持つフォームが作成されます。
リスト4. フォーム送信を制約するXFormsバインド
<xforms:bind nodeset="instance('instance_model_root')"
constraint="instance('instance_model_root')[ex:A + ex:B = 100]"/>
|
このXFormsバインド要素には、nodesetとconstraintという2つの属性があり、どちらもXPath式を使います。リスト4では、インスタンス文書の中の制約すべきノードを、nodeset属性が記述します。この例では、XFormsのinstance() ファンクションは、名前付きインスタンスの中にある全データが制約されていることを示します。constraint属性はブール式を含んでおり、この式はデータの制約条件を定義します。このXPath式は、先ほどSchematro文書の中で見た制約(要素AとBの値の和が100でなければならない)を強制します。
もし、この式の評価結果がtrueではない場合には、nodeset属性が指すデータ(この例では文書全体)は無効と見なされ、従って送信されません。図2は、XML Forms Generatorによって生成された単純なフォームをMozilla Firefoxで描画したものです。
図2. Firefoxで描画したフォーム
図2で、AとBの値を変更して合計が100以外になるようにすると、フォームに適用された制約が明確に分かります。この状態では、現在はデータが無効という事実がバインディングによって適用されているため、Submitボタンを押しても何も起こりません。逆に、制約を満足する値を与えれば、Submitボタンを押すことによってXMLデータは送信されます。
XFormsでは、コントロールを動的に見せたり隠したりすることもできます。これにもデータに対するバインドを使いますが、この場合はrelevantモデル・アイテム・プロパティーいうプロパティーを使います(XFormsの仕様では、XFormsのモデル・アイテム・プロパティーを詳しく説明しています・・参考文献を見てください)。XML Form Generatorのプレファレンス(図1)に用意されている、もう一方のSchematronオプション(Generate validation message outputs from schematron messages)では、Schematron文書の中で個々のアサートやレポートに対して与えられているメッセージを条件付きで表示するために、この機構を使っています。
この場合は、各メッセージに関連付けられたSchematronアサートあるいはレポートで規定されるテストに基づいて、各メッセージの表示を個別にコントロールします。従って、各アサートやレポートは、独自の関連性(relevance)バインドを持っています。その一例をリスト5に示します。
リスト5. Schematronメッセージに関連性バインドを適用する
<xforms:bind id="pattern_Our Only Pattern_rule_1_assert_1"
nodeset="instance('instance_model_root_schematron')/
sch:pattern[@name='Our Only Pattern']/sch:rule[1]/sch:assert[1]"
relevant="instance('instance_model_root')[not( ex:A + ex:B = 100 )]"/> |
リスト5は、サンプルのSchematron文書の中に与えられた制約に対して生成されるバインドを示しています。制約のバインディングの場合と同様、このバインド要素には、バインディングの適用対象となるXMLデータ・インスタンス(この場合はSchematron文書)内のノードを規定するnodeset属性があります。また各要素には、Schematron文書内の対応するアサートあるいはレポートに対するテスト条件を規定する、relevant属性も含まれています。nodeset属性の値で規定されるノードは、relevant属性値がtrueと評価された場合のみ、relevant(関連あり)です。データ・ノードがrelevantである場合には、ブラウザーは、そのノードに関連した全てのXFormsコントロールを表示します。ノードがrelevantではない場合には、関連したコントロールは通常は隠されます。
Schematron文書そのものがインスタンス・データとしてフォームに利用できるようになっているため、Schematron文書の中のノードに対して、自由にコントロールをバインドすることができます。ここでは単純にテキストを表示することに関心があり、こうしたノードにデータ入力機会を与えることに関心があるわけではないので、xforms:outputコントロールは自然な選択です。
Schematronメッセージに関連性を適用するためのデータ・バインディングは既に存在しているため、output要素に対するbind属性を使って、それぞれをメッセージに関連付けることができます。これをリスト6に示します。
リスト6. Schematronメッセージを表示する
<xforms:output bind="pattern_Our Only Pattern_rule_1_assert_1"
model="model_root"/>
|
図3に示す画面はFirefoxで表示したフォームを示しており、値の和は100ではありません。
図3. Firefoxで表示したフォーム(値はSchematron制約に違反している)
リスト7は、制約生成オブションとメッセージ生成オブションの両方を使って生成された後の、フォームの全ソースを示しています。先に触れた2つのインスタンス、つまりXMLインスタンス・データを参照するインスタンスと、Schematron文書を参照するインスタンスに注意してください。
リスト7. フォームのソース
<?xml version="1.0" encoding="UTF-8"?>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:xforms="http://www.w3.org/2002/xforms"
xmlns:sch="http://www.ascc.net/xml/schematron"
xmlns:ex="http://www.example.org">
<head>
<title>AB Form</title>
<xforms:model id="model_root" schema="../data/Simple.xsd">
<xforms:instance id="instance_model_root" src="../data/Simple.xml"/>
<xforms:instance id="instance_model_root_schematron" src="../data/Simple.sch"/>
<xforms:bind id="pattern_Our Only Pattern_rule_1_assert_1"
nodeset="instance('instance_model_root_schematron')/
sch:pattern[@name='Our Only Pattern']/sch:rule[1]/sch:assert[1]"
relevant="instance('instance_model_root')[not( ex:A + ex:B = 100 )]"/>
<xforms:bind nodeset="instance('instance_model_root')"
constraint="instance('instance_model_root')[ex:A + ex:B = 100]"/>
<xforms:submission id="submit_model_root" ref="instance('instance_model_root')"
action="http://xformstest.org/cgi-bin/showinstance.sh"
method="post"/>
</xforms:model>
</head>
<body>
<xforms:group>
<xforms:label>AB Form</xforms:label>
</xforms:group>
<xforms:input ref="instance('instance_model_root')/ex:A" model="model_root">
<xforms:label>A</xforms:label>
</xforms:input>
<xforms:input ref="instance('instance_model_root')/ex:B" model="model_root">
<xforms:label>B</xforms:label>
</xforms:input>
<xforms:output bind="pattern_Our Only Pattern_rule_1_assert_1" model="model_root"/>
<xforms:submit submission="submit_model_root">
<xforms:label>Submit</xforms:label>
</xforms:submit>
</body>
</html> |
この記事では、XML Forms GeneratorのSchematronの処理機能を、1つのアサーションを持つ単純なSchematron文書を使って説明しました。XML Forms Generatorは、任意の数のルール宣言を持つSchematron文書を処理することができ、またSchematron report要素やSchematron assert要素も適切に処理することができます。
もちろん、フォームでの制約を使って、(自動化は簡単ではないかも知れませんが)他のことをすることもできます。例えば制約違反が起きた場合、それを知らせるメッセージから、違反の主因となっているフィールドへのリンクを提供することができます。例えばOrigo Standards Ltd.が開発したInstance Validatorフォーム(参考文献を見てください)では、違反フィールドの近くにまでナビゲートするための機構が提供されています。しかし、たとえ単純な場合であっても、ある特定なフィールドに問題があると容易に判定できるわけではないことに注意してください。例えば、AとBの和が100ではない場合、Aの値だけ、あるいはBの値だけが問題、と言うことはできません。
ここで生成したフォームはスタイルシートを参照しておらず、また、フォーマットのための方法も含んでいません。しかしXML Forms Generatorでは、この記事では取り上げなかった豊富なオプションが用意されており、それらを使ってフォームの見栄えや機能を改善することができます。またXML Forms Generatorには充実したドキュメンテーションが用意されており、Eclipseのヘルプ・システムに組み込まれています。さらに、ここで説明した単純なSchematron例のようなものを含め、非常に様々なサンプルが用意されています。また、alphaWorks(参考文献を見てください)から入手できるVisual XForms Designerを使えば、特定な必要性に合わせて、生成されたフォームを微調整することもできます。
こうした無料のツールは、皆さんが自由に使うことができます。これらを使うことによって、完全機能の、標準に準拠したフォームを、素早く構築できるのです。
学ぶために
-
Origo Standards, Ltd.によるInstance Validatorフォーム: ここから、XForms文書でのSchematron制約の使い方を学んでください。
-
www.schematron.com: ここではSchematronのすべてを学ぶことができ、またANSI仕様とSchematron 1.5仕様の両方へのリンクも用意されています。
-
W3CのXFormsのホームページ: 正式なXForms仕様や、様々なXForms描画オプションへのリンクが用意されており、XFormsについて詳しく知ることができます。
-
W3C(World Wide Web Consortium)のサイト: XHTMLやCSS(Cascading Style Sheets)、XML、XML-Event、XPathなど、関連する標準について詳しく知ることができます。
-
XMLとXML Schema: developerWorksのXMLゾーンには、広範な話題を網羅した技術記事やヒント、チュートリアル、標準、IBMレッドブックなどが用意されています。
製品や技術を入手するために
-
XML Forms Generator: alphaWorksから入手できる、このEclipseベース・ツールを使うと、適切に動作する、標準に準拠したフォームを、マウスのクリック1つで作成することができます。
-
Mozilla XForms: このプラグインを使って、標準に準拠したフォームをMozilla Firefoxに描画してください。
-
Visual XForms Designer: このホームページを調べてみてください。インストール方法や前提条件、フォーラムなどへのリンクが用意されています。
-
Compound XML Document Toolkit: 他のオープンスタンダードXMLマークアップ、つまりSVG(Scalable Vector Graphics)やMathML、VoiceXML、SMIL (Synchronized Multimedia Integration Language)などについて調べてみてください。
-
Eclipse: オープンソースのEclipseワークベンチとWeb Toolsプラットフォームを入手してください。
議論するために
-
XML Forms Generator discussion forum: 皆さんの質問に対する答えを、ここで見つけてください。
Jan Joseph Kratky は、Compound XML Document Editor と XML Forms Generator の開発リーダーです。現在はノースキャロライナ州 Research Triangle Park にある IBM Emerging Software Standards のソフトウェア・エンジニアであり、Cornell University にて学位を、そして Rensselaer Polytechnic Institute にて修士号を取得しています。彼は Sun 認定のJava プログラマー、Sun 認定の Web コンポーネント開発者として、Java 技術には 1997 年から、そして Eclipse 技術には 2001 年から従事しています。
Kevin E. Kellyは、IBMのシニア・ソフトウェア・エンジニアとして、ソフトウェア標準化に従事しています。W3CのXForms Working Groupと、W3CのCompound Document Format Working Groupのメンバーとして、XMLベースでモデル駆動の手法に基づいた高速で効率的な標準の採用を図るべく、クライアント技術と新興のオープン・スタンダード・ベース技術に集中した活動を行っています。IBMに入社する前には、8年間 Rational Softwareを扱っており、UMLモデリングとJava技術に関した業務を行ってきました。Mercer Universityにて学位を、またUniversity of Montanaで修士を取得しています。