データ処理装置及びデータ処理方法
【課題】マークアップ言語により構造化された文書を適切に処理する技術を提供する。
【解決手段】マッチングユニット70は、マークアップ言語により記述されたデータのパターン間の対応関係を定義した規則に基づいて、比較元のデータに合致するパターンを選択するマッチング部76と、変数を含むパターンが選択されたとき、選択されたパターンにおける変数の位置と対応する位置にある比較元のデータを変数に代入する変数管理部74を含む。変数管理部74は、比較元のデータがマークアップ言語により記述されたデータであり、選択されたパターンにおける変数の位置と対応する位置にある比較元のデータが複数のノードを含むフラグメントである場合、フラグメントを変数に代入する。
【解決手段】マッチングユニット70は、マークアップ言語により記述されたデータのパターン間の対応関係を定義した規則に基づいて、比較元のデータに合致するパターンを選択するマッチング部76と、変数を含むパターンが選択されたとき、選択されたパターンにおける変数の位置と対応する位置にある比較元のデータを変数に代入する変数管理部74を含む。変数管理部74は、比較元のデータがマークアップ言語により記述されたデータであり、選択されたパターンにおける変数の位置と対応する位置にある比較元のデータが複数のノードを含むフラグメントである場合、フラグメントを変数に代入する。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、文書処理技術に関し、特に、マークアップ言語により記述された文書を処理する文書処理装置及び方法に関する。
【背景技術】
【0002】
XMLは、ネットワークなどを介して他者とデータを共有するのに適した形式として注目されており、XML文書を作成、表示、編集するためのアプリケーションが開発されている(たとえば、特許文献1参照)。XML文書は、文書型定義などにより定義されたボキャブラリ(タグセット)に基づいて作成されている。
【先行技術文献】
【特許文献】
【0003】
【特許文献1】特開2001−290804号公報
【発明の概要】
【発明が解決しようとする課題】
【0004】
ボキャブラリは、任意に定義することが許されており、理論上、無限に多くのボキャブラリが存在しうる。本出願人は、このように柔軟な設計が許されるXML文書を適切に処理することが可能な技術を開発した。そして、XMLの長所を十分に生かした利便性の高いデータ処理技術を想到するに至った。
【0005】
本発明はこうした状況に鑑みてなされたものであり、その目的は、マークアップ言語により構造化された文書を適切に処理する技術を提供することにある。
【課題を解決するための手段】
【0006】
本発明のある態様は、データ処理装置に関する。このデータ処理装置は、マークアップ言語により記述されたデータのパターンと、マークアップ言語により記述されたデータ又はマークアップ言語により記述されていないデータのパターンとの間の対応関係を定義した規則を取得する規則取得部と、比較元のデータを取得するデータ取得部と、前記比較元のデータに合致するパターンを選択するマッチング部と、を備え、前記マッチング部は、前記パターンに変数が含まれる場合、前記パターンのうち前記変数以外のデータが前記比較元のデータに合致するパターンを選択し、前記変数を含む前記パターンが選択されたとき、選択された前記パターンにおける前記変数の位置と対応する位置にある前記比較元のデータを前記変数に代入する変数管理部を更に備え、前記変数管理部は、前記比較元のデータがマークアップ言語により記述されたデータであり、選択された前記パターンにおける前記変数の位置と対応する位置にある前記比較元のデータが複数のノードを含むフラグメントである場合、前記フラグメントを前記変数に代入することを特徴とする。
【0007】
前記変数管理部は、選択された前記パターンにおける前記変数の位置と対応する前記比較元のデータの位置に、前記変数に代入可能な同種又は異種混合のデータが複数並列して存在する場合は、それらをリストとして前記変数に格納してもよい。
【0008】
前記変数管理部は、前記比較元のデータがマークアップ言語により記述されたデータであったときに、選択された前記パターンにおける前記変数の位置と対応する前記比較元のデータの位置にあるノードが複数の兄弟ノードを持つ場合は、それらのノード又はそれらのノードを頂点ノードとするフラグメントをリストとして前記変数に格納してもよい。
【0009】
前記変数管理部は、前記変数に、複数の任意のデータにマッチさせることを示すワイルドカードが付されている場合に、マッチした複数のデータをリストとして前記変数に格納してもよい。
【0010】
前記変数管理部は、前記変数に、前記フラグメントのうちテキストノードを含まない任意のデータをマッチさせることを示すワイルドカードが付されている場合に、マッチしたフラグメントのうちテキストノードを除いたデータを前記変数に代入し、前記変数に、テキストノードも含んだ任意の前記フラグメントをマッチさせることを示すワイルドカードが付されている場合に、マッチしたフラグメントを前記変数に代入してもよい。
【0011】
データ処理装置は、前記マッチング部がマークアップ言語により記述された要素又は属性同士を比較する際に、前記要素又は前記属性同士の名前空間を比較する名前空間管理部を更に備えてもよく、前記マッチング部は、前記名前空間管理部により前記要素又は前記属性同士の名前空間が合致しないと判定された場合は、前記要素又は前記属性同士が合致しないと判定してもよい。
【0012】
データ処理装置は、前記比較元のデータを、選択された前記パターンに対応するパターンのデータに変換する変換部を更に備えてもよい。
【0013】
前記規則のうち、少なくとも一つの対応関係の定義は、対応する2つのパターンの間で同じ変数を含んでもよく、前記比較元のデータに含まれるデータが前記変数に代入されることにより、前記比較元のデータが、前記比較元のデータの少なくとも一部を含んだ、前記比較元のデータとは異なるパターンのデータに変換されてもよい。
【0014】
本発明の別の態様は、データ処理方法に関する。このデータ処理方法は、マークアップ言語により記述されたデータのパターンと、マークアップ言語により記述されたデータ又はマークアップ言語により記述されていないデータのパターンとの間の対応関係を定義した規則を取得するステップと、比較元のデータを取得するステップと、前記比較元のデータに合致するパターンを選択するステップと、前記パターンに変数が含まれる場合、前記パターンのうち前記変数以外のデータが前記比較元のデータに合致するパターンを選択するステップ、前記変数を含む前記パターンが選択されたとき、選択された前記パターンにおける前記変数の位置と対応する位置にある前記比較元のデータを前記変数に代入するステップと、前記比較元のデータがマークアップ言語により記述されたデータであり、選択された前記パターンにおける前記変数の位置と対応する位置にある前記比較元のデータが複数のノードを含むフラグメントである場合、前記フラグメントを前記変数に代入するステップと、を備えることを特徴とする。
【0015】
なお、以上の構成要素の任意の組合せ、本発明の表現を方法、装置、システムなどの間で変換したものもまた、本発明の態様として有効である。
【発明の効果】
【0016】
本発明によれば、マークアップ言語により構造化された文書を適切に処理する技術を提供することができる。
【図面の簡単な説明】
【0017】
【図1】前提技術に係る文書処理装置の構成を示す図である。
【図2】文書処理装置により編集されるXML文書の例を示す図である。
【図3】図2に示したXML文書をHTMLで記述された表にマッピングする例を示す図である。
【図4(a)】図2に示したXML文書を図3に示した表にマッピングするための定義ファイルの例を示す図である。
【図4(b)】図2に示したXML文書を図3に示した表にマッピングするための定義ファイルの例を示す図である。
【図5】図2に示したXML文書を、図3に示した対応によりHTMLにマッピングして表示した画面の例を示す図である。
【図6】ユーザが定義ファイルを生成するために、定義ファイル生成部がユーザに提示するグラフィカルユーザインターフェースの例を示す図である。
【図7】定義ファイル生成部により生成された画面レイアウトの他の例を示す図である。
【図8】文書処理装置によるXML文書の編集画面の一例を示す図である。
【図9】文書処理装置により編集されるXML文書の他の例を示す図である。
【図10】図9に示した文書を表示した画面の例を示す図である。
【図11】第1の実施の形態に係る文書処理装置の構成を示す図である。
【図12】プログラムコードの例を示す図である。
【図13】ソース文書の例を示す図である。
【図14】図13に示したソース文書を図12に示したプログラムで変換したデスティネーション文書を示す図である。
【図15】図14に示したデスティネーション文書を表示した画面の例を示す図である。
【図16】第2の実施の形態に係る文書処理装置の構成を示す図である。
【図17】図17(a)(b)(c)は、第2の実施の形態に係る構文で記述されたプログラムコードの例を示す図である。
【発明を実施するための形態】
【0018】
(前提技術)
図1は、前提技術に係る文書処理装置20の構成を示す。文書処理装置20は、文書内のデータが階層構造を有する複数の構成要素に分類された構造化文書を処理するが、本前提技術では構造化文書の一例としてXML文書を処理する例について説明する。文書処理装置20は、主制御ユニット22、編集ユニット24、DOMユニット30、CSSユニット40、HTMLユニット50、SVGユニット60、及び変換部の一例であるVCユニット80を備える。これらの構成は、ハードウエアコンポーネントでいえば、任意のコンピュータのCPU、メモリ、メモリにロードされたプログラムなどによって実現されるが、ここではそれらの連携によって実現される機能ブロックを描いている。したがって、これらの機能ブロックがハードウエアのみ、ソフトウエアのみ、またはそれらの組合せによっていろいろな形で実現できることは、当業者には理解されるところである。
【0019】
主制御ユニット22は、プラグインのロードや、コマンド実行のフレームワークを提供する。編集ユニット24は、XML文書を編集するためのフレームワークを提供する。文書処理装置20における文書の表示及び編集機能は、プラグインにより実現されており、文書の種別に応じて必要なプラグインが主制御ユニット22又は編集ユニット24によりロードされる。主制御ユニット22又は編集ユニット24は、処理対象となるXML文書の名前空間を参照して、XML文書がいずれのボキャブラリにより記述されているかを判別し、そのボキャブラリに対応した表示又は編集用のプラグインをロードして表示や編集を実行させる。例えば、文書処理装置20には、HTML文書の表示及び編集を行うHTMLユニット50、SVG文書の表示及び編集を行うSVGユニット60など、ボキャブラリ(タグセット)ごとに表示系及び編集系がプラグインとして実装されており、HTML文書を編集するときはHTMLユニット50が、SVG文書を編集するときはSVGユニット60が、それぞれロードされる。後述するように、HTMLとSVGの双方の構成要素を含む複合文書が処理対象となっている場合は、HTMLユニット50とSVGユニット60の双方がロードされる。
【0020】
このような構成によれば、ユーザは、必要な機能のみを選択してインストールし、後から適宜機能を追加又は削除することができるので、プログラムを格納するハードディスクなどの記録媒体の記憶領域を有効に活用することができ、また、プログラム実行時にも、メモリの浪費を防ぐことができる。また、機能拡張性に優れており、開発主体としても、プラグインの形で新たなボキャブラリに対応することが可能なので開発が容易となり、ユーザとしても、プラグインの追加により容易かつ低コストにて機能を追加することができる。
【0021】
編集ユニット24は、ユーザインターフェースを介してユーザから編集指示のイベントを受け付け、そのイベントを適切なプラグインなどに通知するともに、イベントの再実行(リドゥ)又は実行の取消(アンドゥ)などの処理を制御する。
【0022】
DOMユニット30は、DOM提供部32、DOM生成部34、及び出力部36を含み、XML文書をデータとして扱うときのアクセス方法を提供するために定められた文書オブジェクトモデル(Document Object Model:DOM)に準拠した機能を実現する。DOM提供部32は、編集ユニット24に定義されているインタフェースを満たすDOMの実装である。DOM生成部34は、XML文書からDOMツリーを生成する。後述するように、処理対象となるXML文書が、VCユニット80により他のボキャブラリにマッピングされる場合は、マッピング元のXML文書に対応するソースツリーと、マッピング先のXML文書に対応するデスティネーションツリーが生成される。出力部36は、例えば編集終了時に、DOMツリーをXML文書として出力する。
【0023】
CSSユニット40は、CSS解析部42、CSS提供部44、及びレンダリング部46を含み、CSSに準拠した表示機能を提供する。CSS解析部42は、CSSの構文を解析するパーサの機能を有する。CSS提供部44は、CSSオブジェクトの実装であり、DOMツリーに対してCSSのカスケード処理を行う。レンダリング部46は、CSSのレンダリングエンジンであり、CSSを用いてレイアウトされるHTMLなどのボキャブラリで記述された文書の表示に用いられる。
【0024】
HTMLユニット50は、HTMLにより記述された文書を表示又は編集する。SVGユニット60は、SVGにより記述された文書を表示又は編集する。これらの表示/編集系は、プラグインの形で実現されており、それぞれ、文書を表示する表示部(Canvas)56、66、編集指示を含むイベントを送受信する制御部(Editlet)52、62、編集コマンドを受けてDOMに対して編集を行う編集部(Zone)54、64を備える。制御部52又は62が外部からDOMツリーの編集コマンドを受け付けると、編集部54又は64がDOMツリーを変更し、表示部56又は66が表示を更新する。これらは、MVC(Model-View-Controller)と呼ばれるフレームワークに類似する構成をとっており、概ね、表示部56及び66が「View」に、制御部52及び62が「Controller」に、編集部54及び64とDOMの実体が「Model」に、それぞれ対応する。本前提技術の文書処理装置20では、XML文書をツリー表示形式で編集するだけでなく、それぞれのボキャブラリに応じた編集を可能とする。例えば、HTMLユニット50は、HTML文書をワードプロセッサに類似した方式で編集するためのユーザインターフェースを提供し、SVGユニット60は、SVG文書を画像描画ツールに類似した方式で編集するためのユーザインターフェースを提供する。
【0025】
VCユニット80は、マッピング部82、定義ファイル取得部84、及び定義ファイル生成部86を含み、あるボキャブラリにより記述された文書を、他のボキャブラリにマッピングすることにより、マッピング先のボキャブラリに対応した表示編集用プラグインで文書を表示又は編集するためのフレームワークを提供する。本前提技術では、この機能を、ボキャブラリコネクション(Vocabulary Connection:VC)と呼ぶ。定義ファイル取得部84は、マッピングの定義を記述したスクリプトファイルを取得する。この定義ファイルは、ノードごとに、ノード間の対応(コネクション)を記述する。このとき、各ノードの要素値や属性値の編集の可否を指定してもよい。また、ノードの要素値や属性値を用いた演算式を記述してもよい。これらの機能については、後で詳述する。マッピング部82は、定義ファイル取得部84が取得したスクリプトファイルを参照して、DOM生成部34にデスティネーションツリーを生成させ、ソースツリーとデスティネーションツリーの対応関係を管理する。定義ファイル生成部86は、ユーザが定義ファイルを生成するためのグラフィカルユーザインターフェースを提供する。
【0026】
VCユニット80は、ソースツリーとデスティネーションツリーの間のコネクションを監視し、表示を担当するプラグインにより提供されるユーザインタフェースを介してユーザから編集指示を受け付けると、まずソースツリーの該当するノードを変更する。DOMユニット30が、ソースツリーが変更された旨のミューテーションイベントを発行すると、VCユニット80は、そのミューテーションイベントを受けて、ソースツリーの変更にデスティネーションツリーを同期させるべく、変更されたノードに対応するデスティネーションツリーのノードを変更する。デスティネーションツリーを表示/編集するプラグイン、例えばHTMLユニット50は、デスティネーションツリーが変更された旨のミューテーションイベントを受けて、変更されたデスティネーションツリーを参照して表示を更新する。このような構成により、少数のユーザにより利用されるローカルなボキャブラリにより記述された文書であっても、他のメジャーなボキャブラリに変換することで、文書を表示することができるとともに、編集環境が提供される。
【0027】
文書処理装置20により文書を表示又は編集する動作について説明する。文書処理装置20が処理対象となる文書を読み込むと、DOM生成部34が、そのXML文書からDOMツリーを生成する。また、主制御ユニット22又は編集ユニット24は、名前空間を参照して文書を記述しているボキャブラリを判別する。そのボキャブラリに対応したプラグインが文書処理装置20にインストールされている場合は、そのプラグインをロードして、文書を表示/編集させる。プラグインがインストールされていない場合は、マッピングの定義ファイルが存在するか否かを確認する。定義ファイルが存在する場合、定義ファイル取得部84が定義ファイルを取得し、その定義に従って、デスティネーションツリーが生成され、マッピング先のボキャブラリに対応するプラグインにより文書が表示/編集される。複数のボキャブラリを含む複合文書である場合は、後述するように、それぞれのボキャブラリに対応したプラグインにより、文書の該当箇所がそれぞれ表示/編集される。定義ファイルが存在しない場合は、文書のソース又はツリー構造を表示し、その表示画面において編集が行われる。
【0028】
図2は、処理対象となるXML文書の例を示す。このXML文書は、生徒の成績データを管理するために用いられる。XML文書のトップノードである構成要素「成績」は、配下に、生徒ごとに設けられた構成要素「生徒」を複数有する。構成要素「生徒」は、属性値「名前」と、子要素「国語」、「数学」、「理科」、「社会」を有する。属性値「名前」は、生徒の名前を格納する。構成要素「国語」、「数学」、「理科」、「社会」は、それぞれ、国語、数学、理科、社会の成績を格納する。例えば、名前が「A」である生徒の国語の成績は「90」、数学の成績は「50」、理科の成績は「75」、社会の成績は「60」である。以下、この文書で使用されているボキャブラリ(タグセット)を、「成績管理ボキャブラリ」と呼ぶ。
【0029】
本前提技術の文書処理装置20は、成績管理ボキャブラリの表示/編集に対応したプラグインを有しないので、この文書をソース表示、ツリー表示以外の方法で表示するためには、前述したVC機能が用いられる。すなわち、成績管理ボキャブラリを、プラグインが用意された別のボキャブラリ、例えば、HTMLやSVGなどにマッピングするための定義ファイルを用意する必要がある。ユーザ自身が定義ファイルを作成するためのユーザインターフェースについては後述することにして、ここでは、既に定義ファイルが用意されているとして説明を進める。
【0030】
図3は、図2に示したXML文書をHTMLで記述された表にマッピングする例を示す。図3の例では、成績管理ボキャブラリの「生徒」ノードを、HTMLにおける表(「TABLE」ノード)の行(「TR」ノード)に対応づけ、各行の第1列には属性値「名前」を、第2列には「国語」ノードの要素値を、第3列には「数学」ノードの要素値を、第4列には「理科」ノードの要素値を、第5列には「社会」ノードの要素値を、それぞれ対応付ける。これにより、図2に示したXML文書を、HTMLの表形式で表示することができる。また、これらの属性値及び要素値は、編集可能であることが指定されており、ユーザがHTMLによる表示画面上で、HTMLユニット50の編集機能により、これらの値を編集することができる。第6列には、国語、数学、理科、社会の成績の加重平均を算出する演算式が指定されており、生徒の成績の平均点が表示される。このように、定義ファイルに演算式を指定可能とすることにより、より柔軟な表示が可能となり、編集時のユーザの利便性を向上させることができる。なお、第6列は、編集不可であることが指定されており、平均点のみを個別に編集することができないようにしている。このように、マッピング定義において、編集の可否を指定可能とすることにより、ユーザの誤操作を防ぐことができる。
【0031】
図4(a)及び図4(b)は、図2に示したXML文書を図3に示した表にマッピングするための定義ファイルの例を示す。この定義ファイルは、定義ファイル用に定義されたスクリプト言語により記述される。定義ファイルには、コマンドの定義と、表示のテンプレートが記述されている。図4(a)(b)の例では、コマンドとして、「生徒の追加」と「生徒の削除」が定義されており、それぞれ、ソースツリーにノード「生徒」を挿入する操作と、ソースツリーからノード「生徒」を削除する操作が対応付けられている。また、テンプレートとして、表の第1行に「名前」、「国語」などの見出しが表示され、第2行以降に、ノード「生徒」の内容が表示されることが記述されている。ノード「生徒」の内容を表示するテンプレート中、「text-of」と記述された項は「編集可能」であることを意味し、「value-of」と記述された項は「編集不可能」であることを意味する。また、ノード「生徒」の内容を表示する行のうち、第6列には、「(src:国語 + src:数学 + src:理科 + src:社会) div 4」という計算式が記述されており、生徒の成績の平均が表示されることを意味する。
【0032】
図5は、図2に示した成績管理ボキャブラリで記述されたXML文書を、図3に示した対応によりHTMLにマッピングして表示した画面の例を示す。表90の各行には、左から、各生徒の名前、国語の成績、数学の成績、理科の成績、社会の成績、及び平均点が表示されている。ユーザは、この画面上で、XML文書を編集することができる。たとえば、第2行第3列の値を「70」に変更すると、このノードに対応するソースツリーの要素値、すなわち、生徒「B」の数学の成績が「70」に変更される。このとき、VCユニット80は、デスティネーションツリーをソースツリーに追従させるべく、デスティネーションツリーの該当箇所を変更し、HTMLユニット50が、変更されたデスティネーションツリーに基づいて表示を更新する。したがって、画面上の表においても、生徒「B」の数学の成績が「70」に変更され、更に、平均点が「55」に変更される。
【0033】
図5に示した画面には、図4(a)(b)に示した定義ファイルに定義されたように、「生徒の追加」及び「生徒の削除」のコマンドがメニューに表示される。ユーザがこれらのコマンドを選択すると、ソースツリーにおいて、ノード「生徒」が追加又は削除される。このように、本前提技術の文書処理装置20では、階層構造の末端の構成要素の要素値を編集するのみではなく、階層構造を編集することも可能である。このようなツリー構造の編集機能は、コマンドの形でユーザに提供されてもよい。また、例えば、表の行を追加又は削除するコマンドが、ノード「生徒」を追加又は削除する操作に対応づけられてもよい。また、他のボキャブラリを埋め込むコマンドがユーザに提供されてもよい。この表を入力用テンプレートとして、穴埋め形式で新たな生徒の成績データを追加することもできる。以上のように、VC機能により、HTMLユニット50の表示/編集機能を利用しつつ、成績管理ボキャブラリで記述された文書を編集することが可能となる。
【0034】
図6は、ユーザが定義ファイルを生成するために、定義ファイル生成部86がユーザに提示するグラフィカルユーザインタフェースの例を示す。画面左側の領域91には、マッピング元のXML文書がツリー表示されている。画面右側の領域92には、マッピング先のXML文書の画面レイアウトが示されている。この画面レイアウトは、HTMLユニット50により編集可能となっており、ユーザは、画面右側の領域92において、文書を表示するための画面レイアウトを作成する。そして、例えば、マウスなどのポインティングデバイスにより、画面左側の領域91に表示されたマッピング元のXML文書のノードを、画面右側の領域92に表示されたHTMLによる画面レイアウト中へドラッグ&ドロップ操作を行うことにより、マッピング元のノードと、マッピング先のノードとのコネクションが指定される。例えば、要素「生徒」の子要素である「数学」を、HTML画面の表90の第1行第3列にドロップすると、「数学」ノードと、3列目の「TD」ノードの間にコネクションが張られる。各ノードには、編集の可否が指定できるようになっている。また、表示画面中には、演算式を埋め込むこともできる。画面の編集が終わると、定義ファイル生成部86は、画面レイアウトとノード間のコネクションを記述した定義ファイルを生成する。
【0035】
XHTML、MathML、SVGなどの主要なボキャブラリに対応したビューワやエディタは既に開発されているが、図2に示した文書のようなオリジナルなボキャブラリで記述された文書に対応したビューワやエディタを開発するのは現実的でない。しかし、上記のように、他のボキャブラリにマッピングするための定義ファイルを作成すれば、ビューワやエディタを開発しなくても、VC機能を利用して、オリジナルなボキャブラリで記述された文書を表示・編集することができる。
【0036】
図7は、定義ファイル生成部86により生成された画面レイアウトの他の例を示す。図7の例では、成績管理ボキャブラリで記述されたXML文書を表示するための画面に、表90と、円グラフ93が作成されている。この円グラフ93は、SVGにより記述される。後述するように、本前提技術の文書処理装置20は、一つのXML文書内に複数のボキャブラリを含む複合文書を処理することができるので、この例のように、HTMLで記述された表90と、SVGで記述された円グラフ93とを、一つの画面上に表示することができる。
【0037】
図8は、文書処理装置20によるXML文書の編集画面の一例を示す。図8の例では、一つの画面が複数に分割されており、それぞれの領域において、処理対象となるXML文書を異なる複数の表示形式により表示している。領域94には、文書のソースが表示されており、領域95には、文書のツリー構造が表示されており、領域96には、図5に示したHTMLにより記述された表が表示されている。これらのいずれの画面上においても、文書の編集が可能であり、いずれかの画面上でユーザが編集を行うと、ソースツリーが変更され、それぞれの画面の表示を担当するプラグインが、ソースツリーの変更を反映すべく画面を更新する。具体的には、ソースツリーの変更を通知するミューテーションイベントのリスナーとして、それぞれの編集画面の表示を担当するプラグインの表示部を登録しておき、いずれかのプラグイン又はVCユニット80によりソースツリーが変更されたときに、編集画面を表示中の全ての表示部が、発行されたミューテーションイベントを受け取って画面を更新する。このとき、プラグインがVC機能により表示を行っている場合は、VCユニット80がソースツリーの変更に追従してデスティネーションツリーを変更した後、変更されたデスティネーションツリーを参照してプラグインの表示部が画面を更新する。
【0038】
例えば、ソース表示及びツリー表示を、専用のプラグインにより実現している場合は、ソース表示用プラグインとツリー表示用プラグインは、デスティネーションツリーを用いず、直接ソースツリーを参照して表示を行う。この場合、いずれかの画面において編集が行われると、ソース表示用プラグインとツリー表示用プラグインは、変更されたソースツリーを参照して画面を更新し、領域96の画面を担当しているHTMLユニット50は、ソースツリーの変更に追従して変更されたデスティネーションツリーを参照して画面を更新する。
【0039】
ソース表示及びツリー表示は、VC機能を利用して実現することもできる。すなわち、ソース、ツリー構造をHTMLによりレイアウトし、そのHTMLにXML文書をマッピングして、HTMLユニット50により表示してもよい。この場合、ソース形式、ツリー形式、表形式の3つのデスティネーションツリーが生成されることになる。いずれかの画面において編集が行われると、VCユニット80は、ソースツリーを変更した後、ソース形式、ツリー形式、表形式の3つのデスティネーションツリーをそれぞれ変更し、HTMLユニット50は、それらのデスティネーションツリーを参照して、3つの画面を更新する。
【0040】
このように、一つの画面上に複数の表示形式で文書を表示することにより、ユーザの利便性を向上させることができる。例えば、ユーザは、ソース表示又はツリー表示により文書の階層構造を把握しつつ、表90などを用いて視覚的に分かりやすい形式で文書を表示し、編集することができる。上記の例では、一つの画面を分割して複数の表示形式による画面を同時に表示したが、一つの画面に一つの表示形式による画面を表示し、表示形式をユーザの指示により切り替え可能としてもよい。この場合、主制御ユニット22が、ユーザから表示形式の切り替え要求を受け付け、各プラグインに指示して表示を切り替える。
【0041】
図9は、文書処理装置20により編集されるXML文書の他の例を示す。図9に示したXML文書では、SVG文書の「foreignObject」タグの中にXHTML文書が埋め込まれており、さらに、XHTML文書の中にMathMLで記述された数式が入っている。このような場合、編集ユニット24が、名前空間を参照して、適切な表示系に描画作業を振り分ける。図9の例では、編集ユニット24は、まず、SVGユニット60に四角形を描画させ、つづいて、HTMLユニット50にXHTML文書を描画させる。さらに、図示しないMathMLユニットに、数式を描画させる。こうして、複数のボキャブラリを包含する複合文書が適切に表示される。表示結果を図10に示す。
【0042】
文書編集中、カーソル(キャリッジ)の位置に応じて、表示されるメニューを切り替えてもよい。すなわち、カーソルが、SVG文書が表示された領域内に存在するときは、SVGユニット60が提供するメニュー、又はSVG文書をマッピングするための定義ファイルに定義されたコマンドを表示し、カーソルが、XHTML文書が表示された領域内に存在するときは、HTMLユニット50が提供するメニュー、又はXHTML文書をマッピングするための定義ファイルに定義されたコマンドを表示する。これにより、編集位置に応じて適切なユーザインターフェースを提供することができる。
【0043】
複合文書において、あるボキャブラリに対応する適切なプラグイン又はマッピング定義ファイルがなかった場合は、そのボキャブラリにより記述された部分は、ソース表示又はツリー表示されてもよい。従来、ある文書に他の文書を埋め込んだ複合文書を開くとき、埋め込まれた文書を表示するアプリケーションがインストールされていないと、その内容を表示することができなかったが、本前提技術では、表示用のアプリケーションが存在しなくても、テキストデータにより構成されたXML文書をソース表示又はツリー表示することにより内容を把握することができる。これは、テキストベースであるXMLなどの文書ならではの特徴といえる。
【0044】
データがテキストベースで記述されることの他の利点として、例えば、複合文書中の、あるボキャブラリにより記述される部分において、同一文書内の他のボキャブラリで記述された部分のデータを参照してもよい。また、文書内で検索を実行する時に、SVGなどの図に埋め込まれた文字列も検索対象とすることができる。
【0045】
あるボキャブラリにより記述された文書内に、他のボキャブラリのタグを用いてもよい。このXML文書は、妥当(valid)ではないが、整形式(well-formed)であれば、有効なXML文書として処理可能である。この場合、挿入された他のボキャブラリのタグは、定義ファイルによりマッピングされてもよい。例えば、XHTML文書中に、「重要」、「最重要」などのタグを使用し、これらのタグで囲まれた部分を強調表示してもよいし、重要度の順にソートして表示してもよい。
【0046】
図10に示した編集画面において、ユーザにより文書が編集されると、編集された部分を担当するプラグイン又はVCユニット80がソースツリーを変更する。ソースツリーには、ノードごとにミューテーションイベントのリスナーを登録できるようになっており、通常は、各ノードが属するボキャブラリに対応したプラグインの表示部又はVCユニット80がリスナーとして登録される。DOM提供部32は、ソースツリーが変更されると、変更されたノードから上位の階層へたどって、登録されたリスナーがあれば、そのリスナーへミューテーションイベントを発行する。例えば、図9に示した文書において、<html>ノードの下位のノードが変更された場合、<html>ノードにリスナーとして登録されたHTMLユニット50にミューテーションイベントが通知されるとともに、その上位の<svg>ノードにリスナーとして登録されたSVGユニット60にもミューテーションイベントが通知される。このとき、HTMLユニット50は、変更されたソースツリーを参照して表示を更新する。SVGユニット60は、自身のボキャブラリに属するノードが変更されていないので、ミューテーションイベントを無視してもよい。
【0047】
編集の内容によっては、HTMLユニット50による表示の更新に伴って、全体のレイアウトが変わる可能性がある。この場合は、画面のレイアウトを管理する構成、例えば最上位のノードの表示を担当するプラグインにより、プラグインごとの表示領域のレイアウトが更新される。例えば、HTMLユニット50による表示領域が以前より大きくなった場合、HTMLユニット50は、まず自身の担当する部分を描画して、表示領域の大きさを決定する。そして、画面のレイアウトを管理する構成に、変更後の表示領域の大きさを通知し、レイアウトの更新を依頼する。画面のレイアウトを管理する構成は、通知を受けて、プラグインごとの表示領域を再レイアウトする。こうして、編集された部分の表示が適切に更新されるとともに、画面全体のレイアウトが更新される。
【0048】
(第1の実施の形態)
前提技術で説明したボキャブラリコネクション機能は、図4に示したように、XSLTを拡張した言語により記述された定義ファイルを用いて実現された。本実施の形態では、より柔軟に、XMLデータとXMLデータ又は他のデータとの対応関係を表現し、XMLデータとXMLデータ又は他のデータとの間の変換、逆変換、対応関係の検証などを実現する技術について説明する。
【0049】
XSLTは、XMLで記述された文書を別のXMLで記述された文書に変換するための言語であるが、変換に方向性があるため、逆変換を行う必要があるときには、逆変換の手順を別途定義する必要がある。例えば、処理系が実装されていないボキャブラリで記述された文書を、XSLTを用いて、処理系の実装されたボキャブラリの文書へ変換すれば、変換後の文書を処理系により編集することはできるが、その編集を元の文書に反映させるには、逆変換を行う必要がある。しかし、変換先の文書に対して任意の編集を許すと、変換元の文書との間の整合性を保つことが困難になる。
【0050】
前提技術では、順方向の変換の定義におけるノード間の対応関係を監視する構成を設け、変換先文書を表示した編集画面において、変換元文書に対する編集操作を受け付け、対応関係を監視する構成を介して、まず変換元文書を更新した後に、変換先文書へ更新を反映させることで、変換元文書と変換先文書との間の整合性を保ちながら編集を行う技術を採用し、このような問題を解決した。
【0051】
しかし、XSLTにはもう一つの問題がある。それは、単一のXML構造に基づいて処理を行うことしかできないので、複数のノードを含んだXMLフラグメントの対応関係を表現することができないことである。そこで、本実施の形態では、XMLフラグメントを代数化し、代数化されたXMLフラグメントを含むデータ間の対応関係を定義することを可能とすることにより、より柔軟にデータ間の対応関係を表現し、データ間の変換、逆変換、対応関係の検証などを実現する技術を提案する。
【0052】
データ間の対応関係を定義し、それらの対応関係に基づいてパターンマッチングを行うのに適したプログラミング言語として、例えば、一階述語論理に基づいたプログラミング言語であるProlog(Programming in Logic)などがある。しかし、Prologのパターンマッチングは、コードパターンのマッチングであり、そのままでは、XMLフラグメントを取り扱うのに適さない。例えば、要素名を比較する際に、実際には同じ名前空間であるのに、異なる名前空間接頭辞を用いて記述されているために、文字列としては一致せずにマッチングに失敗することがある。また、ある要素に複数の属性を記述できる場合に、実際には記述する順序は意味を持たないのに、規則に定義された順序とは異なる順序で属性が記述されているために、マッチングに失敗することがある。どのような順序で属性が記述されていてもマッチングに成功するようにするためには、想定されるあらゆる属性の並びを予め定義しておかなければならず、非常に煩雑である。本実施の形態では、こうしたXMLの特性に合わせて、任意のXMLフラグメントを一意に特定可能な表記法を採用する。
【0053】
図11は、第1の実施の形態に係る文書処理装置の構成を示す。第1の実施の形態に係る文書処理装置100は、図1に示した前提技術の文書処理装置20の構成に加えて、マッチングユニット70を更に備える。マッチングユニット70は、名前空間管理部72、変数管理部74、マッチング部76を含む。その他の構成及び動作は、前提技術と同様である。
【0054】
マッチングユニット70は、マークアップ言語により記述されたデータのパターンと、マークアップ言語により記述されたデータ又はマークアップ言語により記述されていないデータのパターンとの間の対応関係を定義した規則に基づいて、比較元のデータに合致するパターンを探索しつつ、比較元のデータを処理する。マッチングユニット70は、Prolog等のプログラミング言語により記述されたコードにしたがって逐次に処理を実行する処理系であってもよいし、プログラミング言語により記述されたコードをコンパイルした処理系であってもよい。
【0055】
マッチング部76は、データのパターン間の対応関係を定義した規則の中から、比較元のデータに合致するパターンを選択する。マッチング部76は、パターンに変数が含まれる場合、パターンのうち変数以外のデータが比較元のデータに合致するパターンを選択する。
【0056】
変数管理部74は、マッチング部76により変数を含むパターンが選択されたとき、選択されたパターンにおける変数の位置と対応する位置にある比較元のデータを変数に代入する。変数管理部74は、比較元のデータがマークアップ言語により記述されたデータであり、選択されたパターンにおける変数の位置と対応する位置にある比較元のデータが複数のノードを含むフラグメントである場合、フラグメントを変数に代入する。
【0057】
変数管理部74は、選択されたパターンにおける変数の位置と対応する比較元のデータの位置に、同種のデータが複数並列して存在する場合は、それらをリストとして変数に格納する。とくに、比較元のデータがマークアップ言語により記述されたデータであったときに、選択されたパターンにおける変数の位置と対応する比較元のデータの位置にあるノードが複数の兄弟ノードを持つ場合は、変数管理部74は、それらのノード又はそれらのノードを頂点ノードとするフラグメントをリストとして変数に格納する。
【0058】
名前空間管理部72は、マッチング部76がマークアップ言語により記述された要素又は属性同士を比較する際に、要素又は属性同士の名前空間を比較する。名前空間管理部72は、文書において宣言された名前空間接頭辞と名前空間URIの対応を保持しており、要素又は属性に付された名前空間接頭辞を名前空間URIに変換し、名前空間URIを比較することにより、要素又は属性同士の名前空間が合致するか否かを判定する。すなわち、名前空間接頭辞が異なっていても、同じ名前空間URIに対応づけられたものであれば、名前空間が合致すると判定する。逆に、同じ名前空間接頭辞が付されていても、異なる名前空間URIに対応づけられたものであれば、名前空間が合致しないと判定する。名前空間管理部72により要素又は属性同士の名前空間が合致しないと判定された場合は、マッチング部76は、要素又は属性同士が合致しないと判定する。
【0059】
図12は、XML文書を変換するプログラムのコードの例を示す。図12に示したプログラムでは、Prologと同様の表記法により、データ間の対応関係を定義する規則が記述されているが、上述したように、XMLフラグメントを取り扱うための拡張がなされている。例えば、変数に接尾辞としてワイルドカード「*」が付されている場合、マッチング部76は、数、順序、種別を問わずに、複数の任意のXMLフラグメントに変数をマッチさせる。このとき、変数管理部74は、マッチした複数のXMLフラグメントをリストとして変数に代入する。また、変数に接尾辞としてワイルドカード「+」が付されている場合、マッチング部76は、テキストノードを含む任意のXMLフラグメントに変数をマッチさせる。このとき、変数管理部74は、マッチしたXMLフラグメントを変数に代入する。また、変数に接尾辞としてワイルドカード「-」が付されている場合、マッチング部76は、テキストノードを除いた任意のXMLフラグメントに変数をマッチさせる。このとき、変数管理部74は、マッチしたXMLフラグメントのうちテキストノードを除いたデータを変数に代入する。ドキュメント型のXMLフラグメントの場合、接尾辞「+」が付された変数には、テキストノードを含む全てのノードが代入されるが、接尾辞「-」が付された変数には、テキストノード以外のノードが代入される。
【0060】
図13は、ソース文書の例を示す。図13に示した文書は、カクテルのレシピを記述するためのボキャブラリで記述されている。図13では、名前空間宣言が省略されているが、文書中に名前空間宣言がなされているものとする。文書には、頂点要素「Recipe」の下位に、レシピの名称を格納する要素「recipename」と、グラスの種別を格納する要素「glass」と、材料を格納する要素「ingredients」と、味の種別を格納する要素「taste」が記述されている。要素「ingredients」は、材料の種別ごとに、1以上の要素「ingredient」を含んでおり、各要素「ingredient」は、材料の名称を格納する要素「name」と、材料の分量を格納する要素「measure」を含む。要素「measure」は、分量の単位を格納する属性「unit」を含む。
【0061】
ここで、マッチングユニット70が、図13に示したソース文書を、図12に示した定義を用いて変換する動作の詳細を説明する。マッチングユニット70が、順方向変換用の質問「trans(入力ファイル名,出力ファイル名)」を受け付けると、マッチング部76は、この質問に合致する事実又は規則を探索し、規則500「trans(_InFile,_Outfile)」を選択する。このとき、変数管理部74は、質問の第1引数に指定された入力ファイル名を自由変数「_InFile」に代入し、第2引数に指定された出力ファイル名を自由変数「_OutFile」に代入する。
【0062】
つづいて、マッチングユニット70は、規則500の1番目のゴールを実行し、指定された入力ファイルをロードする。ここでは、図13に示したソース文書がロードされる。このとき、DOM生成部は、ロードされた文書からソースDOMを生成する。変数管理部74は、生成されたソースDOMを自由変数「_sourceXML」に代入する。
【0063】
つづいて、マッチングユニット70は、規則500の2番目のゴールである「eq(_sourceXML,_destXML)」を実行する。マッチング部76は、変数「_sourceXML」に格納されているソースDOMと、規則502の頭部の第1引数とを比較し、自由変数以外の部分のマッチングに成功すれば、すなわち、ソースDOMが規則502の頭部の第1引数に記述されたXMLフラグメントと同じ構造を有していれば、規則502を選択する。このとき、変数管理部74は、各自由変数に、ソースDOM中の該当位置のXMLフラグメントを代入する。
【0064】
図13に示したソース文書は、規則502の頭部の第1引数と同じ構造を有しているので、マッチング部76は規則502を選択し、変数管理部74は、自由変数「NameOfRecipe」に文字列「ギムレット」を代入し、自由変数「_NameOfGlass」に文字列「カクテルグラス」を代入し、自由変数「_Ingredients」に要素「ingredients」の下位のXMLフラグメントを代入し、自由変数「_Tastes」に、要素「ingredients」よりも後に記述されているXMLフラグメントを代入する。ここで、自由変数「_Ingredients」には接尾辞としてワイルドカード「*」が付されており、図13に示したソース文書では、要素「ingredients」の下位に2つの要素「ingredient」が記述されているので、変数管理部74は、これらの要素「ingredient」を頂点ノードとする2つのXMLフラグメントをリストとして自由変数「_Ingredients」に格納する。
【0065】
また、変数管理部74は、自由変数「_destXML」に規則502の頭部の第2引数に記述されているXMLフラグメントを代入する。このとき、第2引数に記述されたXMLフラグメントには、第1引数に記述されたXMLフラグメントに含まれる変数と同一の変数、例えば、変数「_NameOfRecipe」などが含まれており、図13に示したソース文書中のデータの一部がデスティネーション文書中に反映される。第2引数に記述されたXMLフラグメントに含まれる変数「_TRofIngredients」及び変数「_Input」には、まだ値が代入されていない。
【0066】
つづいて、マッチングユニット70は、規則502の1番目のゴールである「equivIngWithTr(_Ingredients,_TRofIngredients)」を実行する。マッチング部76は、規則504の頭部の第1引数と変数「_Ingredients」を比較するが、変数「_Ingredients」は空のリストではないので、規則504とのマッチングは失敗する。マッチング部76は、次に、規則506の頭部の第1引数と変数「_Ingredients」を比較する。変数「_Ingredients」はリストであるので、マッチング部76は、規則506とのマッチングに成功し、変数管理部74は、変数「_Ingredients」の1番目のXMLフラグメントを変数「_Ingredient」に、残りを変数「_Ingredients」に代入する。
【0067】
つづいて、マッチングユニット70は、規則506の1番目のゴールである「equiv(_Ingredient,_TRofIngredient)」を実行する。マッチング部76は、変数「_Ingredient」に格納されているXMLフラグメントと、規則508の頭部の第1引数とを比較する。いま、変数「_Ingredient」には、図13に示したソース文書中の2つの要素「Ingredient」のうち、1番目の要素「Ingredient」を頂点ノードとするXMLフラグメントが格納されているので、マッチング部76は、規則508とのマッチングに成功し、変数管理部74は、自由変数「_Name」に文字列「ドライジン」を、自由変数「_UNIT」に文字列「ml」を、自由変数「_VALUE」に文字列「45」を代入する。
【0068】
変数管理部74は、更に、規則508を呼び出した規則506の1番目のゴールの第2引数である自由変数「_TRofIngredient」に、規則508の頭部の第2引数を代入する。このとき、規則508の第2引数の中に記述された変数「_Name」、「_VALUE」、「_UNIT」には、既にソース文書中から抽出されたデータが格納されている。こうして、ソース文書中の要素「Ingredient」を頂点とするXMLフラグメントから、XHTMLの要素「tr」を頂点とするXMLフラグメントが生成される。規則508の体部にはカットが記述されているので、マッチングユニット70は、規則506の1番目のゴールの実行を終了し、2番目のゴールを実行する。
【0069】
規則508の2番目のゴールでは、「equivIngWithTr(_Ingredients,_TRofIngredients)」が再帰的に呼び出される。こうして、変数「_Ingredients」に格納されていたXMLフラグメントは全て処理され、最終的に、変数「_Ingredients」のリストが空になると、規則504が選択される。規則504の体部にはカットが記述されているので、マッチングユニット70は、規則502の1番目のゴールの実行を終了する。こうして、変数「_Ingredients」に格納されていたXMLフラグメントから生成されたXMLフラグメントが、変数「_destXML」に含まれる変数「_TRofIngredients」に代入される。
【0070】
規則502の2番目のゴールの実行により、同様にして、変数「_Tastes」に格納されていたXMLフラグメントから、異なるパターンのXMLフラグメントが生成され、変数「Inputs」に格納される。最後に、規則500の3番目のゴールが実行され、変数「_destXML」に格納されているXMLフラグメントが出力ファイルに書き込まれる。このようにして生成されたデスティネーション文書を図14に示す。また、このデスティネーション文書をHTMLユニット50により表示した画面の例を図15に示す。
【0071】
逆方向の変換を実行するには、逆方向変換用の質問「rtrans(入力ファイル名,出力ファイル名)」をマッチングユニット70に実行させればよい。マッチングユニット70は、図12に示した規則を用いて、上述した順方向の変換と同様の手順により、逆方向の変換を実行することができる。また、同様にして、マッチングユニット70は、あるXML文書が規則に記述されたパターンのXMLフラグメントを有しているかどうかを検証することができ、XML文書のバリデーションを行うことができる。
【0072】
(第2の実施の形態)
図16は、第2の実施の形態に係る文書処理装置の構成を示す。第2の実施の形態に係る文書処理装置100は、図11に示した第1の実施の形態の文書処理装置100の構成に加えて、集合演算部78を更に備える。集合演算部78は、後述するように、複数の値の集合を格納した変数のそれぞれの値に対して共通に実行すべき処理を簡便に記述するために追加された新たな構文により記述された演算を実行する。その他の構成及び動作は、前提技術と同様である。
【0073】
第1の実施の形態では、リストに含まれる複数の値のそれぞれを処理するために、再帰を用いてプログラムを記述していた。具体的には、図12に示したプログラムにおいて、変数「_Ingredients」に格納されたXMLフラグメントのリストをHTMLフラグメントに変換するために、規則506の「equivIngWithTr」の頭部において、リストの先頭の値を変数「_Ingredient」に取り出し、1番目のゴールで規則508の「equiv」を呼び出して変換を行い、変換先のHTMLフラグメントを変数「_TRofIngredients」の先頭の値に格納するという処理を、リストの残りの値に対して再帰的に繰り返すことにより、リストに含まれる全てのXMLフラグメントをHTMLフラグメントに変換した結果を、リストとして変数「_TRofIngredients」に格納するプログラムを記述している。
【0074】
このように、リストに含まれる全ての値に対して共通の処理を実行させる場面は非常に多いので、このような処理を実現するためのより簡略な構文を用意しておけば、プログラムを記述する際にも、プログラムを解析又は検証する際にも、非常に便利である。したがって、本実施の形態では、複数の値の集合を格納した変数に対して実行すべき共通の処理を簡便に記述するために、以下のような新しい構文を追加する。
【0075】
_X[*|+|-| ] [ : Op [-> _Y [^ Directive]]]
ここで、「:」は、変数「_X」に格納されているリストに対するオペレーションの指示子であり、「Op」は、変数「_X」に格納されているリストに対して処理を施すオペレーション(述語)である。また、「->」は、「Op」の結果をリストに構築して変数「_Y」に束縛させるオペレーションである。また、「^」は、「Op」の動作に対しての指示子であり、「Directive」は、「Op」の動作に対しての指示を指定する。この指定は、集合演算部78の動作に関する指示の指定であり、演算結果には影響しない。例えば、「#n」として、処理「Op」を並列に実行する際の多重度を記述可能である。集合演算部78は、処理の多重度が記述されていた場合、記述された多重度の数だけ処理を並列して実行する。また、「Wait(条件)」として、処理「Op」の実行を開始するための条件を記述可能である。集合演算部78は、「Wait( _Status )」という条件が記述されていた場合、「_Status」が束縛されるまで待機してから処理「Op」の実行を開始する。
【0076】
この構文で記述されたプログラムコードの例を図17(a)(b)(c)に示す。図17(a)に示すプログラムにおいて、「hoge(引数)」が実行されると、まず、マッチング部76は、引数に指定されたXMLフラグメントと、規則「hoge」の頭部の引数に記述されたXMLフラグメントとを比較し、同じ構造を有していれば、すなわち、引数に指定されたXMLフラグメントの頂点要素が「a」であれば、図17(a)に示した規則「hoge」を選択する。このとき、変数管理部74は、変数「_X」に要素「a」の下位のXMLフラグメントを代入する。変数「_X」には接尾辞として「*」が付されているので、前述したように、変数管理部74は、要素「a」の下位に複数のXMLフラグメントが存在する場合には、それぞれをリストとして変数「_X」に格納する。
【0077】
規則「hoge」では、変数「_X」のリストに含まれる複数の値のそれぞれに対して処理「f」を実行し、その結果をリストとして構築して変数「_Y」に束縛させるよう指定されている。したがって、集合演算部78は、まず、変数「_X」のリストの先頭の値に対して処理「f」を実行し、変数「_Y」のリストの先頭の値として格納し、以降、順次、変数「_X」のリストのそれぞれの値に対して同様に処理「f」を実行して変数「_Y」のリストを構築する。
【0078】
ここで、規則「hoge」では、処理「f」を実行する際に、多重度「3」で実行することが指定されている。したがって、集合演算部78は、3つの値に対する処理「f」を同時に並行して実行する。すなわち、まず、最初の値に対して処理「f」の実行を開始すると、その実行の終了を待たずに、2番目の値及び3番目の値に対して処理「f」の実行を開始して、3つの処理を同時並列的に実行する。集合演算部78は、3つの処理のうちいずれかの処理が終了すると、つづいて、4番目の値に対して処理「f」を開始する。このように、集合演算部78は、3つの処理が並列して実行されるように制御する。これにより、効率良く処理を進めることができ、処理に要する時間を短縮することができる。また、処理の多重度を簡便に指定可能な構文を用意することにより、開発者の利便性を向上させることができる。
【0079】
集合演算部78は、上記のように指定された多重度で並列処理を実行する際に、文書処理装置100を実現するコンピュータのCPUの稼働率やメモリの空き容量などを考慮して、並列処理の適否を判断してもよい。例えば、集合演算部78は、1番目の処理を実行開始した後、2番目の処理を実行する前に、1番目の処理の実行に要したメモリの容量やCPUの稼働率などと、現在のメモリの空き容量やCPUの稼働率などを参照して、十分なリソースが確保できない場合は、十分なリソースが確保されるまで、2番目の処理の実行を開始しないように制御してもよい。これにより、プログラムの実行環境に合わせて、並列処理の多重度を適切に調整することができる。
【0080】
図17(b)に示したプログラムにおいて、規則「validate」が呼び出されると、マッチング部76は、規則「validate」を選択し、変数管理部74は、引数に指定されたXMLフラグメントのうち、要素「List」の属性「origin」の値を変数「_URL」に格納し、要素「List」の子要素「Users」が有する複数の子要素のうちテキストノード以外のデータをリストとして変数「_USRS」に格納する。
【0081】
規則「validate」では、変数「_URL」の値に対して処理「CheckURL」を実行し、その結果を変数「_Status」に束縛させるよう指定されている。また、変数「_USRS」のリストに含まれるそれぞれの値に対して処理「CheckID」を実行するよう指定されている。ここで、処理「CheckID」に対しては、変数「_Status」が束縛されるまで処理を待つよう指定されている。したがって、集合演算部78は、変数「_URL」に対する処理「CheckURL」の実行に成功して変数「_Status」の値が確定するまで待機してから、変数「_USRS」に対する処理「CheckID」の実行を開始する。
【0082】
このように、処理を開始するための条件を簡便に指定可能な構文を用意することにより、開発者の利便性を向上させることができる。また、マークアップ言語により記述されたパターンの中に、集合を格納した変数に対する処理を記述するとともに、その処理を開始するための条件を記述することにより、記述されたプログラムをパースするときに、ある処理の開始条件として別の処理の終了が指定されているというような関連性を適切にチェックすることができ、デッドロック等の発生を適切かつ容易に検出することができる。
【0083】
図17(c)に示したプログラムは、図17(b)に示したプログラムにおける処理「CheckID」を、多重度「3」で並列実行することが指定されている。集合演算部78は、処理「CheckURL」が終了して変数「_Status」の値が確定すると、3つの処理「CheckID」を並列して実行し、それ以降は、実行中の処理「CheckID」のいずれかが終了すると、それに換えて新たな処理「CheckID」を開始する。
【0084】
上記の例のように、本実施の形態で用いられる構文によれば、複数の値の集合に対する共通の処理を記述する場合に、個別に記述する必要がなく、まとめて記述することができる。すなわち、複数の値の中から一つを取り出すコードや、規則を再帰的に呼び出すコードなどを記述する必要がなく、複数の値の集合を格納した変数に対する処理を直接記述する形式になっているので、プログラムの開発時にも、保守時にも、利便性を向上させることができる。
【0085】
上述した例では、集合演算部78が上記の構文を解釈して集合に対する演算を実行したが、別の例では、集合演算部78は、上記の構文を解釈して、図12に示したような、再帰的な呼び出しを用いてリストに含まれるそれぞれの値に対する処理を実現する従来の形式の構文によるプログラムコードに変換してもよい。この場合、プログラムの実行時には、第1の実施の形態と同様に演算が実行される。
【0086】
以上、本発明を実施の形態をもとに説明した。この実施の形態は例示であり、それらの各構成要素や各処理プロセスの組合せにいろいろな変形例が可能なこと、またそうした変形例も本発明の範囲にあることは当業者に理解されるところである。
【0087】
実施の形態では、XML文書を処理する例について説明したが、本実施の形態の文書処理装置100は、他のマークアップ言語、例えば、SGML、HTMLなどで記述された文書も同様に処理可能である。
【符号の説明】
【0088】
20 文書処理装置、22 主制御ユニット、24 編集ユニット、30 DOMユニット、32 DOM提供部、34 DOM生成部、36 出力部、40 CSSユニット、42 CSS解析部、44 CSS提供部、46 レンダリング部、50 HTMLユニット、52,62 制御部、54,64 編集部、56,66 表示部、60 SVGユニット、70 マッチングユニット、72 名前空間管理部、74 変数管理部、76 マッチング部、78 集合演算部、80 VCユニット、82 マッピング部、84 定義ファイル取得部、86 定義ファイル生成部、100 文書処理装置。
【技術分野】
【0001】
本発明は、文書処理技術に関し、特に、マークアップ言語により記述された文書を処理する文書処理装置及び方法に関する。
【背景技術】
【0002】
XMLは、ネットワークなどを介して他者とデータを共有するのに適した形式として注目されており、XML文書を作成、表示、編集するためのアプリケーションが開発されている(たとえば、特許文献1参照)。XML文書は、文書型定義などにより定義されたボキャブラリ(タグセット)に基づいて作成されている。
【先行技術文献】
【特許文献】
【0003】
【特許文献1】特開2001−290804号公報
【発明の概要】
【発明が解決しようとする課題】
【0004】
ボキャブラリは、任意に定義することが許されており、理論上、無限に多くのボキャブラリが存在しうる。本出願人は、このように柔軟な設計が許されるXML文書を適切に処理することが可能な技術を開発した。そして、XMLの長所を十分に生かした利便性の高いデータ処理技術を想到するに至った。
【0005】
本発明はこうした状況に鑑みてなされたものであり、その目的は、マークアップ言語により構造化された文書を適切に処理する技術を提供することにある。
【課題を解決するための手段】
【0006】
本発明のある態様は、データ処理装置に関する。このデータ処理装置は、マークアップ言語により記述されたデータのパターンと、マークアップ言語により記述されたデータ又はマークアップ言語により記述されていないデータのパターンとの間の対応関係を定義した規則を取得する規則取得部と、比較元のデータを取得するデータ取得部と、前記比較元のデータに合致するパターンを選択するマッチング部と、を備え、前記マッチング部は、前記パターンに変数が含まれる場合、前記パターンのうち前記変数以外のデータが前記比較元のデータに合致するパターンを選択し、前記変数を含む前記パターンが選択されたとき、選択された前記パターンにおける前記変数の位置と対応する位置にある前記比較元のデータを前記変数に代入する変数管理部を更に備え、前記変数管理部は、前記比較元のデータがマークアップ言語により記述されたデータであり、選択された前記パターンにおける前記変数の位置と対応する位置にある前記比較元のデータが複数のノードを含むフラグメントである場合、前記フラグメントを前記変数に代入することを特徴とする。
【0007】
前記変数管理部は、選択された前記パターンにおける前記変数の位置と対応する前記比較元のデータの位置に、前記変数に代入可能な同種又は異種混合のデータが複数並列して存在する場合は、それらをリストとして前記変数に格納してもよい。
【0008】
前記変数管理部は、前記比較元のデータがマークアップ言語により記述されたデータであったときに、選択された前記パターンにおける前記変数の位置と対応する前記比較元のデータの位置にあるノードが複数の兄弟ノードを持つ場合は、それらのノード又はそれらのノードを頂点ノードとするフラグメントをリストとして前記変数に格納してもよい。
【0009】
前記変数管理部は、前記変数に、複数の任意のデータにマッチさせることを示すワイルドカードが付されている場合に、マッチした複数のデータをリストとして前記変数に格納してもよい。
【0010】
前記変数管理部は、前記変数に、前記フラグメントのうちテキストノードを含まない任意のデータをマッチさせることを示すワイルドカードが付されている場合に、マッチしたフラグメントのうちテキストノードを除いたデータを前記変数に代入し、前記変数に、テキストノードも含んだ任意の前記フラグメントをマッチさせることを示すワイルドカードが付されている場合に、マッチしたフラグメントを前記変数に代入してもよい。
【0011】
データ処理装置は、前記マッチング部がマークアップ言語により記述された要素又は属性同士を比較する際に、前記要素又は前記属性同士の名前空間を比較する名前空間管理部を更に備えてもよく、前記マッチング部は、前記名前空間管理部により前記要素又は前記属性同士の名前空間が合致しないと判定された場合は、前記要素又は前記属性同士が合致しないと判定してもよい。
【0012】
データ処理装置は、前記比較元のデータを、選択された前記パターンに対応するパターンのデータに変換する変換部を更に備えてもよい。
【0013】
前記規則のうち、少なくとも一つの対応関係の定義は、対応する2つのパターンの間で同じ変数を含んでもよく、前記比較元のデータに含まれるデータが前記変数に代入されることにより、前記比較元のデータが、前記比較元のデータの少なくとも一部を含んだ、前記比較元のデータとは異なるパターンのデータに変換されてもよい。
【0014】
本発明の別の態様は、データ処理方法に関する。このデータ処理方法は、マークアップ言語により記述されたデータのパターンと、マークアップ言語により記述されたデータ又はマークアップ言語により記述されていないデータのパターンとの間の対応関係を定義した規則を取得するステップと、比較元のデータを取得するステップと、前記比較元のデータに合致するパターンを選択するステップと、前記パターンに変数が含まれる場合、前記パターンのうち前記変数以外のデータが前記比較元のデータに合致するパターンを選択するステップ、前記変数を含む前記パターンが選択されたとき、選択された前記パターンにおける前記変数の位置と対応する位置にある前記比較元のデータを前記変数に代入するステップと、前記比較元のデータがマークアップ言語により記述されたデータであり、選択された前記パターンにおける前記変数の位置と対応する位置にある前記比較元のデータが複数のノードを含むフラグメントである場合、前記フラグメントを前記変数に代入するステップと、を備えることを特徴とする。
【0015】
なお、以上の構成要素の任意の組合せ、本発明の表現を方法、装置、システムなどの間で変換したものもまた、本発明の態様として有効である。
【発明の効果】
【0016】
本発明によれば、マークアップ言語により構造化された文書を適切に処理する技術を提供することができる。
【図面の簡単な説明】
【0017】
【図1】前提技術に係る文書処理装置の構成を示す図である。
【図2】文書処理装置により編集されるXML文書の例を示す図である。
【図3】図2に示したXML文書をHTMLで記述された表にマッピングする例を示す図である。
【図4(a)】図2に示したXML文書を図3に示した表にマッピングするための定義ファイルの例を示す図である。
【図4(b)】図2に示したXML文書を図3に示した表にマッピングするための定義ファイルの例を示す図である。
【図5】図2に示したXML文書を、図3に示した対応によりHTMLにマッピングして表示した画面の例を示す図である。
【図6】ユーザが定義ファイルを生成するために、定義ファイル生成部がユーザに提示するグラフィカルユーザインターフェースの例を示す図である。
【図7】定義ファイル生成部により生成された画面レイアウトの他の例を示す図である。
【図8】文書処理装置によるXML文書の編集画面の一例を示す図である。
【図9】文書処理装置により編集されるXML文書の他の例を示す図である。
【図10】図9に示した文書を表示した画面の例を示す図である。
【図11】第1の実施の形態に係る文書処理装置の構成を示す図である。
【図12】プログラムコードの例を示す図である。
【図13】ソース文書の例を示す図である。
【図14】図13に示したソース文書を図12に示したプログラムで変換したデスティネーション文書を示す図である。
【図15】図14に示したデスティネーション文書を表示した画面の例を示す図である。
【図16】第2の実施の形態に係る文書処理装置の構成を示す図である。
【図17】図17(a)(b)(c)は、第2の実施の形態に係る構文で記述されたプログラムコードの例を示す図である。
【発明を実施するための形態】
【0018】
(前提技術)
図1は、前提技術に係る文書処理装置20の構成を示す。文書処理装置20は、文書内のデータが階層構造を有する複数の構成要素に分類された構造化文書を処理するが、本前提技術では構造化文書の一例としてXML文書を処理する例について説明する。文書処理装置20は、主制御ユニット22、編集ユニット24、DOMユニット30、CSSユニット40、HTMLユニット50、SVGユニット60、及び変換部の一例であるVCユニット80を備える。これらの構成は、ハードウエアコンポーネントでいえば、任意のコンピュータのCPU、メモリ、メモリにロードされたプログラムなどによって実現されるが、ここではそれらの連携によって実現される機能ブロックを描いている。したがって、これらの機能ブロックがハードウエアのみ、ソフトウエアのみ、またはそれらの組合せによっていろいろな形で実現できることは、当業者には理解されるところである。
【0019】
主制御ユニット22は、プラグインのロードや、コマンド実行のフレームワークを提供する。編集ユニット24は、XML文書を編集するためのフレームワークを提供する。文書処理装置20における文書の表示及び編集機能は、プラグインにより実現されており、文書の種別に応じて必要なプラグインが主制御ユニット22又は編集ユニット24によりロードされる。主制御ユニット22又は編集ユニット24は、処理対象となるXML文書の名前空間を参照して、XML文書がいずれのボキャブラリにより記述されているかを判別し、そのボキャブラリに対応した表示又は編集用のプラグインをロードして表示や編集を実行させる。例えば、文書処理装置20には、HTML文書の表示及び編集を行うHTMLユニット50、SVG文書の表示及び編集を行うSVGユニット60など、ボキャブラリ(タグセット)ごとに表示系及び編集系がプラグインとして実装されており、HTML文書を編集するときはHTMLユニット50が、SVG文書を編集するときはSVGユニット60が、それぞれロードされる。後述するように、HTMLとSVGの双方の構成要素を含む複合文書が処理対象となっている場合は、HTMLユニット50とSVGユニット60の双方がロードされる。
【0020】
このような構成によれば、ユーザは、必要な機能のみを選択してインストールし、後から適宜機能を追加又は削除することができるので、プログラムを格納するハードディスクなどの記録媒体の記憶領域を有効に活用することができ、また、プログラム実行時にも、メモリの浪費を防ぐことができる。また、機能拡張性に優れており、開発主体としても、プラグインの形で新たなボキャブラリに対応することが可能なので開発が容易となり、ユーザとしても、プラグインの追加により容易かつ低コストにて機能を追加することができる。
【0021】
編集ユニット24は、ユーザインターフェースを介してユーザから編集指示のイベントを受け付け、そのイベントを適切なプラグインなどに通知するともに、イベントの再実行(リドゥ)又は実行の取消(アンドゥ)などの処理を制御する。
【0022】
DOMユニット30は、DOM提供部32、DOM生成部34、及び出力部36を含み、XML文書をデータとして扱うときのアクセス方法を提供するために定められた文書オブジェクトモデル(Document Object Model:DOM)に準拠した機能を実現する。DOM提供部32は、編集ユニット24に定義されているインタフェースを満たすDOMの実装である。DOM生成部34は、XML文書からDOMツリーを生成する。後述するように、処理対象となるXML文書が、VCユニット80により他のボキャブラリにマッピングされる場合は、マッピング元のXML文書に対応するソースツリーと、マッピング先のXML文書に対応するデスティネーションツリーが生成される。出力部36は、例えば編集終了時に、DOMツリーをXML文書として出力する。
【0023】
CSSユニット40は、CSS解析部42、CSS提供部44、及びレンダリング部46を含み、CSSに準拠した表示機能を提供する。CSS解析部42は、CSSの構文を解析するパーサの機能を有する。CSS提供部44は、CSSオブジェクトの実装であり、DOMツリーに対してCSSのカスケード処理を行う。レンダリング部46は、CSSのレンダリングエンジンであり、CSSを用いてレイアウトされるHTMLなどのボキャブラリで記述された文書の表示に用いられる。
【0024】
HTMLユニット50は、HTMLにより記述された文書を表示又は編集する。SVGユニット60は、SVGにより記述された文書を表示又は編集する。これらの表示/編集系は、プラグインの形で実現されており、それぞれ、文書を表示する表示部(Canvas)56、66、編集指示を含むイベントを送受信する制御部(Editlet)52、62、編集コマンドを受けてDOMに対して編集を行う編集部(Zone)54、64を備える。制御部52又は62が外部からDOMツリーの編集コマンドを受け付けると、編集部54又は64がDOMツリーを変更し、表示部56又は66が表示を更新する。これらは、MVC(Model-View-Controller)と呼ばれるフレームワークに類似する構成をとっており、概ね、表示部56及び66が「View」に、制御部52及び62が「Controller」に、編集部54及び64とDOMの実体が「Model」に、それぞれ対応する。本前提技術の文書処理装置20では、XML文書をツリー表示形式で編集するだけでなく、それぞれのボキャブラリに応じた編集を可能とする。例えば、HTMLユニット50は、HTML文書をワードプロセッサに類似した方式で編集するためのユーザインターフェースを提供し、SVGユニット60は、SVG文書を画像描画ツールに類似した方式で編集するためのユーザインターフェースを提供する。
【0025】
VCユニット80は、マッピング部82、定義ファイル取得部84、及び定義ファイル生成部86を含み、あるボキャブラリにより記述された文書を、他のボキャブラリにマッピングすることにより、マッピング先のボキャブラリに対応した表示編集用プラグインで文書を表示又は編集するためのフレームワークを提供する。本前提技術では、この機能を、ボキャブラリコネクション(Vocabulary Connection:VC)と呼ぶ。定義ファイル取得部84は、マッピングの定義を記述したスクリプトファイルを取得する。この定義ファイルは、ノードごとに、ノード間の対応(コネクション)を記述する。このとき、各ノードの要素値や属性値の編集の可否を指定してもよい。また、ノードの要素値や属性値を用いた演算式を記述してもよい。これらの機能については、後で詳述する。マッピング部82は、定義ファイル取得部84が取得したスクリプトファイルを参照して、DOM生成部34にデスティネーションツリーを生成させ、ソースツリーとデスティネーションツリーの対応関係を管理する。定義ファイル生成部86は、ユーザが定義ファイルを生成するためのグラフィカルユーザインターフェースを提供する。
【0026】
VCユニット80は、ソースツリーとデスティネーションツリーの間のコネクションを監視し、表示を担当するプラグインにより提供されるユーザインタフェースを介してユーザから編集指示を受け付けると、まずソースツリーの該当するノードを変更する。DOMユニット30が、ソースツリーが変更された旨のミューテーションイベントを発行すると、VCユニット80は、そのミューテーションイベントを受けて、ソースツリーの変更にデスティネーションツリーを同期させるべく、変更されたノードに対応するデスティネーションツリーのノードを変更する。デスティネーションツリーを表示/編集するプラグイン、例えばHTMLユニット50は、デスティネーションツリーが変更された旨のミューテーションイベントを受けて、変更されたデスティネーションツリーを参照して表示を更新する。このような構成により、少数のユーザにより利用されるローカルなボキャブラリにより記述された文書であっても、他のメジャーなボキャブラリに変換することで、文書を表示することができるとともに、編集環境が提供される。
【0027】
文書処理装置20により文書を表示又は編集する動作について説明する。文書処理装置20が処理対象となる文書を読み込むと、DOM生成部34が、そのXML文書からDOMツリーを生成する。また、主制御ユニット22又は編集ユニット24は、名前空間を参照して文書を記述しているボキャブラリを判別する。そのボキャブラリに対応したプラグインが文書処理装置20にインストールされている場合は、そのプラグインをロードして、文書を表示/編集させる。プラグインがインストールされていない場合は、マッピングの定義ファイルが存在するか否かを確認する。定義ファイルが存在する場合、定義ファイル取得部84が定義ファイルを取得し、その定義に従って、デスティネーションツリーが生成され、マッピング先のボキャブラリに対応するプラグインにより文書が表示/編集される。複数のボキャブラリを含む複合文書である場合は、後述するように、それぞれのボキャブラリに対応したプラグインにより、文書の該当箇所がそれぞれ表示/編集される。定義ファイルが存在しない場合は、文書のソース又はツリー構造を表示し、その表示画面において編集が行われる。
【0028】
図2は、処理対象となるXML文書の例を示す。このXML文書は、生徒の成績データを管理するために用いられる。XML文書のトップノードである構成要素「成績」は、配下に、生徒ごとに設けられた構成要素「生徒」を複数有する。構成要素「生徒」は、属性値「名前」と、子要素「国語」、「数学」、「理科」、「社会」を有する。属性値「名前」は、生徒の名前を格納する。構成要素「国語」、「数学」、「理科」、「社会」は、それぞれ、国語、数学、理科、社会の成績を格納する。例えば、名前が「A」である生徒の国語の成績は「90」、数学の成績は「50」、理科の成績は「75」、社会の成績は「60」である。以下、この文書で使用されているボキャブラリ(タグセット)を、「成績管理ボキャブラリ」と呼ぶ。
【0029】
本前提技術の文書処理装置20は、成績管理ボキャブラリの表示/編集に対応したプラグインを有しないので、この文書をソース表示、ツリー表示以外の方法で表示するためには、前述したVC機能が用いられる。すなわち、成績管理ボキャブラリを、プラグインが用意された別のボキャブラリ、例えば、HTMLやSVGなどにマッピングするための定義ファイルを用意する必要がある。ユーザ自身が定義ファイルを作成するためのユーザインターフェースについては後述することにして、ここでは、既に定義ファイルが用意されているとして説明を進める。
【0030】
図3は、図2に示したXML文書をHTMLで記述された表にマッピングする例を示す。図3の例では、成績管理ボキャブラリの「生徒」ノードを、HTMLにおける表(「TABLE」ノード)の行(「TR」ノード)に対応づけ、各行の第1列には属性値「名前」を、第2列には「国語」ノードの要素値を、第3列には「数学」ノードの要素値を、第4列には「理科」ノードの要素値を、第5列には「社会」ノードの要素値を、それぞれ対応付ける。これにより、図2に示したXML文書を、HTMLの表形式で表示することができる。また、これらの属性値及び要素値は、編集可能であることが指定されており、ユーザがHTMLによる表示画面上で、HTMLユニット50の編集機能により、これらの値を編集することができる。第6列には、国語、数学、理科、社会の成績の加重平均を算出する演算式が指定されており、生徒の成績の平均点が表示される。このように、定義ファイルに演算式を指定可能とすることにより、より柔軟な表示が可能となり、編集時のユーザの利便性を向上させることができる。なお、第6列は、編集不可であることが指定されており、平均点のみを個別に編集することができないようにしている。このように、マッピング定義において、編集の可否を指定可能とすることにより、ユーザの誤操作を防ぐことができる。
【0031】
図4(a)及び図4(b)は、図2に示したXML文書を図3に示した表にマッピングするための定義ファイルの例を示す。この定義ファイルは、定義ファイル用に定義されたスクリプト言語により記述される。定義ファイルには、コマンドの定義と、表示のテンプレートが記述されている。図4(a)(b)の例では、コマンドとして、「生徒の追加」と「生徒の削除」が定義されており、それぞれ、ソースツリーにノード「生徒」を挿入する操作と、ソースツリーからノード「生徒」を削除する操作が対応付けられている。また、テンプレートとして、表の第1行に「名前」、「国語」などの見出しが表示され、第2行以降に、ノード「生徒」の内容が表示されることが記述されている。ノード「生徒」の内容を表示するテンプレート中、「text-of」と記述された項は「編集可能」であることを意味し、「value-of」と記述された項は「編集不可能」であることを意味する。また、ノード「生徒」の内容を表示する行のうち、第6列には、「(src:国語 + src:数学 + src:理科 + src:社会) div 4」という計算式が記述されており、生徒の成績の平均が表示されることを意味する。
【0032】
図5は、図2に示した成績管理ボキャブラリで記述されたXML文書を、図3に示した対応によりHTMLにマッピングして表示した画面の例を示す。表90の各行には、左から、各生徒の名前、国語の成績、数学の成績、理科の成績、社会の成績、及び平均点が表示されている。ユーザは、この画面上で、XML文書を編集することができる。たとえば、第2行第3列の値を「70」に変更すると、このノードに対応するソースツリーの要素値、すなわち、生徒「B」の数学の成績が「70」に変更される。このとき、VCユニット80は、デスティネーションツリーをソースツリーに追従させるべく、デスティネーションツリーの該当箇所を変更し、HTMLユニット50が、変更されたデスティネーションツリーに基づいて表示を更新する。したがって、画面上の表においても、生徒「B」の数学の成績が「70」に変更され、更に、平均点が「55」に変更される。
【0033】
図5に示した画面には、図4(a)(b)に示した定義ファイルに定義されたように、「生徒の追加」及び「生徒の削除」のコマンドがメニューに表示される。ユーザがこれらのコマンドを選択すると、ソースツリーにおいて、ノード「生徒」が追加又は削除される。このように、本前提技術の文書処理装置20では、階層構造の末端の構成要素の要素値を編集するのみではなく、階層構造を編集することも可能である。このようなツリー構造の編集機能は、コマンドの形でユーザに提供されてもよい。また、例えば、表の行を追加又は削除するコマンドが、ノード「生徒」を追加又は削除する操作に対応づけられてもよい。また、他のボキャブラリを埋め込むコマンドがユーザに提供されてもよい。この表を入力用テンプレートとして、穴埋め形式で新たな生徒の成績データを追加することもできる。以上のように、VC機能により、HTMLユニット50の表示/編集機能を利用しつつ、成績管理ボキャブラリで記述された文書を編集することが可能となる。
【0034】
図6は、ユーザが定義ファイルを生成するために、定義ファイル生成部86がユーザに提示するグラフィカルユーザインタフェースの例を示す。画面左側の領域91には、マッピング元のXML文書がツリー表示されている。画面右側の領域92には、マッピング先のXML文書の画面レイアウトが示されている。この画面レイアウトは、HTMLユニット50により編集可能となっており、ユーザは、画面右側の領域92において、文書を表示するための画面レイアウトを作成する。そして、例えば、マウスなどのポインティングデバイスにより、画面左側の領域91に表示されたマッピング元のXML文書のノードを、画面右側の領域92に表示されたHTMLによる画面レイアウト中へドラッグ&ドロップ操作を行うことにより、マッピング元のノードと、マッピング先のノードとのコネクションが指定される。例えば、要素「生徒」の子要素である「数学」を、HTML画面の表90の第1行第3列にドロップすると、「数学」ノードと、3列目の「TD」ノードの間にコネクションが張られる。各ノードには、編集の可否が指定できるようになっている。また、表示画面中には、演算式を埋め込むこともできる。画面の編集が終わると、定義ファイル生成部86は、画面レイアウトとノード間のコネクションを記述した定義ファイルを生成する。
【0035】
XHTML、MathML、SVGなどの主要なボキャブラリに対応したビューワやエディタは既に開発されているが、図2に示した文書のようなオリジナルなボキャブラリで記述された文書に対応したビューワやエディタを開発するのは現実的でない。しかし、上記のように、他のボキャブラリにマッピングするための定義ファイルを作成すれば、ビューワやエディタを開発しなくても、VC機能を利用して、オリジナルなボキャブラリで記述された文書を表示・編集することができる。
【0036】
図7は、定義ファイル生成部86により生成された画面レイアウトの他の例を示す。図7の例では、成績管理ボキャブラリで記述されたXML文書を表示するための画面に、表90と、円グラフ93が作成されている。この円グラフ93は、SVGにより記述される。後述するように、本前提技術の文書処理装置20は、一つのXML文書内に複数のボキャブラリを含む複合文書を処理することができるので、この例のように、HTMLで記述された表90と、SVGで記述された円グラフ93とを、一つの画面上に表示することができる。
【0037】
図8は、文書処理装置20によるXML文書の編集画面の一例を示す。図8の例では、一つの画面が複数に分割されており、それぞれの領域において、処理対象となるXML文書を異なる複数の表示形式により表示している。領域94には、文書のソースが表示されており、領域95には、文書のツリー構造が表示されており、領域96には、図5に示したHTMLにより記述された表が表示されている。これらのいずれの画面上においても、文書の編集が可能であり、いずれかの画面上でユーザが編集を行うと、ソースツリーが変更され、それぞれの画面の表示を担当するプラグインが、ソースツリーの変更を反映すべく画面を更新する。具体的には、ソースツリーの変更を通知するミューテーションイベントのリスナーとして、それぞれの編集画面の表示を担当するプラグインの表示部を登録しておき、いずれかのプラグイン又はVCユニット80によりソースツリーが変更されたときに、編集画面を表示中の全ての表示部が、発行されたミューテーションイベントを受け取って画面を更新する。このとき、プラグインがVC機能により表示を行っている場合は、VCユニット80がソースツリーの変更に追従してデスティネーションツリーを変更した後、変更されたデスティネーションツリーを参照してプラグインの表示部が画面を更新する。
【0038】
例えば、ソース表示及びツリー表示を、専用のプラグインにより実現している場合は、ソース表示用プラグインとツリー表示用プラグインは、デスティネーションツリーを用いず、直接ソースツリーを参照して表示を行う。この場合、いずれかの画面において編集が行われると、ソース表示用プラグインとツリー表示用プラグインは、変更されたソースツリーを参照して画面を更新し、領域96の画面を担当しているHTMLユニット50は、ソースツリーの変更に追従して変更されたデスティネーションツリーを参照して画面を更新する。
【0039】
ソース表示及びツリー表示は、VC機能を利用して実現することもできる。すなわち、ソース、ツリー構造をHTMLによりレイアウトし、そのHTMLにXML文書をマッピングして、HTMLユニット50により表示してもよい。この場合、ソース形式、ツリー形式、表形式の3つのデスティネーションツリーが生成されることになる。いずれかの画面において編集が行われると、VCユニット80は、ソースツリーを変更した後、ソース形式、ツリー形式、表形式の3つのデスティネーションツリーをそれぞれ変更し、HTMLユニット50は、それらのデスティネーションツリーを参照して、3つの画面を更新する。
【0040】
このように、一つの画面上に複数の表示形式で文書を表示することにより、ユーザの利便性を向上させることができる。例えば、ユーザは、ソース表示又はツリー表示により文書の階層構造を把握しつつ、表90などを用いて視覚的に分かりやすい形式で文書を表示し、編集することができる。上記の例では、一つの画面を分割して複数の表示形式による画面を同時に表示したが、一つの画面に一つの表示形式による画面を表示し、表示形式をユーザの指示により切り替え可能としてもよい。この場合、主制御ユニット22が、ユーザから表示形式の切り替え要求を受け付け、各プラグインに指示して表示を切り替える。
【0041】
図9は、文書処理装置20により編集されるXML文書の他の例を示す。図9に示したXML文書では、SVG文書の「foreignObject」タグの中にXHTML文書が埋め込まれており、さらに、XHTML文書の中にMathMLで記述された数式が入っている。このような場合、編集ユニット24が、名前空間を参照して、適切な表示系に描画作業を振り分ける。図9の例では、編集ユニット24は、まず、SVGユニット60に四角形を描画させ、つづいて、HTMLユニット50にXHTML文書を描画させる。さらに、図示しないMathMLユニットに、数式を描画させる。こうして、複数のボキャブラリを包含する複合文書が適切に表示される。表示結果を図10に示す。
【0042】
文書編集中、カーソル(キャリッジ)の位置に応じて、表示されるメニューを切り替えてもよい。すなわち、カーソルが、SVG文書が表示された領域内に存在するときは、SVGユニット60が提供するメニュー、又はSVG文書をマッピングするための定義ファイルに定義されたコマンドを表示し、カーソルが、XHTML文書が表示された領域内に存在するときは、HTMLユニット50が提供するメニュー、又はXHTML文書をマッピングするための定義ファイルに定義されたコマンドを表示する。これにより、編集位置に応じて適切なユーザインターフェースを提供することができる。
【0043】
複合文書において、あるボキャブラリに対応する適切なプラグイン又はマッピング定義ファイルがなかった場合は、そのボキャブラリにより記述された部分は、ソース表示又はツリー表示されてもよい。従来、ある文書に他の文書を埋め込んだ複合文書を開くとき、埋め込まれた文書を表示するアプリケーションがインストールされていないと、その内容を表示することができなかったが、本前提技術では、表示用のアプリケーションが存在しなくても、テキストデータにより構成されたXML文書をソース表示又はツリー表示することにより内容を把握することができる。これは、テキストベースであるXMLなどの文書ならではの特徴といえる。
【0044】
データがテキストベースで記述されることの他の利点として、例えば、複合文書中の、あるボキャブラリにより記述される部分において、同一文書内の他のボキャブラリで記述された部分のデータを参照してもよい。また、文書内で検索を実行する時に、SVGなどの図に埋め込まれた文字列も検索対象とすることができる。
【0045】
あるボキャブラリにより記述された文書内に、他のボキャブラリのタグを用いてもよい。このXML文書は、妥当(valid)ではないが、整形式(well-formed)であれば、有効なXML文書として処理可能である。この場合、挿入された他のボキャブラリのタグは、定義ファイルによりマッピングされてもよい。例えば、XHTML文書中に、「重要」、「最重要」などのタグを使用し、これらのタグで囲まれた部分を強調表示してもよいし、重要度の順にソートして表示してもよい。
【0046】
図10に示した編集画面において、ユーザにより文書が編集されると、編集された部分を担当するプラグイン又はVCユニット80がソースツリーを変更する。ソースツリーには、ノードごとにミューテーションイベントのリスナーを登録できるようになっており、通常は、各ノードが属するボキャブラリに対応したプラグインの表示部又はVCユニット80がリスナーとして登録される。DOM提供部32は、ソースツリーが変更されると、変更されたノードから上位の階層へたどって、登録されたリスナーがあれば、そのリスナーへミューテーションイベントを発行する。例えば、図9に示した文書において、<html>ノードの下位のノードが変更された場合、<html>ノードにリスナーとして登録されたHTMLユニット50にミューテーションイベントが通知されるとともに、その上位の<svg>ノードにリスナーとして登録されたSVGユニット60にもミューテーションイベントが通知される。このとき、HTMLユニット50は、変更されたソースツリーを参照して表示を更新する。SVGユニット60は、自身のボキャブラリに属するノードが変更されていないので、ミューテーションイベントを無視してもよい。
【0047】
編集の内容によっては、HTMLユニット50による表示の更新に伴って、全体のレイアウトが変わる可能性がある。この場合は、画面のレイアウトを管理する構成、例えば最上位のノードの表示を担当するプラグインにより、プラグインごとの表示領域のレイアウトが更新される。例えば、HTMLユニット50による表示領域が以前より大きくなった場合、HTMLユニット50は、まず自身の担当する部分を描画して、表示領域の大きさを決定する。そして、画面のレイアウトを管理する構成に、変更後の表示領域の大きさを通知し、レイアウトの更新を依頼する。画面のレイアウトを管理する構成は、通知を受けて、プラグインごとの表示領域を再レイアウトする。こうして、編集された部分の表示が適切に更新されるとともに、画面全体のレイアウトが更新される。
【0048】
(第1の実施の形態)
前提技術で説明したボキャブラリコネクション機能は、図4に示したように、XSLTを拡張した言語により記述された定義ファイルを用いて実現された。本実施の形態では、より柔軟に、XMLデータとXMLデータ又は他のデータとの対応関係を表現し、XMLデータとXMLデータ又は他のデータとの間の変換、逆変換、対応関係の検証などを実現する技術について説明する。
【0049】
XSLTは、XMLで記述された文書を別のXMLで記述された文書に変換するための言語であるが、変換に方向性があるため、逆変換を行う必要があるときには、逆変換の手順を別途定義する必要がある。例えば、処理系が実装されていないボキャブラリで記述された文書を、XSLTを用いて、処理系の実装されたボキャブラリの文書へ変換すれば、変換後の文書を処理系により編集することはできるが、その編集を元の文書に反映させるには、逆変換を行う必要がある。しかし、変換先の文書に対して任意の編集を許すと、変換元の文書との間の整合性を保つことが困難になる。
【0050】
前提技術では、順方向の変換の定義におけるノード間の対応関係を監視する構成を設け、変換先文書を表示した編集画面において、変換元文書に対する編集操作を受け付け、対応関係を監視する構成を介して、まず変換元文書を更新した後に、変換先文書へ更新を反映させることで、変換元文書と変換先文書との間の整合性を保ちながら編集を行う技術を採用し、このような問題を解決した。
【0051】
しかし、XSLTにはもう一つの問題がある。それは、単一のXML構造に基づいて処理を行うことしかできないので、複数のノードを含んだXMLフラグメントの対応関係を表現することができないことである。そこで、本実施の形態では、XMLフラグメントを代数化し、代数化されたXMLフラグメントを含むデータ間の対応関係を定義することを可能とすることにより、より柔軟にデータ間の対応関係を表現し、データ間の変換、逆変換、対応関係の検証などを実現する技術を提案する。
【0052】
データ間の対応関係を定義し、それらの対応関係に基づいてパターンマッチングを行うのに適したプログラミング言語として、例えば、一階述語論理に基づいたプログラミング言語であるProlog(Programming in Logic)などがある。しかし、Prologのパターンマッチングは、コードパターンのマッチングであり、そのままでは、XMLフラグメントを取り扱うのに適さない。例えば、要素名を比較する際に、実際には同じ名前空間であるのに、異なる名前空間接頭辞を用いて記述されているために、文字列としては一致せずにマッチングに失敗することがある。また、ある要素に複数の属性を記述できる場合に、実際には記述する順序は意味を持たないのに、規則に定義された順序とは異なる順序で属性が記述されているために、マッチングに失敗することがある。どのような順序で属性が記述されていてもマッチングに成功するようにするためには、想定されるあらゆる属性の並びを予め定義しておかなければならず、非常に煩雑である。本実施の形態では、こうしたXMLの特性に合わせて、任意のXMLフラグメントを一意に特定可能な表記法を採用する。
【0053】
図11は、第1の実施の形態に係る文書処理装置の構成を示す。第1の実施の形態に係る文書処理装置100は、図1に示した前提技術の文書処理装置20の構成に加えて、マッチングユニット70を更に備える。マッチングユニット70は、名前空間管理部72、変数管理部74、マッチング部76を含む。その他の構成及び動作は、前提技術と同様である。
【0054】
マッチングユニット70は、マークアップ言語により記述されたデータのパターンと、マークアップ言語により記述されたデータ又はマークアップ言語により記述されていないデータのパターンとの間の対応関係を定義した規則に基づいて、比較元のデータに合致するパターンを探索しつつ、比較元のデータを処理する。マッチングユニット70は、Prolog等のプログラミング言語により記述されたコードにしたがって逐次に処理を実行する処理系であってもよいし、プログラミング言語により記述されたコードをコンパイルした処理系であってもよい。
【0055】
マッチング部76は、データのパターン間の対応関係を定義した規則の中から、比較元のデータに合致するパターンを選択する。マッチング部76は、パターンに変数が含まれる場合、パターンのうち変数以外のデータが比較元のデータに合致するパターンを選択する。
【0056】
変数管理部74は、マッチング部76により変数を含むパターンが選択されたとき、選択されたパターンにおける変数の位置と対応する位置にある比較元のデータを変数に代入する。変数管理部74は、比較元のデータがマークアップ言語により記述されたデータであり、選択されたパターンにおける変数の位置と対応する位置にある比較元のデータが複数のノードを含むフラグメントである場合、フラグメントを変数に代入する。
【0057】
変数管理部74は、選択されたパターンにおける変数の位置と対応する比較元のデータの位置に、同種のデータが複数並列して存在する場合は、それらをリストとして変数に格納する。とくに、比較元のデータがマークアップ言語により記述されたデータであったときに、選択されたパターンにおける変数の位置と対応する比較元のデータの位置にあるノードが複数の兄弟ノードを持つ場合は、変数管理部74は、それらのノード又はそれらのノードを頂点ノードとするフラグメントをリストとして変数に格納する。
【0058】
名前空間管理部72は、マッチング部76がマークアップ言語により記述された要素又は属性同士を比較する際に、要素又は属性同士の名前空間を比較する。名前空間管理部72は、文書において宣言された名前空間接頭辞と名前空間URIの対応を保持しており、要素又は属性に付された名前空間接頭辞を名前空間URIに変換し、名前空間URIを比較することにより、要素又は属性同士の名前空間が合致するか否かを判定する。すなわち、名前空間接頭辞が異なっていても、同じ名前空間URIに対応づけられたものであれば、名前空間が合致すると判定する。逆に、同じ名前空間接頭辞が付されていても、異なる名前空間URIに対応づけられたものであれば、名前空間が合致しないと判定する。名前空間管理部72により要素又は属性同士の名前空間が合致しないと判定された場合は、マッチング部76は、要素又は属性同士が合致しないと判定する。
【0059】
図12は、XML文書を変換するプログラムのコードの例を示す。図12に示したプログラムでは、Prologと同様の表記法により、データ間の対応関係を定義する規則が記述されているが、上述したように、XMLフラグメントを取り扱うための拡張がなされている。例えば、変数に接尾辞としてワイルドカード「*」が付されている場合、マッチング部76は、数、順序、種別を問わずに、複数の任意のXMLフラグメントに変数をマッチさせる。このとき、変数管理部74は、マッチした複数のXMLフラグメントをリストとして変数に代入する。また、変数に接尾辞としてワイルドカード「+」が付されている場合、マッチング部76は、テキストノードを含む任意のXMLフラグメントに変数をマッチさせる。このとき、変数管理部74は、マッチしたXMLフラグメントを変数に代入する。また、変数に接尾辞としてワイルドカード「-」が付されている場合、マッチング部76は、テキストノードを除いた任意のXMLフラグメントに変数をマッチさせる。このとき、変数管理部74は、マッチしたXMLフラグメントのうちテキストノードを除いたデータを変数に代入する。ドキュメント型のXMLフラグメントの場合、接尾辞「+」が付された変数には、テキストノードを含む全てのノードが代入されるが、接尾辞「-」が付された変数には、テキストノード以外のノードが代入される。
【0060】
図13は、ソース文書の例を示す。図13に示した文書は、カクテルのレシピを記述するためのボキャブラリで記述されている。図13では、名前空間宣言が省略されているが、文書中に名前空間宣言がなされているものとする。文書には、頂点要素「Recipe」の下位に、レシピの名称を格納する要素「recipename」と、グラスの種別を格納する要素「glass」と、材料を格納する要素「ingredients」と、味の種別を格納する要素「taste」が記述されている。要素「ingredients」は、材料の種別ごとに、1以上の要素「ingredient」を含んでおり、各要素「ingredient」は、材料の名称を格納する要素「name」と、材料の分量を格納する要素「measure」を含む。要素「measure」は、分量の単位を格納する属性「unit」を含む。
【0061】
ここで、マッチングユニット70が、図13に示したソース文書を、図12に示した定義を用いて変換する動作の詳細を説明する。マッチングユニット70が、順方向変換用の質問「trans(入力ファイル名,出力ファイル名)」を受け付けると、マッチング部76は、この質問に合致する事実又は規則を探索し、規則500「trans(_InFile,_Outfile)」を選択する。このとき、変数管理部74は、質問の第1引数に指定された入力ファイル名を自由変数「_InFile」に代入し、第2引数に指定された出力ファイル名を自由変数「_OutFile」に代入する。
【0062】
つづいて、マッチングユニット70は、規則500の1番目のゴールを実行し、指定された入力ファイルをロードする。ここでは、図13に示したソース文書がロードされる。このとき、DOM生成部は、ロードされた文書からソースDOMを生成する。変数管理部74は、生成されたソースDOMを自由変数「_sourceXML」に代入する。
【0063】
つづいて、マッチングユニット70は、規則500の2番目のゴールである「eq(_sourceXML,_destXML)」を実行する。マッチング部76は、変数「_sourceXML」に格納されているソースDOMと、規則502の頭部の第1引数とを比較し、自由変数以外の部分のマッチングに成功すれば、すなわち、ソースDOMが規則502の頭部の第1引数に記述されたXMLフラグメントと同じ構造を有していれば、規則502を選択する。このとき、変数管理部74は、各自由変数に、ソースDOM中の該当位置のXMLフラグメントを代入する。
【0064】
図13に示したソース文書は、規則502の頭部の第1引数と同じ構造を有しているので、マッチング部76は規則502を選択し、変数管理部74は、自由変数「NameOfRecipe」に文字列「ギムレット」を代入し、自由変数「_NameOfGlass」に文字列「カクテルグラス」を代入し、自由変数「_Ingredients」に要素「ingredients」の下位のXMLフラグメントを代入し、自由変数「_Tastes」に、要素「ingredients」よりも後に記述されているXMLフラグメントを代入する。ここで、自由変数「_Ingredients」には接尾辞としてワイルドカード「*」が付されており、図13に示したソース文書では、要素「ingredients」の下位に2つの要素「ingredient」が記述されているので、変数管理部74は、これらの要素「ingredient」を頂点ノードとする2つのXMLフラグメントをリストとして自由変数「_Ingredients」に格納する。
【0065】
また、変数管理部74は、自由変数「_destXML」に規則502の頭部の第2引数に記述されているXMLフラグメントを代入する。このとき、第2引数に記述されたXMLフラグメントには、第1引数に記述されたXMLフラグメントに含まれる変数と同一の変数、例えば、変数「_NameOfRecipe」などが含まれており、図13に示したソース文書中のデータの一部がデスティネーション文書中に反映される。第2引数に記述されたXMLフラグメントに含まれる変数「_TRofIngredients」及び変数「_Input」には、まだ値が代入されていない。
【0066】
つづいて、マッチングユニット70は、規則502の1番目のゴールである「equivIngWithTr(_Ingredients,_TRofIngredients)」を実行する。マッチング部76は、規則504の頭部の第1引数と変数「_Ingredients」を比較するが、変数「_Ingredients」は空のリストではないので、規則504とのマッチングは失敗する。マッチング部76は、次に、規則506の頭部の第1引数と変数「_Ingredients」を比較する。変数「_Ingredients」はリストであるので、マッチング部76は、規則506とのマッチングに成功し、変数管理部74は、変数「_Ingredients」の1番目のXMLフラグメントを変数「_Ingredient」に、残りを変数「_Ingredients」に代入する。
【0067】
つづいて、マッチングユニット70は、規則506の1番目のゴールである「equiv(_Ingredient,_TRofIngredient)」を実行する。マッチング部76は、変数「_Ingredient」に格納されているXMLフラグメントと、規則508の頭部の第1引数とを比較する。いま、変数「_Ingredient」には、図13に示したソース文書中の2つの要素「Ingredient」のうち、1番目の要素「Ingredient」を頂点ノードとするXMLフラグメントが格納されているので、マッチング部76は、規則508とのマッチングに成功し、変数管理部74は、自由変数「_Name」に文字列「ドライジン」を、自由変数「_UNIT」に文字列「ml」を、自由変数「_VALUE」に文字列「45」を代入する。
【0068】
変数管理部74は、更に、規則508を呼び出した規則506の1番目のゴールの第2引数である自由変数「_TRofIngredient」に、規則508の頭部の第2引数を代入する。このとき、規則508の第2引数の中に記述された変数「_Name」、「_VALUE」、「_UNIT」には、既にソース文書中から抽出されたデータが格納されている。こうして、ソース文書中の要素「Ingredient」を頂点とするXMLフラグメントから、XHTMLの要素「tr」を頂点とするXMLフラグメントが生成される。規則508の体部にはカットが記述されているので、マッチングユニット70は、規則506の1番目のゴールの実行を終了し、2番目のゴールを実行する。
【0069】
規則508の2番目のゴールでは、「equivIngWithTr(_Ingredients,_TRofIngredients)」が再帰的に呼び出される。こうして、変数「_Ingredients」に格納されていたXMLフラグメントは全て処理され、最終的に、変数「_Ingredients」のリストが空になると、規則504が選択される。規則504の体部にはカットが記述されているので、マッチングユニット70は、規則502の1番目のゴールの実行を終了する。こうして、変数「_Ingredients」に格納されていたXMLフラグメントから生成されたXMLフラグメントが、変数「_destXML」に含まれる変数「_TRofIngredients」に代入される。
【0070】
規則502の2番目のゴールの実行により、同様にして、変数「_Tastes」に格納されていたXMLフラグメントから、異なるパターンのXMLフラグメントが生成され、変数「Inputs」に格納される。最後に、規則500の3番目のゴールが実行され、変数「_destXML」に格納されているXMLフラグメントが出力ファイルに書き込まれる。このようにして生成されたデスティネーション文書を図14に示す。また、このデスティネーション文書をHTMLユニット50により表示した画面の例を図15に示す。
【0071】
逆方向の変換を実行するには、逆方向変換用の質問「rtrans(入力ファイル名,出力ファイル名)」をマッチングユニット70に実行させればよい。マッチングユニット70は、図12に示した規則を用いて、上述した順方向の変換と同様の手順により、逆方向の変換を実行することができる。また、同様にして、マッチングユニット70は、あるXML文書が規則に記述されたパターンのXMLフラグメントを有しているかどうかを検証することができ、XML文書のバリデーションを行うことができる。
【0072】
(第2の実施の形態)
図16は、第2の実施の形態に係る文書処理装置の構成を示す。第2の実施の形態に係る文書処理装置100は、図11に示した第1の実施の形態の文書処理装置100の構成に加えて、集合演算部78を更に備える。集合演算部78は、後述するように、複数の値の集合を格納した変数のそれぞれの値に対して共通に実行すべき処理を簡便に記述するために追加された新たな構文により記述された演算を実行する。その他の構成及び動作は、前提技術と同様である。
【0073】
第1の実施の形態では、リストに含まれる複数の値のそれぞれを処理するために、再帰を用いてプログラムを記述していた。具体的には、図12に示したプログラムにおいて、変数「_Ingredients」に格納されたXMLフラグメントのリストをHTMLフラグメントに変換するために、規則506の「equivIngWithTr」の頭部において、リストの先頭の値を変数「_Ingredient」に取り出し、1番目のゴールで規則508の「equiv」を呼び出して変換を行い、変換先のHTMLフラグメントを変数「_TRofIngredients」の先頭の値に格納するという処理を、リストの残りの値に対して再帰的に繰り返すことにより、リストに含まれる全てのXMLフラグメントをHTMLフラグメントに変換した結果を、リストとして変数「_TRofIngredients」に格納するプログラムを記述している。
【0074】
このように、リストに含まれる全ての値に対して共通の処理を実行させる場面は非常に多いので、このような処理を実現するためのより簡略な構文を用意しておけば、プログラムを記述する際にも、プログラムを解析又は検証する際にも、非常に便利である。したがって、本実施の形態では、複数の値の集合を格納した変数に対して実行すべき共通の処理を簡便に記述するために、以下のような新しい構文を追加する。
【0075】
_X[*|+|-| ] [ : Op [-> _Y [^ Directive]]]
ここで、「:」は、変数「_X」に格納されているリストに対するオペレーションの指示子であり、「Op」は、変数「_X」に格納されているリストに対して処理を施すオペレーション(述語)である。また、「->」は、「Op」の結果をリストに構築して変数「_Y」に束縛させるオペレーションである。また、「^」は、「Op」の動作に対しての指示子であり、「Directive」は、「Op」の動作に対しての指示を指定する。この指定は、集合演算部78の動作に関する指示の指定であり、演算結果には影響しない。例えば、「#n」として、処理「Op」を並列に実行する際の多重度を記述可能である。集合演算部78は、処理の多重度が記述されていた場合、記述された多重度の数だけ処理を並列して実行する。また、「Wait(条件)」として、処理「Op」の実行を開始するための条件を記述可能である。集合演算部78は、「Wait( _Status )」という条件が記述されていた場合、「_Status」が束縛されるまで待機してから処理「Op」の実行を開始する。
【0076】
この構文で記述されたプログラムコードの例を図17(a)(b)(c)に示す。図17(a)に示すプログラムにおいて、「hoge(引数)」が実行されると、まず、マッチング部76は、引数に指定されたXMLフラグメントと、規則「hoge」の頭部の引数に記述されたXMLフラグメントとを比較し、同じ構造を有していれば、すなわち、引数に指定されたXMLフラグメントの頂点要素が「a」であれば、図17(a)に示した規則「hoge」を選択する。このとき、変数管理部74は、変数「_X」に要素「a」の下位のXMLフラグメントを代入する。変数「_X」には接尾辞として「*」が付されているので、前述したように、変数管理部74は、要素「a」の下位に複数のXMLフラグメントが存在する場合には、それぞれをリストとして変数「_X」に格納する。
【0077】
規則「hoge」では、変数「_X」のリストに含まれる複数の値のそれぞれに対して処理「f」を実行し、その結果をリストとして構築して変数「_Y」に束縛させるよう指定されている。したがって、集合演算部78は、まず、変数「_X」のリストの先頭の値に対して処理「f」を実行し、変数「_Y」のリストの先頭の値として格納し、以降、順次、変数「_X」のリストのそれぞれの値に対して同様に処理「f」を実行して変数「_Y」のリストを構築する。
【0078】
ここで、規則「hoge」では、処理「f」を実行する際に、多重度「3」で実行することが指定されている。したがって、集合演算部78は、3つの値に対する処理「f」を同時に並行して実行する。すなわち、まず、最初の値に対して処理「f」の実行を開始すると、その実行の終了を待たずに、2番目の値及び3番目の値に対して処理「f」の実行を開始して、3つの処理を同時並列的に実行する。集合演算部78は、3つの処理のうちいずれかの処理が終了すると、つづいて、4番目の値に対して処理「f」を開始する。このように、集合演算部78は、3つの処理が並列して実行されるように制御する。これにより、効率良く処理を進めることができ、処理に要する時間を短縮することができる。また、処理の多重度を簡便に指定可能な構文を用意することにより、開発者の利便性を向上させることができる。
【0079】
集合演算部78は、上記のように指定された多重度で並列処理を実行する際に、文書処理装置100を実現するコンピュータのCPUの稼働率やメモリの空き容量などを考慮して、並列処理の適否を判断してもよい。例えば、集合演算部78は、1番目の処理を実行開始した後、2番目の処理を実行する前に、1番目の処理の実行に要したメモリの容量やCPUの稼働率などと、現在のメモリの空き容量やCPUの稼働率などを参照して、十分なリソースが確保できない場合は、十分なリソースが確保されるまで、2番目の処理の実行を開始しないように制御してもよい。これにより、プログラムの実行環境に合わせて、並列処理の多重度を適切に調整することができる。
【0080】
図17(b)に示したプログラムにおいて、規則「validate」が呼び出されると、マッチング部76は、規則「validate」を選択し、変数管理部74は、引数に指定されたXMLフラグメントのうち、要素「List」の属性「origin」の値を変数「_URL」に格納し、要素「List」の子要素「Users」が有する複数の子要素のうちテキストノード以外のデータをリストとして変数「_USRS」に格納する。
【0081】
規則「validate」では、変数「_URL」の値に対して処理「CheckURL」を実行し、その結果を変数「_Status」に束縛させるよう指定されている。また、変数「_USRS」のリストに含まれるそれぞれの値に対して処理「CheckID」を実行するよう指定されている。ここで、処理「CheckID」に対しては、変数「_Status」が束縛されるまで処理を待つよう指定されている。したがって、集合演算部78は、変数「_URL」に対する処理「CheckURL」の実行に成功して変数「_Status」の値が確定するまで待機してから、変数「_USRS」に対する処理「CheckID」の実行を開始する。
【0082】
このように、処理を開始するための条件を簡便に指定可能な構文を用意することにより、開発者の利便性を向上させることができる。また、マークアップ言語により記述されたパターンの中に、集合を格納した変数に対する処理を記述するとともに、その処理を開始するための条件を記述することにより、記述されたプログラムをパースするときに、ある処理の開始条件として別の処理の終了が指定されているというような関連性を適切にチェックすることができ、デッドロック等の発生を適切かつ容易に検出することができる。
【0083】
図17(c)に示したプログラムは、図17(b)に示したプログラムにおける処理「CheckID」を、多重度「3」で並列実行することが指定されている。集合演算部78は、処理「CheckURL」が終了して変数「_Status」の値が確定すると、3つの処理「CheckID」を並列して実行し、それ以降は、実行中の処理「CheckID」のいずれかが終了すると、それに換えて新たな処理「CheckID」を開始する。
【0084】
上記の例のように、本実施の形態で用いられる構文によれば、複数の値の集合に対する共通の処理を記述する場合に、個別に記述する必要がなく、まとめて記述することができる。すなわち、複数の値の中から一つを取り出すコードや、規則を再帰的に呼び出すコードなどを記述する必要がなく、複数の値の集合を格納した変数に対する処理を直接記述する形式になっているので、プログラムの開発時にも、保守時にも、利便性を向上させることができる。
【0085】
上述した例では、集合演算部78が上記の構文を解釈して集合に対する演算を実行したが、別の例では、集合演算部78は、上記の構文を解釈して、図12に示したような、再帰的な呼び出しを用いてリストに含まれるそれぞれの値に対する処理を実現する従来の形式の構文によるプログラムコードに変換してもよい。この場合、プログラムの実行時には、第1の実施の形態と同様に演算が実行される。
【0086】
以上、本発明を実施の形態をもとに説明した。この実施の形態は例示であり、それらの各構成要素や各処理プロセスの組合せにいろいろな変形例が可能なこと、またそうした変形例も本発明の範囲にあることは当業者に理解されるところである。
【0087】
実施の形態では、XML文書を処理する例について説明したが、本実施の形態の文書処理装置100は、他のマークアップ言語、例えば、SGML、HTMLなどで記述された文書も同様に処理可能である。
【符号の説明】
【0088】
20 文書処理装置、22 主制御ユニット、24 編集ユニット、30 DOMユニット、32 DOM提供部、34 DOM生成部、36 出力部、40 CSSユニット、42 CSS解析部、44 CSS提供部、46 レンダリング部、50 HTMLユニット、52,62 制御部、54,64 編集部、56,66 表示部、60 SVGユニット、70 マッチングユニット、72 名前空間管理部、74 変数管理部、76 マッチング部、78 集合演算部、80 VCユニット、82 マッピング部、84 定義ファイル取得部、86 定義ファイル生成部、100 文書処理装置。
【特許請求の範囲】
【請求項1】
マークアップ言語により記述されたデータのパターンと、マークアップ言語により記述されたデータ又はマークアップ言語により記述されていないデータのパターンとの間の対応関係を定義した規則を取得する規則取得部と、
比較元のデータを取得するデータ取得部と、
前記比較元のデータに合致するパターンを選択するマッチング部と、を備え、
前記マッチング部は、前記パターンに変数が含まれる場合、前記パターンのうち前記変数以外のデータが前記比較元のデータに合致するパターンを選択し、
前記変数を含む前記パターンが選択されたとき、選択された前記パターンにおける前記変数の位置と対応する位置にある前記比較元のデータを前記変数に代入する変数管理部を更に備え、
前記変数管理部は、前記比較元のデータがマークアップ言語により記述されたデータであり、選択された前記パターンにおける前記変数の位置と対応する位置にある前記比較元のデータが複数のノードを含むフラグメントである場合、前記フラグメントを前記変数に代入することを特徴とするデータ処理装置。
【請求項2】
前記変数管理部は、選択された前記パターンにおける前記変数の位置と対応する前記比較元のデータの位置に、前記変数に代入可能な同種又は異種混合のデータが複数並列して存在する場合は、それらをリストとして前記変数に格納することを特徴とする請求項1に記載のデータ処理装置。
【請求項3】
前記変数管理部は、前記比較元のデータがマークアップ言語により記述されたデータであったときに、選択された前記パターンにおける前記変数の位置と対応する前記比較元のデータの位置にあるノードが複数の兄弟ノードを持つ場合は、それらのノード又はそれらのノードを頂点ノードとするフラグメントをリストとして前記変数に格納することを特徴とする請求項2に記載のデータ処理装置。
【請求項4】
前記変数管理部は、前記変数に、複数の任意のデータにマッチさせることを示すワイルドカードが付されている場合に、マッチした複数のデータをリストとして前記変数に格納することを特徴とする請求項2又は3に記載のデータ処理装置。
【請求項5】
前記変数管理部は、前記変数に、前記フラグメントのうちテキストノードを含まない任意のデータをマッチさせることを示すワイルドカードが付されている場合に、マッチしたフラグメントのうちテキストノードを除いたデータを前記変数に代入し、前記変数に、テキストノードも含んだ任意の前記フラグメントをマッチさせることを示すワイルドカードが付されている場合に、マッチしたフラグメントを前記変数に代入することを特徴とする請求項1から4のいずれかに記載のデータ処理装置。
【請求項6】
前記マッチング部がマークアップ言語により記述された要素又は属性同士を比較する際に、前記要素又は前記属性同士の名前空間を比較する名前空間管理部を更に備え、
前記マッチング部は、前記名前空間管理部により前記要素又は前記属性同士の名前空間が合致しないと判定された場合は、前記要素又は前記属性同士が合致しないと判定することを特徴とする請求項1から5のいずれかに記載のデータ処理装置。
【請求項7】
前記比較元のデータを、選択された前記パターンに対応するパターンのデータに変換する変換部を更に備えることを特徴とする請求項1から6のいずれかに記載のデータ処理装置。
【請求項8】
前記規則のうち、少なくとも一つの対応関係の定義は、対応する2つのパターンの間で同じ変数を含み、
前記比較元のデータに含まれるデータが前記変数に代入されることにより、前記比較元のデータが、前記比較元のデータの少なくとも一部を含んだ、前記比較元のデータとは異なるパターンのデータに変換されることを特徴とする請求項7に記載のデータ処理装置。
【請求項9】
前記マークアップ言語により記述されたパターンに、複数の値の集合を格納した変数が含まれ、前記変数に対する処理を記述する形式の構文により、前記複数の値のそれぞれに対して共通に実行すべき処理が記述されていた場合、前記複数の値のそれぞれに対して前記処理を実行する集合演算部を更に備えることを特徴とする請求項1から8のいずれかに記載のデータ処理装置。
【請求項10】
前記構文は、前記処理を並列に実行する際の多重度を記述可能であり、前記パターンに、前記処理の多重度が記述されていた場合、前記集合演算部は、記述された多重度の数だけ前記処理を並列して実行することを特徴とする請求項9に記載のデータ処理装置。
【請求項11】
前記構文は、前記処理の実行を開始するための条件を記述可能であり、前記パターンに、前記条件が記述されていた場合、前記集合演算部は、前記条件が満たされるまで待機してから前記処理を実行することを特徴とする請求項9又は10に記載のデータ処理装置。
【請求項12】
マークアップ言語により記述されたデータのパターンと、マークアップ言語により記述されたデータ又はマークアップ言語により記述されていないデータのパターンとの間の対応関係を定義した規則を取得するステップと、
比較元のデータを取得するステップと、
前記比較元のデータに合致するパターンを選択するステップと、
前記パターンに変数が含まれる場合、前記パターンのうち前記変数以外のデータが前記比較元のデータに合致するパターンを選択するステップと、
前記変数を含む前記パターンが選択されたとき、選択された前記パターンにおける前記変数の位置と対応する位置にある前記比較元のデータを前記変数に代入するステップと、
前記比較元のデータがマークアップ言語により記述されたデータであり、選択された前記パターンにおける前記変数の位置と対応する位置にある前記比較元のデータが複数のノードを含むフラグメントである場合、前記フラグメントを前記変数に代入するステップと、
を備えることを特徴とするデータ処理方法。
【請求項13】
マークアップ言語により記述されたデータのパターンと、マークアップ言語により記述されたデータ又はマークアップ言語により記述されていないデータのパターンとの間の対応関係を定義した規則を取得するステップと、
比較元のデータを取得するステップと、
前記比較元のデータに合致するパターンを選択するステップと、
前記パターンに変数が含まれる場合、前記パターンのうち前記変数以外のデータが前記比較元のデータに合致するパターンを選択するステップ、
前記変数を含む前記パターンが選択されたとき、選択された前記パターンにおける前記変数の位置と対応する位置にある前記比較元のデータを前記変数に代入するステップと、
前記比較元のデータがマークアップ言語により記述されたデータであり、選択された前記パターンにおける前記変数の位置と対応する位置にある前記比較元のデータが複数のノードを含むフラグメントである場合、前記フラグメントを前記変数に代入するステップと、
をコンピュータに実行させることを特徴とするプログラム。
【請求項1】
マークアップ言語により記述されたデータのパターンと、マークアップ言語により記述されたデータ又はマークアップ言語により記述されていないデータのパターンとの間の対応関係を定義した規則を取得する規則取得部と、
比較元のデータを取得するデータ取得部と、
前記比較元のデータに合致するパターンを選択するマッチング部と、を備え、
前記マッチング部は、前記パターンに変数が含まれる場合、前記パターンのうち前記変数以外のデータが前記比較元のデータに合致するパターンを選択し、
前記変数を含む前記パターンが選択されたとき、選択された前記パターンにおける前記変数の位置と対応する位置にある前記比較元のデータを前記変数に代入する変数管理部を更に備え、
前記変数管理部は、前記比較元のデータがマークアップ言語により記述されたデータであり、選択された前記パターンにおける前記変数の位置と対応する位置にある前記比較元のデータが複数のノードを含むフラグメントである場合、前記フラグメントを前記変数に代入することを特徴とするデータ処理装置。
【請求項2】
前記変数管理部は、選択された前記パターンにおける前記変数の位置と対応する前記比較元のデータの位置に、前記変数に代入可能な同種又は異種混合のデータが複数並列して存在する場合は、それらをリストとして前記変数に格納することを特徴とする請求項1に記載のデータ処理装置。
【請求項3】
前記変数管理部は、前記比較元のデータがマークアップ言語により記述されたデータであったときに、選択された前記パターンにおける前記変数の位置と対応する前記比較元のデータの位置にあるノードが複数の兄弟ノードを持つ場合は、それらのノード又はそれらのノードを頂点ノードとするフラグメントをリストとして前記変数に格納することを特徴とする請求項2に記載のデータ処理装置。
【請求項4】
前記変数管理部は、前記変数に、複数の任意のデータにマッチさせることを示すワイルドカードが付されている場合に、マッチした複数のデータをリストとして前記変数に格納することを特徴とする請求項2又は3に記載のデータ処理装置。
【請求項5】
前記変数管理部は、前記変数に、前記フラグメントのうちテキストノードを含まない任意のデータをマッチさせることを示すワイルドカードが付されている場合に、マッチしたフラグメントのうちテキストノードを除いたデータを前記変数に代入し、前記変数に、テキストノードも含んだ任意の前記フラグメントをマッチさせることを示すワイルドカードが付されている場合に、マッチしたフラグメントを前記変数に代入することを特徴とする請求項1から4のいずれかに記載のデータ処理装置。
【請求項6】
前記マッチング部がマークアップ言語により記述された要素又は属性同士を比較する際に、前記要素又は前記属性同士の名前空間を比較する名前空間管理部を更に備え、
前記マッチング部は、前記名前空間管理部により前記要素又は前記属性同士の名前空間が合致しないと判定された場合は、前記要素又は前記属性同士が合致しないと判定することを特徴とする請求項1から5のいずれかに記載のデータ処理装置。
【請求項7】
前記比較元のデータを、選択された前記パターンに対応するパターンのデータに変換する変換部を更に備えることを特徴とする請求項1から6のいずれかに記載のデータ処理装置。
【請求項8】
前記規則のうち、少なくとも一つの対応関係の定義は、対応する2つのパターンの間で同じ変数を含み、
前記比較元のデータに含まれるデータが前記変数に代入されることにより、前記比較元のデータが、前記比較元のデータの少なくとも一部を含んだ、前記比較元のデータとは異なるパターンのデータに変換されることを特徴とする請求項7に記載のデータ処理装置。
【請求項9】
前記マークアップ言語により記述されたパターンに、複数の値の集合を格納した変数が含まれ、前記変数に対する処理を記述する形式の構文により、前記複数の値のそれぞれに対して共通に実行すべき処理が記述されていた場合、前記複数の値のそれぞれに対して前記処理を実行する集合演算部を更に備えることを特徴とする請求項1から8のいずれかに記載のデータ処理装置。
【請求項10】
前記構文は、前記処理を並列に実行する際の多重度を記述可能であり、前記パターンに、前記処理の多重度が記述されていた場合、前記集合演算部は、記述された多重度の数だけ前記処理を並列して実行することを特徴とする請求項9に記載のデータ処理装置。
【請求項11】
前記構文は、前記処理の実行を開始するための条件を記述可能であり、前記パターンに、前記条件が記述されていた場合、前記集合演算部は、前記条件が満たされるまで待機してから前記処理を実行することを特徴とする請求項9又は10に記載のデータ処理装置。
【請求項12】
マークアップ言語により記述されたデータのパターンと、マークアップ言語により記述されたデータ又はマークアップ言語により記述されていないデータのパターンとの間の対応関係を定義した規則を取得するステップと、
比較元のデータを取得するステップと、
前記比較元のデータに合致するパターンを選択するステップと、
前記パターンに変数が含まれる場合、前記パターンのうち前記変数以外のデータが前記比較元のデータに合致するパターンを選択するステップと、
前記変数を含む前記パターンが選択されたとき、選択された前記パターンにおける前記変数の位置と対応する位置にある前記比較元のデータを前記変数に代入するステップと、
前記比較元のデータがマークアップ言語により記述されたデータであり、選択された前記パターンにおける前記変数の位置と対応する位置にある前記比較元のデータが複数のノードを含むフラグメントである場合、前記フラグメントを前記変数に代入するステップと、
を備えることを特徴とするデータ処理方法。
【請求項13】
マークアップ言語により記述されたデータのパターンと、マークアップ言語により記述されたデータ又はマークアップ言語により記述されていないデータのパターンとの間の対応関係を定義した規則を取得するステップと、
比較元のデータを取得するステップと、
前記比較元のデータに合致するパターンを選択するステップと、
前記パターンに変数が含まれる場合、前記パターンのうち前記変数以外のデータが前記比較元のデータに合致するパターンを選択するステップ、
前記変数を含む前記パターンが選択されたとき、選択された前記パターンにおける前記変数の位置と対応する位置にある前記比較元のデータを前記変数に代入するステップと、
前記比較元のデータがマークアップ言語により記述されたデータであり、選択された前記パターンにおける前記変数の位置と対応する位置にある前記比較元のデータが複数のノードを含むフラグメントである場合、前記フラグメントを前記変数に代入するステップと、
をコンピュータに実行させることを特徴とするプログラム。
【図1】
【図2】
【図3】
【図4(a)】
【図4(b)】
【図5】
【図6】
【図7】
【図8】
【図9】
【図10】
【図11】
【図12】
【図13】
【図14】
【図15】
【図16】
【図17】
【図2】
【図3】
【図4(a)】
【図4(b)】
【図5】
【図6】
【図7】
【図8】
【図9】
【図10】
【図11】
【図12】
【図13】
【図14】
【図15】
【図16】
【図17】
【公開番号】特開2009−223882(P2009−223882A)
【公開日】平成21年10月1日(2009.10.1)
【国際特許分類】
【出願番号】特願2009−34811(P2009−34811)
【出願日】平成21年2月18日(2009.2.18)
【出願人】(390024350)株式会社ジャストシステム (123)
【Fターム(参考)】
【公開日】平成21年10月1日(2009.10.1)
【国際特許分類】
【出願日】平成21年2月18日(2009.2.18)
【出願人】(390024350)株式会社ジャストシステム (123)
【Fターム(参考)】
[ Back to top ]