Vocabulary Connection 技術解説

xfy technologyではXML文書を表現・編集するために、ボキャブラリコネクションという機構を規定しています。この章では、ボキャブラリコネクションの概要について説明します。

1. VCの特徴

多くのXML文書は、テキストや数値を扱うことを目的に使用されています。このようなXML文書向けに特化した編集ツールは、Webフォームと同様の画面で入力を行います。つまり、ほとんどのXML文書はHTMLの表示系を利用して表現できると言い換えられます。

この考え方をさらに進めると、XML文書をHTMLを利用した表現形式に変換できる変換機能と、その表現形式を表示・操作できる編集機能とを兼ね備えていれば、ほとんどのXML文書はより平易な方法で編集できるということができます。

一方で、グラフィックデータを扱うSVGに代表される、テキストや数値以外を扱うことを目的としたXML文書には、それに適した表示・編集の仕組みが必要となります。

xfy technologyは、ワードプロセッサで文書を編集するときのように、複合XML文書を含むあらゆるXML文書を、要素や属性の定義に煩わされることなく編集できる環境を提供する目的で開発されています。xfy technologyは複合XML文書内に含まれるそれぞれのXMLボキャブラリごとに最適な表示・編集を行うプラグインを適用することで、最適な表示・編集環境を提供します。xfy technologyの機能は特定の用途に特化されていないため、XML文書を表示・編集するあらゆる場面で利用できます。

xfy technologyは、XMLボキャブラリを管理して適切に利用できる仕組みを提供することで、前述の目的を実現します。

ボキャブラリに対する処理を、xfy technologyで実現するために開発された機構が、ボキャブラリコネクション(Vocabulary Connection、以下、VCと表記)です。

VCは、次に示す特徴を有しています。

  1. 複合XML文書を含むXML文書を、別のXML文書に変換する機能を有する
  2. 変換されたXML文書を表現するために提供された、ビュー(キャンバス)を利用する
  3. ユーザー操作をキャンバスからイベントとして受け取ることで、変換元のXML文書を編集できる
  4. 変換元XML文書を変更した結果が、キャンバス上に即時に反映される

VCをXML文書に適用するために、XVCDと呼ばれるスクリプト言語が定義されています。XVCDは、それ自体がXML形式で表現されます。対象とするXML文書にXVCDを適用することで、VCの特長を利用してXML文書を閲覧・編集できるようになります。

XVCDのXML文書変換機能を実現する要素・属性は、原則的にXSLT 1.0の要素・属性に準拠して再定義しています。機能上の要求に応じて、XSLT 2.0ワーキングドラフトの要素を取り入れたり、独自の要素を追加したりしている場合があります。

XVCDには、XML文書を編集するために、キャンバス上でのユーザー操作に対応する処理を指定する機能があります。

1.1. VCの設計原則

VCは、以下の原則に基づいて設計されています。

  • VCの枠組み内で行われた編集操作は、必ず変換元のXML文書に対して適用される
    VCの枠組みでは、キャンバス上のユーザー操作に対応してイベント処理・コマンド呼び出しを行い、変換元のXML文書を変更します。そのあと、変換元のXML文書の変更結果に基づいて、変換後のXML文書を調整します。決して、変換後のXML文書の変更結果を変換前のXML文書にフィードバックする手順での処理は行いません。
  • キャンバスは文書の表示と発生したイベントの送出に徹する
    操作の対象となったXML要素や、操作の種別程度の判断はキャンバスで行います。しかし、行われた操作が対象のXML要素にとってどのような意味を持つかは、キャンバスではなく、より内部の層で判断されます。
  • 標準化されている仕様にはできるだけ従う
    XML文書の表示・編集に関連して標準化されている仕様がある場合、その目的が類似する部分は利用します。 また、必要に応じて、機能の拡張を行います。ただし、必要性がないと判断した場合は、機能を部分的に削除する場合もあります。
  • プラグインで機能拡張を可能とする
    XML文書を既存のVCの枠組み内では表現できない場合、プラグインを作成してVCの枠組みを拡張することで、対応することができます。VC自体もプラグインで実現されています。
  • 実際の利用局面を想定せず、XML文書を表示・編集することだけを考えて設計する
    利用局面を想定すると、機能が特定の用途に特化される可能性があります。この可能性を排除するため、VCはXML文書を表示・編集することだけを考えて設計し、用途の自由度を高めています。

