SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

japan.internet.com翻訳記事

XMLデータストリームの検証を動的プロセスにする

宣言スキーマを使った分散コンテキストにおけるXMLデータストリーム処理

見かけより単純なSchematron

 安全性には劣りますが、もっとシンプルなシステムにする方法もあります。それは、検証メカニズムに、スキーマファイルの外部のリソースと対話するだけのインテリジェンスを組み込むことです。実は、このアプローチはISO Schematronが採用しているものです。Schematronの背後にある考え方は見かけより単純です。Schematronドキュメントは、XMLで書かれたルールのコレクションから成り、各ルールはXPath式で表される特定のコンテキストを操作します。各ルール内には、コンテキストに関する特定の条件をテストする一連のアサーション(それ自体がXPath式と述語から成ります)が含まれます。条件が真なら何も起こりませんが、偽であればSchematronは特定のテキストまたはXHTMLフォーマットでメッセージを返します。カスタムのパーサーを使うこともできますが、ほとんどの一般的なSchematronのプロセスは次のように実行されます。

  1. Schematronドキュメントを作成する。
  2. 特別なSchematronのXSLTを使ってSchematronを変換し、続いて別のXSLT(Schematronフィルタ)を生成する。
  3. Schematronフィルタで検証されるファイルを変換してレポートを作成する。
  4. ユーザーまたは別のプロセスにレポートを渡す。

 この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コンテンツを単一の静的なドキュメントで記述できた時代は過ぎ去ろうとしているのです。

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
japan.internet.com翻訳記事連載記事一覧

もっと読む

この記事の著者

japan.internet.com(ジャパンインターネットコム)

japan.internet.com は、1999年9月にオープンした、日本初のネットビジネス専門ニュースサイト。月間2億以上のページビューを誇る米国 Jupitermedia Corporation (Nasdaq: JUPM) のニュースサイト internet.comEarthWeb.com からの最新記事を日本語に翻訳して掲載するとともに、日本独自のネットビジネス関連記事やレポートを配信。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

Kurt Cagle(Kurt Cagle)

ライター、情報アーキテクト、XML News NetworkとMetaphorical Webのウェブマスター。カナダ、ブリティッシュコロンビア州のビクトリア在住。XMLToday.orgの編集長、O'Reilly Mediaの寄稿編集者。現在、XBRLに関する著書を執筆中。彼のTwitterはtw...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/2234 2008/03/10 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー