以下では、説明の便宜上、構造化文書(以下、単に「文書」とする)としてHTML言語で記述されたHTMLファイルであるとする。但し、XMLやその他の言語で記述された構造化文書に対して本発明を適用できることは言うまでもない。
図2には、本発明の第1の実施例に係る構造化文書処理システムの構成を模式的に示している。以下、同図を参照しながら、各ブロックについて説明する。
命令付与手段は、入力される文書内に、抽出命令、反復複写命令、挿入置換命令(以下では、これらをまとめて単に「各命令」とする)を埋め込む。各命令は、次のように記述される。
この例では、‘OUT’が抽出命令を、‘RP’が反復複写命令を、‘IN’が挿入置換命令を、それぞれ表すものとする。また、LABELは任意の文字列でよい。<!−−#OUTLABEL−−>を抽出命令開始タグ、<!−−#/OUT−−>を抽出命令終了タグと呼ぶ。同様に、<!−−#RP LABEL−−>及び<!−−#/RP−−>を反復複写命令開始タグ及び反復複写命令終了タグとし、<!−−#INLABEL−−>及び<!−−#/IN−−>を挿入置換命令開始タグ及び挿入置換命令終了タグとする。挿入置換命令開始タグと挿入置換命令終了タグの間には、何も書かなくてもよい。その場合には、文書合成処理以前には正しいHTMLファイルにならない場合もある。
本実施例では、抽出命令を付与した構造化文書を原料文書とする。第1の原料文書のHTMLファイルを以下に示す。
第1の原料文書を解析木の形式で表現すると図3のようになる。また、この第1の原料文書を標準的なHTMLブラウザに表示した結果は、図18に示した通りとなる。該原料文書に埋め込まれた抽出命令“OUT”は、このうち破線で囲まれた部分の取り出しを要求するものである。
また、第2の原料文書のHTMLファイルを以下に示す。
第2の原料文書を解析木の形式で表現すると図4のようになる。また、この第2の原料文書を標準的なHTMLブラウザに表示した結果は、図19に示した通りとなる。該原料文書に埋め込まれた抽出命令“OUT”は、このうち破線で囲まれた部分の取り出しを要求するものである。
また、本実施例では、反復複写命令“RP”と挿入置換命令“IN”を付与した構造化文書を雛型文書とする。本実施例において使用する第1の雛型文書のHTMLファイルを以下に示しておく。
第1の雛型文書を解析木の形式で表現すると図5のようになる。
また、本実施例において使用する第2の雛型文書のHTMLファイルを以下に示しておく。
第2の雛型文書を解析木の形式で表現すると図6のようになる。
雛型文書において、LABELは、抽出命令と、反復複写命令または挿入置換命令の対応を指定するのに用いる。
特定のLABEL引数が指定された抽出命令の数によって、同じラベルを有する反復複写命令の反復回数を定める。[数10]で示した第1の雛型文書の場合には、原料文書におけるLABEL引数「グループ」のみ反復複写される。これに対し、[数11]で示した第2の雛型文書の場合には、原料文書におけるLABEL引数「グループ」及び「サマリ」の双方が反復複写される。
また、特定のLABELが指定された抽出命令によって抽出された文書部品は、同じLABEL引数を有する挿入置換命令によって挿入又は置換挿入される。[数10]及び[数11]で示した各雛型文書の場合には、原料文書におけるLABEL引数「グループ」及び「サマリ」の双方に関して挿入又は置換挿入される。
また、すべてのLABEL文字列が同一であるときは、LABEL文字列を省略したのと同等の効果をもたらす。
本実施例において、各命令は、HTMLファイルの注釈(コメント文)として構成される。したがって、HTMLブラウザを始めとするHTMLを取り扱う標準的なアプリケーション上では、これら各命令は無視されるので、文書の内容を表示したり、処理するアプリケーションに対して実質的に影響を及ぼしたりしない。各命令は、後続の命令分離手段によって各HTMLで記述された文書から分離され、取り出される。
命令付与手段は、本実施例では、HTMLファイルを編集可能なエディタとして構成される。各命令は、単にHTMLファイル中に挿入された注釈タグなので、通常のテキスト・エディタあるいはHTMLエディタ上の編集作業を介して容易に付与することができる。例えば、ユーザは、テキスト・エディタを用いて、HTMLファイル中で取り出したい文書部品の前後それぞれに、抽出命令開始に相当する注釈タグ<!−−#OUTLABEL−−>、及び、抽出命令終了に相当する注釈タグ<!−−#/OUT−−>をマニュアルで挿入することによって、命令を付与することができる。以下、<!−−#OUTLABEL−−>を抽出命令開始タグと呼び、<!−−#/OUT−−>を抽出命令終了タグと呼ぶことにする。これら挿入される命令自体は、手続きの体裁をなしていないという点を充分理解されたい。なお、ここで用いられるテキスト・エディタは、一般的なエディタでよく、本明細書中ではこれ以上説明しない。
また、別の実現方法としては、計算機システム上で文書の構造を自動的に解析して、特定のマークアップで挟まれた文書部品の前後に、同様な各命令を挿入することも可能である。すなわち、特開平6−52161号公報(前述)において開示された方式を用いて構造を指定した検索を行ない、所望の文書部品の前後に所望の各命令の開始タグと終了タグを文書に流し込み合成を行なうことによっても、文書に対して命令を付与することができる。また、通常のテキスト処理によっても可能である。以下にperl言語のスクリプトで記述した例を示す(perlは米NetLabs社のLarry Wall氏が開発したインタプリタ言語であり、主としてUNIX(登録商標)系のオペレーティング・システム上で使用される)。
上記の例では、正規表現によるパターン・マッチを用いて文書部品の検索を行なう。前記スクリプトは、HTMLファイルを入力して、<TABLE>タグを検索してその直前に<!−−#OUTLABEL−−>を挿入するとともに、</TABLE>タグを検索してその直後に<!――#/OUT――>を挿入して、結果を出力する。
次いで、入力手段と出力手段について説明する。
入力手段は、ファイル名を指定して、ファイル・サーバからHTMLファイルを入力する。ファイル・サーバは例えばWWW(World Wide Web)サーバである。WWW空間上では、URLをHTMLファイルの名前としてアクセスすることができる。
入力手段は、ネットワークに接続されたWWWサーバにネットワーク・コネクションを構成しており、HTTPとして知られるプロトコルでHTMLファイルを転送する。すなわち入力手段は、HTMLファイル名を含むHTTPリクエストをWWWサーバに送信するとともに、WWWサーバからはHTMLファイルを含むHTTPレスポンスを受信する。より具体的には、所定のポート番号で待ち受けるWWWサーバに対して、TCP/IPコネクションを形成し、HTTPのリクエストを入力する。HTTPリクエストには、URLとして与えられたファイル識別子が含まれている。これに対し、WWWサーバは、URLに基づいて、HTMLファイルをローカルなファイル・システムから読み出すか、所定のプログラムを起動してHTMLファイルを合成するか、又は、他のWWWサーバからHTMLファイルを入力するかして、HTTPリクエストで指定されたURLに対するHTMLファイルを用意し、これをHTTPレスポンスに含めて入力手段に出力する。
このような入力手段の実装は、例えば米サンマイクロシステムズ社のJDK(Java(登録商標) Development Kit)に含まれる、java.net.URL、及び、Java.net.URLConnectionクラスの実装を用いればよい。
出力手段は、構造化文書をHTML形式に変換したものを、HTTPレスポンスの本体すなわちbody部として、ネットワークを経由して出力する。すなわち、本実施例の構造化文書処理システムは、クライアントからネットワークを経由して適当なリクエストを受信し、ファイル・サーバから原料文書と雛型文書を入力して処理を行ない、処理結果をレスポンスとしてクライアントに出力する構造化文書処理サーバとして実現される。特に、本実施例に係る構造化文書処理サーバは、HTTPリクエストを入力して所定の構造化文書の処理を行ない、HTTPレスポンスを出力するHTTPサーバとして実現する。
出力手段に送られる構造化文書は、該構造化文書の構文解析木とする。構文解析木については後述する。構文解析木をHTMLに変換するには、該構文解析木を深さ優先順に走査して、開始タグ、テキスト・コンテント、及び、終了タグを出力する。走査において訪れたノードがテキスト・コンテントを保持するノードである場合には、テキスト文字列を出力する。そうでなければ、開始タグ(例えばTABLEタグなら“<TABLE>”)を出力し、次に子ノードを順に走査し、各子ノードについて再帰的に開始タグと終了タグとテキスト・コンテントをHTMLとして出力する。子ノードの出力の後に、該ノードを上向きに訪れるときに終了タグ(例えばTBALEタグなら“</TABLE>”)を出力する。HTMLをHTTPレスポンスに含めて出力することは、通常のHTPPサーバの場合と同様なので、本明細書中ではこれ以上説明しない。また、HTTPリクエストを入力する部分については、本発明の要旨とは直接関係しないので、説明を省略する。このようなHTTPサーバの実現例としては、Apache WWWサーバがよく知られている。
次いで、解析手段と分離手段について説明する。
解析手段は、テキスト形式で記述されたHTMLファイルを入力し、HTMLの文法(構文)に従って解析し、構文解析木を構成するHTMLパーザである。本発明を実現する上で、従来技術と同様のHTMLパーザを利用することができるので、本明細書中では詳しく説明しない。(HTMLパーザの実現例については、Corporation for National Research Initiatives,「Python Library Reference Release 1.5.2」12.2節 htmllib−A parser for HTML documentsなどに記載されている。また、構文解析の方式については、A.V.エイホ他、コンパイラ1サイエンス社4章に詳述されている)。
本実施例で用いるHTMLパーザは、テキスト形式のHTMLファイルを入力すると、木構造のデータを出力する。木構造の各ノードはメモリに一時格納される。各ノードは、HTMLタグ名又は‘TEXT’をノード名として属性に持つ。この場合、各ノードがHTMLタグのマークアップ又はテキスト・コンテンツに対応する。また、HTMLタグの属性(Attribute)を属性に持つ。さらに子ノードへのポインタの配列を持つ。この配列は、第1の要素、第2の要素…の順に、第2子ノード、第2子ノード…へのポインタが格納される。解析木中の任意のノードを指定することで、該ノード以下のサブツリーが文書部品として定まる。(木構造の実現については、例えば「アルゴリズムとデータ構造」岩波書店、p.48〜p.54に詳解されている。)
第1の原料文書、第2の原料文書、第1の雛型文書、第2の雛型文書の構文解析木(以下、「文書解析木」と呼ぶ)は、それぞれ図3、図4、図5、図6に示してある通りである。
次いで、解析手段としてのHTMLパーザは、構文解析木を行きがけ順(prefix order)に巡回し、ノード名が注釈タグであって、注釈タグの中に記述されている注釈文字列が、次の規則のいずれかに該当するか否かを、文字列のパターン・マッチによって調べる。但し、「→」記号の左辺がパターンであり、右辺が各命令のいずれかである。また、<空白>は1以上の空白記号を意味し、<LABEL文字列>は、空白を含まない任意の文字列を意味するものとする(木構造を行きがけ順に巡回する方法については、例えば「アルゴリズムとデータ構造」岩波書店、p.52〜p.53に木構造の前順走査として記載されている)。
このようなパターン・マッチは、正規表現による文字列マッチを用いて実現可能である。Perl言語で利用可能なパターン・マッチによって各命令の開始タグと終了タグを抽出するプログラムの例を、以下に示しておく。
文書解析木中のアドレスは、文書部品のノードの位置を解析木のルート・ノードからのパスを示したベクトルによって表される。ベクトルの各要素はパス上に存在するノードに対応する。深さが3の位置にある文書部品のアドレスは、3次元のベクトルで表現され、ベクトルの各要素は、それぞれのノードの親に対して(長子を0と数えて、)何番目の子であるかを表す数とする。例えば、[0 1 2]というアドレス表現は、ルートの第2子の第3子に位置するノード以下のサブツリーで表される文書部品のアドレスである。所望のノードのアドレスが指定されれば、次のステップではルート・ノードから該所望のノードを対象ノードとする。
このような解析木のアドレス表現について、図5を参照しながら説明する。同図においては、反復複写命令[0 1 1 1]が付与された文書部品は、[0 1 1 2]のノード以下のサブツリーであり、第1の挿入置換命令[0 1 1 2 00]が付与された文書部品は、[0 1 1 2 0 1]のノード以下のサブツリーであり、第2の挿入置換命令[0 1 1 2 1 0]が付与された文書部品は、[0 1 1 2 1 1]のノード以下のサブツリーである。
文書部品IDは、文書部品を識別するためのもので、このIDを指定して文書部品を取り出すことができる。本実施例では、文書解析木IDと文書部品のアドレスの組で文書部品IDを表すものとする。文書解析木のIDは、例えば、構成した解析木の順に割り振った番号としてもよいし、文書解析木を格納したメモリ上のアドレスとして、例えば文書解析木のルート・ノードへのポインタでもよい。
次いで、命令分離手段について説明する。本実施例の命令分離手段は、文書解析木を行きがけ順に巡回し、各命令に対するオペコードと、ラベル文字列と、各命令が付与された文書部品のIDを前記オペコードに対するオペランドとする3項目からなる命令列を出力する。オペコードは、抽出命令はOUT、反復複写命令はRP、挿入置換命令はINとする。文書解析木のIDは、第1の原料文書を1、第2の原料文書を2、第1の雛型文書を3、第2の雛型文書を4とする。それぞれの文書から分離した命令列を以下に示す。
次いで、文書処理記述合成手段について説明する。文書処理記述合成手段は、複数の原料文書又は雛型文書から分離した命令列を入力し、命令列を併合し、順序の変更をし、変換と合成を行なって文書処理記述を出力する。
ここで、原料文書1と原料文書2と雛型文書1のそれぞれから分離した命令列から文書処理記述を構成する処理を例にとって、文書処理記述合成手段の動作について説明する。文書処理記述合成手段は、以下に示す処理A〜処理Cを順に行なう。
■処理A: OUTの計数
原料文書1と原料文書2のそれぞれから分離した命令列に含まれるOUTの個数をラベル文字列毎に数える。これは、以下に示すように、命令列を走査して、オペコードがOUTである命令について、ラベル文字列をキーとして、整数値を値とする連想配列をインクリメントすることで実現できる。走査が終了した後で、ラベル文字列をキーとしてOUT命令の個数をラベル文字列毎に取り出すことができる。
■処理B: RPによる各命令の複写
雛型文書1の命令列において、命令列中にRPが含まれていた場合、すべてのRPのオペランドの文書部品中に含まれるINとOUTとRPを、原料文書のOUT命令の数に従って複写する。この複写は1つの雛型文書について、以下に示す手順Step21〜Step26を実行することで行われる。
複写された命令以外のすべての命令について、オペランドの文書部品のアドレス(第3のアドレス)の先頭k−1個が一致し、且つ、k番目がAkより大きいものについて、アドレスの付け替えを行なう。
この付け替えは、反復複写によるアドレスのずれを補正する処理となる。複写した命令がRPの場合は、Step21で作成したRPリストに追加する。
■処理C: 命令の合成
すべての原料文書のOUTと、雛型文書のINとを、ラベル文字列が一致するものどうしでペアを構成して各ペアから新しい命令を合成する。この動作手順について以下に説明する。
本実施例では、例えば“OUT LABEL 文書部品1”と“IN LABEL 文書部品2”というペアから“FILL 文書部品1 文書部品2”を合成する。FILLは、文書部品1を文書部品2と置換する命令を表す。この動作によって原料文書に出現する文書部品の出現順に拘わらず、雛型文書の中のユーザが所望する位置に、前記原料文書の文書部品を置換又は挿入することが可能になる。
また、文書部品に含まれるコンテンツ、例えば「社員番号」を取り出して、社員番号順にOUT命令を整列してOUT配列を構成し、雛型文書中のIN命令の出現順に構成したIN配列に対応付けて、FILLを構成することも可能である。このように、原料文書のOUT命令で抽出される文書部品と、IN命令で指定される挿入置換の場所との対応付けは、ラベル文字列の対応付けや、コンテンツの内容による整列だけにとどまらず、さまざまな方法が実施可能である。例えば、テーブルを検索して、順序を決めることもできるし、どのようなサーバから得られた原料文書か(例えばホスト名)によって、挿入置換場所を変更することも可能である。この場合は、例えばIN命令のラベル文字列をホスト名にしておき、OUT命令のオペランドの文書IDと、ホスト名の対応表を基に、同様の処理をすることで実現できる。
これらの処理によって文書処理記述が合成される。文書処理記述の例を以下に示しておく。
上記の例では、1つのRP命令は、2つの連続する文書部品に付与されているので、RP命令のオペランドは2個指定されていることに注意する。また、FILL命令を合成するのではなく、文書部品を格納する一時領域を指定するラベルを用意することで、次のような文書合成記述を出力してもよい。
次に、インタプリタと、抽出手段と、反復複写手段と、挿入置換手段の動作について説明する。
上述した文書処理記述がインタプリタに入力されると、インタプリタは、文書処理記述の先頭から順に走査し、オペコードを判定して、抽出手段、反復複写手段、又は挿入置換手段のいずれかに、オペランドで指定された文書部品IDを入力する。OUT命令には抽出手段が、RP命令には反復複写手段が、IN命令には挿入置換手段が、それぞれ対応するものとする。挿入置換手段には、文書部品のIDに加えて、挿入または置換する文書部品を入力する。FILLの場合には、第1のオペランドで指定された文書部品IDが抽出手段に入力され、その結果として得られた文書部品と、第2のオペランドで指定された文書部品IDを挿入置換手段に入力する。
本実施例のインタプリタは、命令記述を読み込んで、各命令を1ステップ毎に順次解釈して所定の処理を実行する処理を行なうような通常のインタプリタでよい。かかるタイプのインタプリタの実現は当業界において既に周知なので、本明細書では説明を省略する(例えば、インタプリタの実現方法は、滝口政光、「作りながら学ぶコンパイラ/インタプリタ」(CQ出版株式会社)に詳しく説明されている)。本実施例では、文書処理記述内の命令ステップの順に、各オペコードに対して所定の処理手段が選択され、各処理手段にオペランドとして文書部品のIDが入力される。
抽出手段は、入力された文書部品のIDから、指定された文書解析木のノードを見つけて、コピーした文書部品を返す。コピーは該ノード以下のすべてのノードを行きがけ順に巡回し、ノード毎にコピーするものとする。コピーした文書部品は、メモリ上に格納されてポインタが返されるように実装してもよい.先の文書処理記述例3の一時格納領域として指定したtmpは、このようなコピーした文書部品を格納できるように実装してもよいし、前記ポインタであってもよい。
反復複写手段は、入力された文書部品のIDから、指定された文書解析木のノードを見つけて、該文書解析木上で反復複写する(反復複写した結果、アドレスがずれるノードがあるため、先の処理BのStep24で、オペランドに指定された文書部品のアドレスの付け替えを行なっていることに留意されたい)。
図7には、雛型文書1に対して、文書処理記述例1のRP命令で反復複写した結果の文書解析木の例を示している。また、図8には、雛型文書2に対して、文書処理記述例2のRP命令で反復複写した結果の文書解析木の例を示している。太枠で囲まれた部分が反復複写された部分を表している。
挿入置換手段には、挿入又は置換する第1の文書部品(又はそのID)に加えて、挿入置換をする個所を示す第2の文書部品のIDを入力する。入力された第2の文書部品のIDから、指定された文書解析木のノードを見つけて、前(兄ノード)又は後ろ(弟ノード)に、指定した第1の文書部品のノードを挿入する。置換動作の場合は、第2の文書部品として指定されたノードを削除して、その代りに指定した別の文書部品のノードを挿入する。第1又は第2の文書部品の代りに複数の文書部品を指定して、挿入又は置換するように実現してもよい。抽出手段、反復複写手段、挿入置換手段の各々は、上記のように単に文書解析木のツリー構造の変形や変換を行なうものであり、その実現は当業界において既に周知なので、本発明ではこれ以上説明しない(木構造に対する要素の挿入や削除については、例えば「アルゴリズムとデータ構造」(岩波書店)、2.4節に説明されている)。
インタプリタによって、文書処理記述が解釈され雛型文書から構成された解析木が処理され、文書が合成される。図9には、第1の原料文書と第2の原料文書と第1の雛型文書から合成した文書の解析木を示している。同図において、網掛けを付されたノードが、置換された文書部品に相当する。合成結果のHTMLファイルを以下に示しておく。
上記のHTMLファイルを標準的なHTMLブラウザで表示した結果を図20に示しておく。
同様に、第1の原料文書と第2の原料文書と第2の雛型文書から合成した文書のHTMLファイルを以下に示す。
上記のHTMLファイルを標準的なHTMLブラウザで表示した結果を図21に示しておくが、これは図20に示した文書の合成結果とは明らかに相違する。すなわち、同じ原料文書1及び原料文書2に対して本実施例に係る構造化文書処理を実行した場合であっても、適用した雛型文書が相違すれば合成文書も異なるという点を理解されたい。
以上説明したように、本実施例に係る構造化文書処理システムは、命令付与手段によって抽出命令が付与された第1の構造化文書と、同じく命令付与手段によって反復複写命令と挿入置換命令が付与された第2の構造化文書とを入力とし、解析手段によって文書毎に文書解析木を構成して、命令分離手段によって各文書から命令列を取り出し、取り出した複数の該命令列を文書処理記述合成手段によって併合、整列、及び変換を行なって文書処理記述を合成し、インタプリタによって文書処理記述を順に走査し、文書処理記述中に含まれる各命令に従って抽出手段によって第1の文書部品を第1の文書から抽出し、反復複写手段によって第2の構造化文書の文書部品を第1の文書部品の数に依存して定まる回数だけ反復複写し、挿入置換手段によって第2の構造化文書に第1の文書部品を挿入又は置換することで、構造化文書の合成を行なうことができる。
本実施例に係る構造化文書処理システムによれば、
1.原料文書の構造を変更した際に、これを処理するための別に管理されるスクリプトを用意しなくてよい。
2.構造が異なる複数の原料文書を混在させて文書部品を取り出すには、各文書毎に文書部品に抽出命令を付与することで行なうので、文書毎の抽出の処理を個別に指定しなくてよい。同様に、文書部品を挿入又は置換する処理の指定も不要である。また、ユーザは、文書の構造が変わる度に適切なスクリプトを指定する必要がない。
3.文書部品は、所望の命令を元の文書中に直接的に付与することと、取り出した文書部品と挿入置換される文書部品の条件を指定すること(例えばラベル文字列が一致するなど)によって作成することができる。また、各ユーザがそれぞれの目的に応じて雛型文書をデザイン(作成)したり、所望の処理を行なう命令が組み込まれた雛型文書を選択して、ユーザ自らが原料文書と組み合わせたりすることで、文書処理アプリケーションを構成することができる。このように手続き的でない、言い換えれば宣言的な方法で文書処理を構成することができるので、プログラミングの知識を充分に持たないユーザが広く文書処理を行なうことができる。すなわち、各ユーザがそれぞれの目的に合わせた構造化文書処理のアプリケーションを容易に作成できる文書処理システムが実現できる。
次いで、本発明の第2の実施例について説明する。
図10には、本発明の第2の実施例に係る構造化文書処理システムの構成を模式的に示している。本実施例では、抽出命令に代えて属性抽出命令が、挿入置換命令に代えて属性置換命令が、それぞれ付与された構造化文書に対して文書処理を実行するものである。以下、第1の実施例との相違点を中心に本実施例に関して説明する。
命令付与手段は、第1の実施例と同様に、HTMLエディタによって構成される。本実施例に係る命令付与手段は、入力される文書内に、抽出命令に代えて属性抽出命令を、挿入置換命令に代えて属性置換命令を、それぞれ埋め込む。各命令は、次のように記述される。
上記において、‘GET’が属性抽出命令を、‘PUT’が属性置換命令を、それぞれ表わすものとする。ここで、<!−−#GETLABEL タグ名−−>及び<!−−#/GET−−>をそれぞれ属性抽出命令開始タグ及び属性抽出命令終了タグとし、同様に、<!−−#PUT LABEL タグ名 属性名−−>及び<!−−#/PUT−−>をそれぞれ属性置換命令開始タグ及び属性置換命令終了タグとする。
属性抽出命令を付与したHTMLファイルの例を以下に示す。本明細書中では、該HTMLファイルを第3の原料文書とする。
この第3の原料文書を標準的なHTMLブラウザで表示した様子を図22に示しておく。
また、属性置換命令を付与したHTMLファイルの例を以下に示す。本明細書では、該HTMLファイルを第3の雛型文書とする。
命令付与手段及び入力手段の構成及び動作特性は上記した第1の実施例と略同一なので、ここでは説明を省略する。
解析手段についても第1の実施例と同様である。但し、本実施例に係る解析手段は、注釈タグについては以下の規則に従うか否かを解析する。
図11には第3の原料文書の解析木を、また、図12には第3の雛型文書の解析木をそれぞれ示している。
図11において、属性抽出命令[0 1 2]が付与された文書部品は[0 1 3]のノードである。同様に、図12において属性置換命令[0 1 30]が付与された文書部品は[0 1 3 1]のノードである。これら文書部品中において、属性抽出命令又は属性置換命令で指定されたタグ名のタグをそれぞれ属性抽出命令、属性置換命令の対象タグとする。本実施例では、属性抽出命令の対象タグは<A>タグであり、また、属性置換命令の対象タグは<AREA>タグである。文書部品中に複数の対象タグがあってもよい。対象タグの検索は、上記した第1の実施例の場合と同様に、ツリーを行きがけ順に巡回して行ない、引数で指定されたタグ名のタグを集めることができる。
命令分離手段もまた、第1の実施例のそれと略同一である。但し、第1の実施例とは相違して、オペコードは属性抽出命令であるGETと、属性挿入命令であるPUTとなる。また、属性抽出命令にはタグ名、属性挿入命令にはタグ名と属性名がそれぞれ該命令の引数として付与されているため、それらをオペランドとして出力する。
命令分離手段によって、第3の原料文書及び第3の雛型文書の各々から分離した命令列を以下に示す。但し、文書解析木のIDをそれぞれ5及び6とする。
文書処理記述合成手段は、複数の原料文書または雛型文書から分離した命令列を入力し、命令列を併合し、順序の変更をし、変換と合成を行なって文書処理記述を出力する。以下で説明する点を除いては、文書処理記述合成手段は第1の実施例と同様である。
■処理C:命令の合成
原料文書のGETと雛型文書のPUTのすべての組み合わせのうち、ラベル文字列が一致するものでペアを構成し、これらのペアから新しい命令を合成する。この動作手順について以下に説明する。
本実施例では、例えば“GET LABEL タグ名1 文書部品1”と“PUT LABEL タグ名2 属性名 文書部品2”というペアから“SUBST タグ名1 文書部品1 タグ名2 文書部品2 属性名”を合成する。SUBSTは、文書部品1に含まれるタグ名1のノードの属性フィールドから、属性名で指定した属性値を選択して、文書部品2に含まれるタグ名2のノードの属性フィールドに設定する命令である。この動作によって、雛型文書に含まれるタグの属性値を別のものに置き換えることが可能になる。属性値の置き換えは、タグ名が異なるペアであっても同じ名前の属性フィールドがあれば行なわれる。
上記の処理によって、第3の原料文書と第3の雛型文書とから合成される文書処理記述の例を以下に示しておく。
この命令は、文書5(図11を参照のこと)のノード[0 1 3]以下のAタグのHREF属性の値を文書6(図12を参照のこと)のノード[0 1 31]以下のAREAタグのHREF属性に設定することを指示するものである。
図11及び図12に示した例では、原料文書中の文書部品にGET命令が付与されている場合を対象としたが、本実施例に係る構造化文書処理システムは、GET命令が雛型文書中の文書部品に付与されている場合であっても同様の処理を実現することができる。その場合、前述した命令の合成処理のStep42において、GET命令の配列とPUT命令の配列を別個に作成して、GET命令の配列をStep41で作成した配列に追加すればよい。
また、上述では置換する属性名がただ1つの場合について説明したが、属性置換開始命令中に属性名を“,”記号で区切って複数記述することによって、複数の属性値を一度に置き換えるようにしてもよい。
次いで、インタプリタと属性抽出手段、及び属性置換手段の動作について説明する。
インタプリタの基本動作は第1の実施例のそれと略同一であるので、相違する点を中心に説明する。インタプリタは、入力された文書処理記述のオペコードがSUBSTであれば、オペランドで指定された文書部品1の文書部品IDとタグ名1を属性抽出手段へ入力する。また、文書部品2の文書部品IDとタグ名2、及び属性名を属性置換手段へ入力する。
属性抽出手段は、インタプリタから入力された文書部品IDから、指定された文書解析木のノードをアドレスに従って取り出す。そして、そのノード以下から、入力されたタグ名に一致する対象タグ1のノードを行きがけ順に探索して、最初に見つかったノードを返す。
属性置換手段は、インタプリタから入力された文書部品IDから、指定された文書解析木のノードをアドレスに従って取り出す。そして、そのノード以下のすべてのノードの中から、入力されたタグ名に一致する対象タグ2のノードを行きがけ順に探索する。そして、見つかった対象タグ2のノードの属性フィールドの中で、インタプリタから入力された属性名と一致するものの属性値を、対象タグ1の属性名のものの属性値で置き換える。対象タグ2が複数ある場合は、この置き換える処理を繰り返す。
また、前記Step46とStep47に代えて、以下のStep46aとStep47aとしてもよい。
Step46a:GET配列のm番目の要素として格納されたGET命令オペランド中のタグ名であるタグ名1と、文書部品IDである文書部品1を取り出す。文書部品1のノードから、解析木を行きがけ順に巡回して、タグ名1の対象タグ1を検索する。PUT配列のm番目の要素として格納されたPIT命令オペランド中のタグ名であるタグ名2と属性名と文書部品IDである文書部品2を取り出す。文書部品2のノードから、解析木を行きがけ順に巡回して、タグ名2の対象タグ2を検索する。
Step47a: 文書処理記述に次の命令を追加する。この例では、オペコードはSUBSTで、オペランドは、対象タグ1(の文書部品ID)、対象タグ2(の文書部品ID)、属性名である。
SUBST 対象タグ1 対象タグ2 属性名
上記の処理によって、第3の原料文書と、第3の雛型文書とから合成される別の文書処理記述例を示す。
この命令は、文書5(図11を参照のこと)のノード[0 1 2]の(Aタグの)HREF属性値を文書6(図12を参照のこと)のノード[0 1 31]の(AREAタグの)HREF属性に設定するものである。
インタプリタは、入力された文書処理記述のオペコードSUBSTのオペランドで指定された対象タグ1の文書部品IDと属性名を属性抽出手段へ入力する。また対象タグ2の文書部品IDと属性名を属性置換手段へ入力する。
属性抽出手段と属性置換手段は、入力された文書部品IDからアドレスに従って対象タグ1又は対象タグ2を取り出した後、対象タグ1の指定された属性名の属性値を取り出し、又は対象タグ2の属性値と置換する。
第3の原料文書と第3の雛型文書とから合成した結果のHTMLファイルを以下に示す。
また、第3の原料文書と第3の雛型文書とから合成した結果のHTMLファイルを標準的なHTMLブラウザで表示した様子を図23に示しておく。
第3の雛型文書の例では、表示される画像(チャート:images/chart.gif)の指定された座標位置(coords=0,20,200,85)をクリックすることにより、リンク先のページをたどっていくことができる。本実施例の文書処理によって、第3の雛型文書では指定されていなかったリンク先が第3の原料文書で指定されていたもの(http://sample.com)に置換されている。
次いで、本発明の第3の実施例について説明する。本実施例では、抽出命令に代えてパス名付き抽出命令が、反復複写命令に代えてパターン式付き反復複写命令が、挿入置換命令に代えてパターン式付き挿入置換命令が、それぞれ付与された構造化文書に対して文書処理を実行するものである。以下、第1の実施例との相違点を中心に本実施例に関して説明する。
命令付与手段は、第1の実施例と同様に、HTMLエディタによって構成される。本実施例に係る命令付与手段は、入力される文書内に、抽出命令に代えてパス名付き抽出命令を、反復複写命令に代えてパターン式付き反復複写命令を、挿入置換命令に代えてパターン式付き挿入置換命令を、それぞれ埋め込む。各命令は、次のように記述される。
入力手段、解析手段、及び命令分離手段の各々は第1の実施例と略同一である。但し、命令分離手段については、ラベル文字列の代りにパス名又はパターン式をオペランドとして抽出する。これは、上記第1の実施例において説明した正規表現による文字列マッチを用いて容易に実現可能であるので、ここでは詳しく説明しない。
本実施例では、第1の原料文書(図3を参照のこと)のラベル文字列の「グループ」及び「サマリ」に代えて、パス名として「月報/グループA」及び「月報/サマリA」にした構造化文書を第4の原料文書(原料文書4)として用いる。また、第2の原料文書(図4を参照のこと)のラベル文字列「グループ」及び「サマリ」に代えて、パス名「月報/グループB」及び「月報/サマリB」にした構造化文書を第5の原料文書(原料文書5)とする。また、第2の原料文書のラベル文字列「グループ」及び「サマリ」に代えて、パス名「月報/グループE」及び「月報/サマリE」にした構造化文書を第6の原料文書(原料文書6)とする。
本実施例では、パターン式は正規表現とする。
また、第1の雛型文書のラベル文字列の「グループ」及び「サマリ」に代えて、パターン式として「.*/グループ[A−D]」、「.*/サマリ[A−D]」にした構造化文書を第4の雛型文書(雛型文書4)とする。ここで言う正規表現「.*/グループ[A−D]」の意味は、任意の文字列(.*)の後に‘/グループ’が続き、次に、‘A’か‘B’か‘C’か‘D’のいずれかが続く文字列とマッチするパターンである。
命令分離手段によってそれぞれの文書から分離した命令列を以下に示す。
次いで、本実施例の文書処理記述合成手段について説明する。但し、本実施例では、ラベル文字列の一致に代えて、パス名とパターン式のパターン・マッチを行なう以外は、第1の実施例における文書処理記述合成手段と略同一の処理を行なう。ここでは、原料文書4と原料文書5と雛型文書4のそれぞれから分離した命令列から文書処理記述を構成する処理を例にとってその動作特性について説明することにする。
■処理A: OUTの計数
第1の実施例の処理Aで行なったOUTの計数は行なわない。
■処理B: RPによる各命令の複写
雛型文書1の命令列において、命令列中にRPが含まれていた場合、すべてのRPのオペランドの文書部品中に含まれるINとOUTとRPを、原料文書のOUT命令のうち、パス名とパターン式のパターン・マッチングを行なって、マッチが成功した個数に従って複写する。この複写は各1つの雛型文書について、次のStep51〜Step56を実行することで行なわれる。正規表現のパターン・マッチングは、例えば、UNIX(登録商標)上のgrepコマンド(周知)などを用いることで実現される。
パターン式「.*/グループ[A−D]」は、「月報/グループA」と「月報/グループB」とのパターン・マッチは成功するが、「月報/グループE」とのパターン・マッチは失敗する。したがって、上述の例では複写回数t=2となる。
■処理C:命令の合成
原料文書中のOUT命令と雛型文書中のIN命令とのすべての組み合わせのうち、パス名とパターン式のパターン・マッチングが成功するもの同士でペアを構成し、これらのペアから新しい命令を合成する。以下、この命令の合成動作について説明する。
本実施例では、例えば“OUT パス名 文書部品1”と“IN パターン式 文書部品2”というペアから“FILL 文書部品1 文書部品2”を合成する。FILLは、文書部品2を文書部品2と置換する命令を表す。この動作によって、原料文書に出現する文書部品の出現順にかかわらず、雛型文書の中でユーザが所望する任意の位置に、原料文書の文書部品を置換又は挿入することが可能になる。
上記の処理手順によって文書処理記述が合成される。合成された文書処理記述の例を以下に示す。
上述した例では、パターン・マッチに失敗したOUT命令のオペランドで指定された文書部品は、雛型文書に挿入又は置換が行なわれないことに留意されたい。
本実施例に係る構造化文書処理システムによって、原料文書4と原料文書5と原料文書6と雛型文書4から合成されるHTMLファイルを以下に示す。
図24には、上記のHTMLファイルを標準的なHTMLブラウザ上で表示した様子を示している。
本発明の第3の実施例は、第1の実施例と同様の作用効果を奏することができる。但し、ラベル文字列に代えてパターン式を用いたことにより、より柔軟で複雑な文書処理記述を合成することが可能となる点には充分理解されたい。
次いで、本発明の第4の実施例について説明する。本実施例は、文書処理記述合成手段と挿入置換手段に代えて、以下に説明する文書処理記述合成手段と挿入置換手段を有するという点で、上記の第3の実施例とは顕著に相違する。
本実施例における命令文書処理記述合成手段が実行する処理Cについて以下に説明する。
■処理C: 命令の合成
原料文書中のOUT命令と雛型文書中のIN命令とのすべての組み合わせのうち、パス名とパターン式のパターン・マッチングが成功するもの同士でペアを構成し、これらペアから新しい命令を合成する。以下、この命令の合成動作について説明する。
本実施例では、例えば“OUT パス名 文書部品1”と“IN パターン式 文書部品2”というペアから“FILL 文書部品1 文書部品2 パス名”を合成する。FILLは、文書部品2を文書部品2と置換する命令を表す。FILLは、文書部品1を文書部品2と置換する命令を表す。加えて、挿入置換命令開始タグと挿入置換命令終了タグを、抽出命令開始タグと抽出命令終了タグにそれぞれ置換する命令を表す。この動作によって原料文書に出現する文書部品の出現順にかかわらず、雛型文書中でユーザが所望する任意の位置に、原料文書の文書部品を置換又は挿入することが可能になる。加えて、処理をした結果合成された文書を入力とし、本実施例に係る構造化文書処理システムによって再び処理する際には、元の原料文書に含まれる文書部品を識別することが可能になる。
パス名は、原料文書から分離した抽出命令(IN命令)のオペランドから取り出したパス名文字列に加えて、所定の名前の環境変数やグローバル変数に代入されている文字列、あるいは、本実施例に係る構造化文書処理システムを起動した際に引数として引き渡される文字列を、適当な区切り文字で区切って付与してもよい。付与する前記文字列を履歴文字列と呼ぶ。上述した例では、区切り文字として“/”を用い、履歴文字列としてホスト名を与えている。但し、ホスト名は“総務部”とする。この処理によって合成された文書処理記述の例を示す。
次いで、インタプリタと挿入置換手段について説明する。
インタプリタは、文書処理記述のFILL命令を解釈して、挿入置換手段に、文書部品1と文書部品2とパス名を入力する。これ以外の点については実施例1のインタプリタと略同一である。
挿入置換手段は、文書部品2で指定されるIDの文書部品にもともと付与されている挿入置換命令である挿入置換命令開始タグと挿入置換命令終了タグを、それぞれ抽出命令開始タグと抽出命令終了タグに置き換える。また、インタプリタから入力されたパス名を抽出命令開始タグに付与する。この置き換え処理は、HTMLファイル中のそれぞれの注釈タグの注釈文字列を置き換えることによって容易に実現できる。この点以外は、上述した第1の実施例における挿入置換手段と略同一である。
本実施例に係る構造化文書処理システムによって、原料文書4と原料文書5と雛型文書4から合成されるHTMLファイルを以下に示す。
図25には、上記のHTMLファイルを標準的なHTMLブラウザ上で表示した様子を示している。
本発明の第4の実施例は、第1の実施例と同様の作用効果を奏することができるとともに、さらに、原料文書の抽出命令とパス名を合成結果の構造化文書の文書部品に継承して付与することができる。
本実施例に係る構造化文書処理システムを複数段接続してパイプラインを構成することによって、最初の構造化文書処理システムで出力された原料文書に含まれている文書部品は、2段目以降の構造化文書処理ではパス名を調べることで識別することができる。この機能によって、より柔軟で複雑な構造化文書処理を実現することが可能となる。
次いで、本発明の第5の実施例について説明する。
上述した第1の実施例では、構造化文書処理システムは、HTTPリクエストを入力して、所定の構造化文書の処理を行ない、合成した構造化文書をHTTPレスポンスとして出力するHTTPサーバとして構成される。これに対し、本実施例では、HTTPリクエストに処理起動記述が埋め込まれている。ここで言う処理起動記述は、原料文書のURLと雛型文書のURLの双方を含むものとする。
本実施例に係る構造化文書処理システムは、このような処理起動記述を解析して、原料文書のURLと雛型文書のURLとを取り出す処理起動記述解析手段をさらに具備している。そして、処理起動記述解析手段によって解析した結果として取り出されたURLに基づいて、入力手段により原料文書や雛型文書を入力して処理することができる。図13には、本実施例に係る構造化文書処理システムの構成を模式的に示している。以下、第1の実施例と相違する点を中心に該システムの構成及び動作特性について説明する。
処理起動記述は、HTTPリクエストに、構造化文書処理装置の原料文書のURLと、雛型文書のURLを埋め込むことで構成される。本実施例では、特に、HTTPリクエストに含まれているURL文字列中に、所定の文法形式で、原料文書のURLと雛型文書のURLが埋め込まれる。
HTTPリクエストのURL中に別のURLを埋め込んだものを「ヴァーチャルURL」と呼ぶ。すなわち、本実施例に係る処理起動記述はヴァーチャルURLとして構成される。なお、処理起動記述の文法と、該文法に従って埋め込む方法と取り出す方法に関しては、例えば、本出願人に既に譲渡されている特許第2746218号公報(特開平8−292910号)「資源管理装置および資源管理方法」に詳述されているので、必要であれば参照されたい。
処理起動記述解析手段は、HTTPリクエストを所定の文法形式に従って解析して、原料文書のURLと雛型文書のURLの各々を取り出す。構造化文書処理システムにおける処理起動記述解析手段以外の機能ブロックの構成及び動作特性は、第1の実施例と略同一である。
構造化文書処理サーバは、HTTPリクエストのURL中に原料文書のURLと雛型文書のURLを含んだ形式の処理起動記述を受け取って、この処理起動記述に指定された原料文書と雛型文書を入力して文書処理記述を合成して、さらに該文書処理記述を解釈して構造化文書処理を行なうことができる。
本実施例において利用される処理起動記述の例を以下に示す。
上記に示した処理起動記述の例では、雛型文書のURLは、文字列“template=”以降で、次の“&”の前までに埋め込まれている。元々のURLに含まれていた“:”と“/”は、それぞれ“%3A”と“%2F”にエンドコードされ変換されている。また、原料文書1と原料文書2に関するURLについても同様に、それぞれ文字列“file1=”以降から次の“&”の前まで、並びに、文字列“file2=”以降に埋め込まれている。
特許第2746218号公報に示すようなURLの表記方式によれば、2段階に構造化文書処理サーバを起動するヴァーチャルURLを階層的に構成することができる。例えば、原料文書や雛型文書は既に他の構造化文書処理サーバで処理した結果であってもよい。但し、この場合の原料文書や雛型文書のURLは、第2の構造化文書処理サーバのURLに基づくヴァーチャルURLである。
図14には、上述したような第2の処理起動記述によって起動される処理の流れを示している。
第2の構造化文書処理サーバ(server2)には、雛型文書2(Template2.html)を用いて原料文書3を処理する旨のHTTPリクエストが入力される。このHTTPリクエストはヴァーチャルURLを用いて記述される。
雛型文書2(Template2.html)は、WWWサーバ(host3)によって提供されており、通常のURL表記“http://host3/Template2.html”によって指定される。
他方、原料文書3は、第1の構造化文書処理サーバ(server1)によって処理された結果である。より具体的には、該処理結果とは、WWWサーバ(host1)の資源である原料文書1(Sample1.html)と、WWWサーバ(host2)の資源である原料文書2(Sample2.html)とを、WWWサーバ(host3)の資源である雛型文書1(Template1.html)を用いて処理したものである。
したがって、第1の構造化文書処理サーバは、原料文書1、原料文書2、及び雛型文書1を各WWWサーバから入力して、その処理結果である原料文書3を第2の構造化文書処理サーバに渡す。
次いで、第2の構造化文書処理サーバは、さらにWWWサーバ(host3)から原料文書2を入力して、原料文書3を処理して、この処理結果である構造化文書をHTTPレスポンスとして要求元に返す。
図13に示したような構造化文書処理システムによれば、分散的に文書処理命令を管理し処理することができる。したがって、文書の改定や処理システムの変更に対して、より柔軟な文書処理を提供することができる。文書を処理するサーバをモジュールとして取り扱うことができるので、原料文書や雛形文書と文書処理モジュールを文書処理記述上で組み合わせることで、エンド・ユーザが容易にカストマイズすることができる柔軟な文書処理システムを構築することができる。
次いで、本発明の第6の実施例について説明する。
本実施例は、上記第5の実施例に係る第1の構造化文書処理サーバ及び第2の構造化文書処理サーバが、単一のデータベースを共有する構成を備えているものである。
データベースには、識別子としてURL又は処理起動記述をキーとして、このURL又は処理起動記述に対応する構造化文書の解析木が格納されている。したがって、URL又は処理起動記述を指定することで、所望の構文解析木を取り出すことができる。このようなデータベースは、URL又は処理起動記述から適当なハッシュ値を計算し、解析木を実現するデータへのポインタを格納したハッシュ法による表の探索で実現できる(ハッシュ法については、例えば「岩波書店アルゴリズムとデータ構造」2.7節 p123−137に詳述されている)。
図15には、本実施例に係る第1の合成サーバの機能ブロック図を示している。本実施例においては、第2の(すなわち後続の)合成サーバは、第1の合成サーバと略同一の構成及び動作特性を有するものと理解されたい。
第1の合成サーバは、HTTPリクエストを入力して、所定の構造化文書の処理を行ない、合成した構造化文書をHTTPレスポンスとして出力するHTTPサーバとして実現されている。本実施例は、以下の2点を除き、第1の実施例と略同一である。
(1)抽出手段、反復複写手段、並びに置換挿入手段は、解析手段から構文解析木を入力する代わりに、切り替え手段を経由して構文解析木を入力する。
(2)切り替え手段は、システムの状態を調べて、解析手段から構文解析木を入力するか、又は、保持手段から構文解析木を入力するかを切り替える。
システムの状態は、例えば、処理中の処理起動記述をキーとして、保持手段の中に該当する構文解析木があるかどうかを調べることで判定できる。
保持手段に該当する構文解析木が格納されていれば、改めて構造文書を解析する必要はないので、保持手段から構文解析木を入力するように切り替える。この場合、構文解析木は、図15中の記号(い)で示された一点破線の矢印方向に従って処理される。
他方、保持手段に該当する構文解析木が格納されていない場合には、切り替え手段は、解析手段から新たに構文解析木を入力するように切り替える。この場合、図15中の記号(ろ)で示された一点破線の矢印方向に従って、入出力が行なわれる。
本実施例に係る構造化文書処理システムの構成によれば、第1の合成サーバで処理した結果は、構文解析木のまま第2(後続)の合成サーバに入力することができる。したがって、出力手段による構造化文書のHTMLへの変換と、解析手段によるHTMLの解析という2つの処理を省略することができる。
また、第1の合成サーバにおいて一旦計算した結果は保持手段に格納されるので、第2の合成サーバが第1の合成サーバに処理起動記述を入力して第1の合成サーバが改めて処理を行なう代わりに、既に計算されている前記処理起動記述に対応する構文解析木を利用することで、第1の合成サーバでの計算や合成処理を省略することができる。
したがって、従来に比べ処理性能の優れた効率的な分散文書処理を実現することができる。
次いで、本発明の第7の実施例について説明する。
図16には、本発明の第7の実施例に係る構造化文書処理システムの構成を模式的に示している。本実施例は、上述した第2の実施例の構成に対して、第5の実施例に係る処理起動記述解析手段をさらに追加したものである。
第2の実施例では、属性抽出命令及び属性置換命令がそれぞれ指定していた文書部品の間で属性置換を行なっていた。これに対し、本実施例では、属性抽出命令が文書部品ではなく手続き名を指定する。属性置換命令は、指定した文書部品の属性を、属性抽出命令で指定された手続きで変換したものに置き換える。処理起動記述解析手段については第5の実施例のそれと略同一であるので、以下では第2の実施例との相違点を中心に説明することにする。
本実施例では、属性抽出命令を以下のような形式で記述する。
第2の実施例の場合とは相違し、属性抽出命令には置換する対象のタグ名を指定する必要がなく、開始タグと終了タグの間に文書部品を挟む必要もない。属性置換命令は、第2の実施例と同一である。
属性抽出命令を付与したHTMLファイルを第4の原料文書とし、以下に示す。
解析手段は、注釈タグが以下の規則に従うかを解析する。
属性抽出命令には対象タグがないので、文書部品から対象タグを探す処理も行なわない。
命令分離手段も第2の実施例と同様であるが、属性抽出命令にはタグ名ではなく手続き名が引数として付与されているため、これをオペランドとして出力する。命令分離手段によって第4の原料文書から分離した命令列を以下に示す。
文書処理記述合成手段は、処理Cすなわち命令の合成において、第2の実施例と相違する。文書処理記述合成手段は、属性抽出命令と属性置換命令とのペアから新しい命令を合成するが、例えば、“GET LABEL 手続き名”と“PUT LABEL タグ名 属性名 文書部品”のペアから、“SUBST 手続き名 タグ名 文書部品 属性名”を合成する。SUBSTは、文書部品に含まれるタグ名のノードの属性フィールドから属性名で指定した属性値を選択して、手続き名で指定した手続きで属性値を変換する命令である。
処理手順は、Step46以降が第2の実施例とは相違し、以下の通りとなる。
上記の処理によって、第4の原料文書と第3の雛型文書とから合成される文書処理記述例を以下に示す。
この命令は、文書6のノード[0 1 3 1]以下のAREAタグのHREF属性の値をProc1で変換したものに置き換えることを指示するものである。
インタプリタは、SUBST命令を属性置換手段に入力する。本実施例の属性置換手段の動作は、第2の実施例のそれとは異なり、SUBST命令を解釈して次のように動作する。すなわち、対象タグのHREF属性の属性値を第1の引数として、手続きProc1を呼び出して、Proc1の返り値として得られた文字列を新たなHREF属性として対象タグに設定する。但し、手続きの呼び出しは普通に知られる手続き呼び出し(サブルーチン・コール)であり、HREF属性の取り出しやHREF属性の設定は通常の文字列の分離又は結合である。
属性値を変換する手続きとしては、例えば次のようなものが考えられる。属性置換命令を付与した文書部品が属性値フィールドにURLを設定できる種類のタグのノードを含んでいる場合には、そのURL文字列を第5の実施例で説明した処理起動記述(ヴァーチャルURL)に変換する。例えば、元のURLに設定されている雛型文書と文書を特定する文字列を解析し、それらを元に新たな処理起動記述を合成して返すような手続きである。このようなURL文字列は、手続きの引数として受け渡される。
ここで、変換前のURLの記述例と変換後の処理起動記述の例を示す。但し、この例では、処理起動記述解析手段に入力された処理起動記述が含んでいる原料文書のうち2番目のものを、新たに合成する処理起動記述に含める原料文書とする。また、新たに合成する処理起動記述に含める雛型文書は、入力された処理起動記述が含んでいる雛型文書とは別のものにする。
また、手続きの別の例として、新たに処理起動記述を合成するのではなく、元の処理起動記述に含まれる原料文書のURLをそのまま返すようなものも考えられる。
変換前のURLの記述例と変換後の処理起動記述の例を以下に示す。但し、処理起動記述解析手段に入力された処理起動記述が含んでいる原料文書のうちの最初のものを原料文書とする。
上記の例で示した変換前のURLは、ここで定義した独自の記述方法である。変換前のURLは、第3の雛型文書の例ではAREAタグのHREF属性値として設定すればよい。
また、手続きの引数としてOSのシステム・コールを用いて得られる日時やシステムの状態変数などを利用するようにしてもよい。
次いで、本発明の第8の実施例について説明する。
図17には、本発明の第8の実施例に係る構造化文書処理システムの構成を模式的に示している。本実施例は、上述した第6の実施例の構成に対して、処理起動記述合成手段と、エラー通知文書合成手段をさらに追加したものである。
本実施例の命令分離手段は、第1の実施例に係る命令分離手段が有する動作に加え、命令列を抽出する際に検出される命令の文法的なエラーを検出して、エラー情報をエラー通知文書合成手段に入力するようになっている。ここで言うエラー情報は、エラーの種類やエラーの検出された文書中の位置(行数)など、通常のエラー処理でよく扱われるものとする(命令分離手段におけるエラーの検出やエラー処理の実現方法については、例えば、岩波講座ソフトウェア科学5「プログラミング言語処理系」(岩波書店)のP89,P123−125,206−208に詳解されている)。
また、本実施例の出力手段は、第1の実施例に係る出力手段が持つ機能に加えて、処理起動記述合成手段によって合成された処理起動記述を、出力結果としてのHTML形式文書に挿入するように動作するようになっている。この動作手順について以下に説明する。
エラー通知文書合成手段は、エラー情報を入力して、エラー通知を行なう文書を合成する。エラー情報は例えばエラー番号とし、エラー文書はエラー番号をファイル名とするファイルとする。エラー通知文書合成手段は、命令解析手段から入力されたエラー番号をファイル名とみなして、ファイルからエラー通知文書の1つを入力する。入力された文書は、解析手段を用いて構文解析木が作られる。構文解析木を作る動作は、第1の実施例の場合と同様である。構文解析木は後述するように保持手段に保持されるが、必ずしも構文解析木を作る必要はなく、文字列情報のまま保持手段に保持してもよい。例えば、エラー番号1は、抽出命令開始タグと抽出命令終了タグの対応がとれないエラーであるとし、エラー通知文書のファイル名はファイル1.htmlとする。ファイルの例を示す。
処理起動記述合成手段は、エラー通知ページをアクセスするためのURLを合成する。例えば、この文書処理を行なった合成サーバが“server”であって、文書処理を行なったプロセスのプロセス番号が12345番であったとすると、以下に示すようにプロセス番号を含むURLを合成する。
次いで、本実施例の出力手段の動作について、第1の実施例との相違点を中心に説明する。例えば、上述したような処理起動記述が入力されると、文字列<META USERLOG=“http://server/HTMLTools?method=userlog&pid=12345”>を合成して、出力されるHTML形式の文書に挿入する。このような挿入は、通常知られる単純な文字列合成や文字列挿入処理である。挿入された結果のHTML形式の文書の一部(例7−A)を以下に例示しておく。
また、別の文字列を合成して挿入した例7−Bを以下に示す。
エラー通知文書合成手段で合成されたエラー通知文書は、処理起動記述合成手段で合成されたURLをキー情報として、保持手段に格納され保持される。この保持手段に文書を格納する動作は第6の実施例とは相違する。
上述した第6の実施例では、WWWクライアントからのリクエストすなわちHTTPリクエストとして、第1の処理起動記述が与えられる。次いで、処理起動記述処理が行なわれ、処理結果として合成された文書が第1の処理起動記述をキーとして保持手段に格納される。これに対し、本実施例では、後のエラー通知文書を得るための第2の処理起動記述を、エラー通知文書のリクエストに先行して合成サーバ側で合成し、(実際のリクエストが入力されるより前に)保持手段に格納するように動作するようになっている。
合成サーバserverにおいて文書処理を実行した際にエラーが発生した場合を例にとって以下に説明してみる。
上述した例7−Aのタイプの場合には、利用者は、serverから出力されるHTTPレスポンスによって送信されるHTML形式の文書の内容からUSERLOG属性を有するMETAタグを検索して、エラー通知文書の処理起動記述に相当するURLを得る。利用者は、このURLを含む第2のHTTPリクエストをserverに送信する。合成サーバは、処理起動記述解析手段によりHTTPリクエストに含まれる処理起動記述を取り出し、これをキーとして保持手段から文書を検索し、エラー通知文書を得る。それ以降は、第1の実施例の場合と同様の動作手順を実行して、新たなHTTPレスポンスとしてエラー通知文書を出力する。
エラー通知文書を雛型文書として取り扱えば、適当な文書処理が行なわれて、出力される。この場合、エラーが発生した位置(行数)やエラーが発生した文書のIDなどを挿入することが考えられる。このような文書処理に対する引数(入力パラメータ)は、CGI(Common Gateway Interface)として当業界において広く知られているHTTPサーバに対するURLの記述方法に従って文書処理記述中に含めることができる。
また、例7−Bに示すようなタイプの場合には、URLを含む第2のHTTPリクエストを自動的に送信するスクリプト記述(例えばJavaScript言語)をserverが出力する(第1の)HTTPレスポンスによって送信されるHTML文書中に挿入することで、人手の介入をすることなく自動的にエラー通知文書を得ることができる。例えば、WWWブラウザ側では、第1のHTTPレスポンスを受信すると、HTML形式の文書に含まれるスクリプトを実行する。そのスクリプトは、前記処理起動記述をserverに送って得られるエラー通知文書を、所定のウィンドウを開いて表示するものとなっている。それ以外の動作は、例7−Aと略同一であると理解されたい。
要言すれば、本実施例の構成では文書処理の途中で発生したエラーを、文書処理の合成結果とは別にして利用者に通知することができる。したがって、高度で柔軟な文書処理アプリケーションを構成できる。さらに、エラーが発生した時点でエラー通知文書を生成して、文書処理の結果を一時的に格納する保持手段に(エラー通知文書のリクエストに先行して)格納し、後のエラー通知文書の要求に対して出力するように動作することができる。このため、エラーを発生したプロセスとエラーの種類やエラーに関する情報を対応付けて保持するような機構を用意する必要がなくなる。