1.2. VCによるXML文書変換

VCを使用したXML文書変換を実現する要素・属性は、原則的にXSLT 1.0に準拠して再定義した上で、VCで実現する機能に適合するように、追加・変更しています。 XML文書を処理するときに、その処理対象となるノードはXPathで指定します。XPath式の記述や使用できる関数は、XPath 1.0に準拠した上で、xfy technology独自の関数を追加しています。

VCのXML文書変換とXSLT 1.0との主な相違点は、以下の通りです。

名前空間、および、全体を含む要素
XVCDは、XSLTとは異なる名前空間を定義しています。同時に、XSLTの全体を含む要素であるxsl:stylesheet要素に相当する要素は、xvcd:xvcd要素として定義しています。
XML文書の変換範囲
XSLTはXML文書全体を別の形式の文書に変換します。VCでは部分木単位で変換処理を行います。変換する部分木をXMLボキャブラリの1単位として扱います。
XSLT 2.0ワーキングドラフトの要素の反映
XVCDでは、XSLT 2.0ワーキングドラフトで追加提案されている要素を参考に、いくつかの要素を追加定義しています。
複合XML文書をまとめて変換する機能の追加
複合XML文書を変換するときは、VCが名前空間を手がかりに適切なプラグインを選択して使用し、文書の変換を行います。

VCで使用できる関数とXPath 1.0の関数との主な相違点は、以下の通りです。

XPath操作用関数の追加
XVCDでは、データ変換時のXPath操作を拡張した関数を追加しています。拡張した関数を使用するときは、その関数が定義されている名前空間の名前空間プレフィックスを関数名の前に付ける必要があります。

1.3. VCによるXML文書の編集体系の構築

XSLTと異なり、VCはユーザー操作に対応して変換元文書を編集するための仕組みを提供します。また、URLで指定されたテンプレート文書を元に、新しいXML文書を作成する機能も提供しています。

VCで提供されるXML文書を編集する仕組みには、次の種類があります。

  • 文書変換機能を拡張して提供される編集機構
  • イベント/アクション
  • コマンドインストラクション
  • コマンド
  • ユーザーインターフェイス記述
  • ユーザーデータ・プロパティの管理
  • 新規XML文書の生成支援
  • 別プラグインへの処理の委譲

以下、VCでXML文書を編集するそれぞれの仕組みについて説明します。

1.3.1. 文書変換機能を拡張して提供される編集機構

VCでは、一部の文書変換機能を拡張し、編集のための機構を提供しています。これに該当する主な機能は次のとおりです。

変換元要素の分割・併合・作成
xvcd:splitコマンドインストラクションを使用すると、変換元の文書内の要素を分割できます。また、xvcd:combineコマンドインストラクションを使用すると、変換元の文書内の要素を併合できます。xvcd:insertコマンドインストラクションを使用すると、変換元の文書に新しい要素を挿入できます。
変換元XML文書内のノードデータの編集
VCでXML文書を変換するときにxvcd:value-of要素を使用すると、XSLTと同様、そのselect属性で指定されたノードの内容をテキストで変換後の文書に出力できます。このとき、xvcd:value-of要素で出力したテキストは、VCでも編集対象とすることはできません。VCでは、変換元XML文書のノードの内容を編集対象として扱うために、xvcd:text-of要素が用意されています。xvcd:value-of要素のかわりにxvcd:text-of要素を使用することで、変換元XML文書の内容を編集対象とすることができます。xvcd:value-of要素は必ず空要素となりますが、xvcd:text-of要素ではxvcd:filler要素を持つことができます。xvcd:filler要素は、xvcd:text-of要素で出力した変換元XML文書のノードのテキストが編集によって空値になるときの代替文字列を指定する要素です。xvcd:text-of要素のfiller属性を使用しても、xvcd:filler要素と同様に代替文字列を指定することができます。

1.3.2. コマンドインストラクション

コマンドインストラクションは、VCでXML文書を編集するために定義された基本的な命令です。

