見かけより単純なSchematron
安全性には劣りますが、もっとシンプルなシステムにする方法もあります。それは、検証メカニズムに、スキーマファイルの外部のリソースと対話するだけのインテリジェンスを組み込むことです。実は、このアプローチはISO Schematronが採用しているものです。Schematronの背後にある考え方は見かけより単純です。Schematronドキュメントは、XMLで書かれたルールのコレクションから成り、各ルールはXPath式で表される特定のコンテキストを操作します。各ルール内には、コンテキストに関する特定の条件をテストする一連のアサーション(それ自体がXPath式と述語から成ります)が含まれます。条件が真なら何も起こりませんが、偽であればSchematronは特定のテキストまたはXHTMLフォーマットでメッセージを返します。カスタムのパーサーを使うこともできますが、ほとんどの一般的なSchematronのプロセスは次のように実行されます。
- Schematronドキュメントを作成する。
- 特別なSchematronのXSLTを使ってSchematronを変換し、続いて別のXSLT(Schematronフィルタ)を生成する。
- Schematronフィルタで検証されるファイルを変換してレポートを作成する。
- ユーザーまたは別のプロセスにレポートを渡す。
このSchematronのアプローチはXSLT 1.0および2.0のプロセッサで使用できます(ただし一般的には2.0のアプローチをお勧めします。単純に、言語の機能がはるかに洗練されているからです)。どちらのバージョンも、重要な関数であるXSLTのdocument()関数を公開しています(ただし、XPath 1.0自体の一部ではありません)。
document()関数は引数を2つ受け取ります。1番目の引数はURL文字列またはURLのノードセットで(2.0ではシーケンスの場合もあり)、2番目の引数はドキュメントのコンテキストです(通常は現在のノードの参照を引数の値として受け取ります)。この関数の結果は、渡されたURLから得られる1つ以上のドキュメントです。注目すべきは、これらのURL自体がパラメトリックなGETベースのWebサービスである場合、それに基づいて外部のサービスからコンテンツを取得して、動的なタクソノミーからコンテンツを検証できるということです。
たとえば、1つのパラメータ(colorkey)を受け取るWebサービスがあり、そこから次のような形式のXMLノードが返されるものとします。
<color name="rd" label="Red" status="200" statusMessage="Color is valid."/>
このキーに対応する色が見つかった場合は、次のようなノードが返されます。
<color name="rd" label="Carmine" status="500" statusMessage="Color rd was found, but has been retired."/>
見つからない場合は、次のようなノードが返されます。
<color name="rd" label="(unknown)" status="400" statusMessage="Color 'rd' was not found."/>
これを利用して、既存のリソースを読み込み、サーバーに問い合わせを行い、アサーションが偽だったときに適切なエラーメッセージを生成するSchematronを作成することができます。具体的には次のようになります。
<schema xmlns=http://purl.oclc.org/dsdl/schematron>
<pattern id="confirmTaxonomies">
<rule context="colorkey">
<let name="$keyValue" value="."/>
<let name="colorDoc"
value="document(concat('colors.xq?colorkey=',$keyValue),.)"/>
<assert test="$colorDoc[@status=200]">
<value-of select="$colorDoc[@statusMessage]"/>
</assert>
</rule>
</pattern>
</schema>
この場合、パターンにはcolorkey要素に一致する1つのルールが含まれています。このルールでは、処理をわかりやすくするために最初にいくつかの式を定義した後、受け取ったコードの@statusが200(HTTP 200の"success"コードに該当)かどうかを判定します。そうでない場合(つまり、Webサービスがエラーを返した場合)は、バリデータはメッセージの詳細を出力処理ストリームに出力します。
XMLデータストリームを扱う人は、ここで紹介したSchematronのようなものを、分散コンテキストでも正常に動作する宣言スキーマとして使うアプローチをもっと詳細に研究しなければなりません。ネットワークでの接続がますます進む環境では、検証自体も「グローバル化」する必要があり、よりいっそう機能性を高め、新しい処理モデルに移行していく必要があります。もはや、XMLコンテンツを単一の静的なドキュメントで記述できた時代は過ぎ去ろうとしているのです。