コマンドインストラクションには、XVCDで規定しているものと、xfy technologyのプラットフォーム層で規定されているものがあります。XVCDで規定されているコマンドインストラクションは、XML文書の編集操作で使用します。それに対し、プラットフォーム層で規定されているコマンドインストラクションは、ファイル・ディレクトリ操作や、ダイアログボックス表示、条件分岐などで使用します。

xfy technologyのプラットフォーム層で規定されているコマンドインストラクションは、XVCDとは異なる名前空間で定義されています。

1.3.3. イベント/アクション

VCでは、キャンバスでのユーザー操作に文書の編集操作を割り当てるために、イベント要素とxvcd:action要素が用意されています。

キャンバスでのユーザー操作は、VC上ではイベント要素で記述されたXML文書フラグメントとして表現されます。このフラグメントはキャンバスでユーザー操作があったときに生成されます。XVCDを記述するときに、イベント要素を記述することはありません。生成されたイベント要素は、XVCDに記述されたxvcd:action要素のevent属性に記述されたXPath式で評価されます。評価した結果が真となったとき、そのxvcd:action要素の内容に記述されたコマンドインストラクション列が実行されます。

イベントは、XVCDとは異なる名前空間として定義されています。

1.3.4. コマンド

コマンドは、変換元XML文書に対する編集操作を、xvcd:command要素を使用してコマンドインストラクション列で記述したものです。

記述したコマンドをXVCDで呼び出すときは、xvcd:command要素のname属性に記述したコマンド名で指定します。xfy technologyのプラットフォーム層で定義されたコマンドや、プラグインで拡張されたコマンドを使用することもできます。この場合、XVCDとは異なる名前空間に定義されたコマンドを使用することになります。

1.3.5. ユーザーインターフェイス記述

VCは、メニューやツールバーなどのユーザーインターフェイスを記述する仕組みを提供します。ユーザーインターフェイスは、ボキャブラリごとに記述できます。記述したメニューやツールバーには、コマンドを割り付けます。ユーザーインターフェイスの記述は、XVCDとは異なる名前空間で定義されています。

1.3.6. ユーザーデータ/プロパティの管理

VCでは、変換元XML文書のDOMツリー構成を変更することなく、それぞれのノードに属性のようなデータを付与することができます。このデータをユーザーデータと呼びます。また、同様に編集する文書に依存しない、システム全体で共有するデータを利用することができます。このデータを、プロパティと呼びます。ユーザーデータやプロパティは、XPathを拡張した関数で値を取得します。値を変更するときは、XVCD定義のコマンドインストラクションを使用します。

1.3.7. 新規XML文書の生成支援

XML文書として成立する文書には、XML宣言のほかに、最低限、使用する名前空間に従ったルート要素が必要です。ルート要素は名前空間によって異なるため、プログラム的な支援がなくては、機械的に新規XML文書を生成することはできません。VCでは、機械的に新規XML文書を生成するためのプログラム的支援を提供します。新規XML文書を作成するときに、そのテンプレートとなるファイルやフラグメントを指定します。同時に、XML文書を保存するときの推奨保存先を指定できます。

1.3.8. 別プラグインへの処理の委譲

1つのXML文書中に複数のボキャブラリが使用されていることがあります。XVCDでは、xvcd:vocabulary要素のmatch属性で記述した部分木の頂点要素のXPathパターンによって、適用するボキャブラリを指定します。

ボキャブラリの中には使用中のものとは異なるプラグインを使用しないと、表示や編集ができないボキャブラリが含まれる場合があります。このような場合、通常はVCが適切なプラグインを選択できるように処理を委譲することができます。あるボキャブラリ内から別プラグインに処理を委譲する場合は、xvcd:apply-vocabularies要素のselect属性で、そのボキャブラリを使用する部分木の頂点要素を指定します。

2. VCの動作イメージ

VCでXML文書を変換・編集するときの動作イメージを、図に示します。

VCの動作イメージ
VCの動作イメージ

VCの動作に関連する語句を説明します。

VCプラグイン
VCを実現するためのxfy technologyプラグインです。VCの中核機能を提供します。
VCマネージャ
XVCDファイルの記述に従ってコネクタファクトリとコマンドファクトリを生成・管理します。XVCDファイル1つに対して1つ作成されます。
ソースDOMツリー
変換元のXML文書に基づいて作成されたDOMツリーです。ソースDOMツリーのノードはソースノード、要素はソース要素と表現されます。ボキャブラリは、ソースDOMツリー内の任意のノードを頂点とした部分木として表現できます。この部分木は、ゾーン(または、ソースゾーン)と表現されます。
ソースペイン
ソースDOMツリーとVCキャンバスを保持します。
デスティネーションDOMツリー
ソースDOMツリーからノードや要素を取得してXVCDファイルの記述に従って変換した結果、作成されるDOMツリーです。デスティネーションDOMツリーのノードはデスティネーションノード、要素はデスティネーション要素と表現されます。
デスティネーションペイン
デスティネーションDOMツリーとデスティネーションキャンバスを保持します。
デスティネーションキャンバス
デスティネーションDOMツリーからノードや要素を取得して画面表示するビューです。また、ユーザーが画面上で行った操作を、イベントとしてデスティネーションDOMツリーに関連付けられたコネクタへ送出します。
コネクタ
ソースDOMツリーのノードと結びつき、必要に応じてデスティネーションDOMツリー内にデスティネーションノードを作成します。ソースDOMツリーのノードが変更された場合は、ディスティネーションDOMツリーを変更します。コネクタが結びつくソースDOMツリーのノードは、XPathで記述します。コネクタは、ツリー構造を形成します。
VCキャンバス
コネクタツリーを保持するキャンバスです。
コネクタファクトリ
ソースノードに対応したコネクタを生成します。コネクタファクトリ自身は、XVCDファイルに記述されたタグ構造とほぼ同じ形のツリー構造を形成します。
コマンドファクトリ
デスティネーションキャンバスから送出されたイベントに対応したコマンドを生成します。コマンドファクトリ自身は、XVCDファイルの記述に従ってマップ形式で作成されます。コマンドファクトリで生成されるコマンドでは、操作対象となるソースDOMツリーのノードをXPathで記述します。

VCは、おおよそ以下のような流れでXML文書を処理します。

XML文書の変換
  1. VCプラグインがXVCDファイルを解析し、VCマネージャを作成する
  2. XVCDファイルに記述されたボキャブラリごとに、ボキャブラリサービスを生成する
  3. ボキャブラリごとにVCキャンバスを作成する
  4. VCキャンバスは、ディスティネーションDOMツリーのルートノードを生成する
  5. VCキャンバスは、ソースゾーンの頂点要素に対応するコネクタを生成する
  6. VCキャンバスは、生成したコネクタで、ディスティネーションノードや子コネクタを必要に応じて生成するメソッドを実行する
  7. メソッドを実行されたコネクタは、必要に応じてディスティネーションノードや子コネクタを生成する
  8. 子コネクタを生成したコネクタは、生成したコネクタで、ディスティネーションノードや子コネクタを必要に応じて生成するメソッドを実行する
  9. 7.、8.を繰り返し、ソースゾーンのすべての要素で処理が完了したら、ディスティネーションDOMツリーのルートノードに含まれる文書要素を、ディスティネーションペインの頂点要素として設定する
コマンドの生成
  1. VCマネージャがXVCDファイル内のコマンドに関する記述を解析し、登録されているプラグインの情報と照合して、コマンドファクトリを生成する
  2. XVCDファイル内のコマンドに関する記述に対する処理を完了すると、VCマネージャの管理下にコマンドファクトリのマップが作成される
XML文書の編集
  1. デスティネーションキャンバス上で行われたユーザー操作をデスティネーションキャンバスがVCキャンバスのコネクタに通知する
  2. コネクタは、VCマネージャのコマンドファクトリからコマンドを生成して実行する
  3. コマンドはソースDOMツリーを変更する
  4. 変更を受けたソースDOMツリーのノードは、コネクタに変更を受けたことを通知する
  5. ソースノードから変更の通知を受けたコネクタは、対応するデスティネーションDOMツリーのノードを変更する
  6. 変更を受けたデスティネーションDOMツリーのノードは、デスティネーションキャンバスに変更を受けたことを通知する
  7. デスティネーションキャンバスは、変更されたデスティネーションDOMツリーに基づいて再表示を行う