図1は、本発明の第一の実施形態であるスキーマ変換装置100の概略図である。
スキーマ変換装置100は、記憶部110と、制御部120と、入力部130と、出力部140と、通信部150と、を備える。
記憶部110は、スキーマリポジトリ記憶領域111と、設定情報記憶領域112と、オリジナルスキーマ記憶領域113と、サンプルデータ記憶領域114と、制限候補情報記憶領域115と、変換後スキーマ記憶領域116と、を備える。
スキーマリポジトリ記憶領域111には、スキーマ変換装置100で使用するスキーマ文書を管理する情報と、当該スキーマ文書と、が記憶される。
例えば、本実施形態においては、図2(スキーマ文書管理テーブル111aの概略図)に示すようなスキーマ文書管理テーブル111aと、当該スキーマ文書管理テーブル111aで管理されているスキーマ文書(図示せず)と、がスキーマリポジトリ記憶領域111に記憶される。
図2に示すように、スキーマ文書管理テーブル111aは、ID欄111bと、対象名前空間URI欄111cと、ロケーション欄111dと、を備える。
ID欄111bには、各々のレコードで管理される各々のスキーマ文書を一意に識別するための識別情報(ID)が格納される。
対象名前空間URI欄111cには、スキーマリポジトリ記憶領域111に記憶されているスキーマ文書の対象名前空間URI(Uniform Resource Identifiers)を特定する情報が格納される。
ロケーション欄111dには、スキーマリポジトリ記憶領域111に記憶されているスキーマ文書の所在を特定する情報が格納される。このような所在については、例えば、ファイルシステムにおけるパスやURL(Uniform Resource Locator)を用いて記述することができる。
図1に戻り、設定情報記憶領域112には、オリジナルスキーマに対して、制約条件の変更を許可する項目を特定する情報が記憶される。
例えば、本実施形態においては、図3(設定情報テーブル112aの概略図)に示すような設定情報テーブル112aが設定情報記憶領域112に記憶される。
設定情報テーブル112aは、ID欄112bと、要素宣言ID欄112cと、制約条件の種別欄112dと、を有する。
ID欄112bには、各々のレコードで特定される項目を一意に識別するための識別情報(ID)が格納される。
要素宣言ID欄112cには、要素宣言を一意に識別するための識別情報である要素宣言IDが格納される。ここで、後述のように、本実施形態におけるオリジナルスキーマ113aでは、全ての要素宣言が異なるname属性の値を持つため、name属性の値を要素宣言IDとして用いているが、このような態様に限定されるわけではなく、例えば、XPath等により特定することも可能である。
制約条件の種別欄112dには、制限しようとする制約条件の種別を特定する情報が格納される。
図1に戻り、オリジナルスキーマ記憶領域113には、スキーマ変換装置100で変換の対象となるスキーマであるオリジナルスキーマが記憶される。
例えば、本実施形態においては、図4(オリジナルスキーマ113aの概略図)に示すようなオリジナルスキーマ113aがオリジナルスキーマ記憶領域113に記憶される。
なお、図4の向かって左端の数字は、行数を示すためのメモリであり、オリジナルスキーマ113aを構成するものではない。
ここで、オリジナルスキーマ113aは、スキーマ変換装置100のオペレータが作成したものを、入力部130等を介して入力を受け付けてもよいし、業界標準などで定められたスキーマ文書を取得して利用してもよい。
また、オリジナルスキーマは、Webサービスのインターフェースを記述したWSDL(Web Services Description Language)の内部に記述されていたり、WSDLから参照されたりしていることもある。
さらに、オリジナルスキーマはスキーマリポジトリ記憶領域111から取得してもよい。
サンプルデータ記憶領域114には、オリジナルスキーマを変換する際に使用するサンプルデータが記憶される。
例えば、本実施形態においては、図5(サンプルデータ114aの概略図)に示すようなサンプルデータ114aがサンプルデータ記憶領域114に記憶される。
なお、図5の向かって左端の数字は、行数を示すためのメモリであり、サンプルデータ114aを構成するものではない。
ここで、サンプルデータ114aは、例えば、開発時のテストデータなどを利用してもよい。
なお、サンプルデータの数については、任意に設定可能である。
図1に戻り、制限候補情報記憶領域115には、各々のオリジナルスキーマに対して、サンプルデータから取得された、より厳しい制限を課す項目と、制約条件と、を特定する情報が記憶される。
例えば、本実施形態においては、図6(第一制限候補テーブル115aの概略図)に示すような第一制限候補テーブル115aと、図7(第二制限候補テーブル115gの概略図)に示すような第二制限候補テーブル115gと、がオリジナルスキーマ毎に制限候補情報記憶領域115に記憶される。
ここで、第一制限候補テーブル115aには、要素のテキストデータを制限するための制約条件を特定する情報が格納され、第二制限候補テーブル115gには、要素の子要素を制限するための制約条件を特定するための情報が格納される。
なお、第一制限候補テーブル115a及び第二制限候補テーブル115gは、初期状態においては、情報は格納されておらず、後述する制限候補情報更新部124がサンプルデータ及びオリジナルスキーマの解析を行うことにより情報が格納される。
図6に示すように、第一制限候補テーブル115aは、ID欄115bと、要素宣言ID欄115cと、制約条件の種別欄115dと、制約条件の候補欄115eと、を有する。
ID欄115bには、各々のレコードで特定される項目及び制約条件を識別するための識別情報(ID)が格納される。
要素宣言ID欄115cには、要素宣言を一意に識別するための識別情報である要素宣言IDが格納される。
制約条件の種別欄115dには、制限しようとする制約条件の種別を特定する情報が格納される。
制約条件の候補欄115eには、制限しようとする制約条件の候補を特定する情報が格納される。
図7に示すように、第二制限候補テーブル115gは、ID欄115hと、要素宣言ID欄115iと、制約条件の種別欄115kと、制約条件の候補欄115lと、を有する。
ID欄115hには、各々のレコードで特定される項目及び制約条件を識別するための識別情報(ID)が格納される。
要素宣言ID欄115iには、要素宣言を一意に識別するための識別情報である要素宣言IDが格納される。
パーティクルID欄115jには、要素宣言ID欄115iで特定される要素宣言内のパーティクルであって、制限しようとするパーティクルを一意に識別するための識別情報であるパーティクルIDが格納される。
ここで、パーティクルとは、要素宣言の内容モデルの構成要素のことであり、具体的にはsequence要素、choice要素、element要素、any要素等がパーティクルに含まれる。
制約条件の種別欄115kには、制限しようとする制約条件の種別を特定する情報が格納される。
制約条件の候補欄115lには、制限しようとする制約条件の候補を特定する情報が格納される。
図1に戻り、変換後スキーマ記憶領域116には、オリジナルスキーマ113aを後述したスキーマ変換部125で変換した変換後スキーマが記憶される。
例えば、本実施形態においては、図8(変換後スキーマ116aの概略図)に示すような変換後スキーマ116aが変換後スキーマ記憶領域116に記憶される。
なお、図8の向かって左端の数字は、行数を示すためのメモリであり、変換後スキーマ116aを構成するものではない。
図1に戻り、制御部120は、全体制御部121と、スキーマ検証部122と、探索部123と、制限候補情報更新部124と、スキーマ変換部125と、を備える。
全体制御部121は、スキーマ変換装置100における処理の全体を制御する。
特に、本実施形態においては、全体制御部121は、スキーマリポジトリ記憶領域111、設定情報記憶領域112、オリジナルスキーマ記憶領域113、サンプルデータ記憶領域114に記憶する情報の管理を行う。例えば、入力部130や通信部150を介して、これらの記憶領域に記憶する情報を取得し、取得した情報を各々の対応する記憶領域に記憶等する処理を行う。
スキーマ検証部122は、検証対象となっているXML文書が、スキーマ文書に対して妥当か否かを検証する。
特に、本実施形態においては、スキーマ検証部122は、サンプルデータ記憶領域114に記憶されているサンプルデータ114aが、オリジナルスキーマ記憶領域113に記憶されているオリジナルスキーマ113aに対して妥当か否かの検証を行う。
探索部123は、探索の対象となるXML文書(サンプルデータ114a)を探索し、当該XML文書(サンプルデータ114a)に記述されている各々の要素を特定する。
ここで、本実施形態においては、探索部123は、探索の対象となるXML文書(サンプルデータ114a)を深さ優先で探索し、帰りがけ順で要素を特定して、当該帰りがけ順で特定した要素に含まれる情報を制限候補情報更新部124に出力する。
制限候補情報更新部124は、探索部123より取得した要素より、当該要素に対応する要素宣言に含まれる情報をオリジナルスキーマ113aから抽出して、当該要素に含まれる情報が妥当と判断されるように、より厳しい制約条件があるか否かを判断して、より厳しい制約条件のうち最も厳しい制約条件を制限候補として制限候補情報記憶領域115に記憶する処理を行う。
スキーマ変換部125は、制限候補情報記憶領域115に記憶されている制限候補が、設定情報記憶領域112に記憶されている設定情報で制限が許可されているものか否かを判断し、制限が許可されている制限候補をオリジナルスキーマ113aに適用することで、スキーマの変換を行い、変換後スキーマを生成する。
なお、このようにして生成された変換後スキーマは、変換後スキーマ記憶領域116に記憶される。
入力部130は、情報の入力を受け付ける。
出力部140は、情報を出力する。
通信部150は、ネットワーク(図示せず)を介して情報を送受信する。
以上に記載したスキーマ変換装置100は、例えば、図9(コンピュータ200の概略図)に示すような、CPU(Central Processing Unit)901と、メモリ902と、HDD(Hard Disk Drive)等の外部記憶装置903と、CD−ROM(Compact Disk Read Only Memory)やDVD−ROM(Digital Versatile Disk Read Only Memory)等の可搬性を有する記憶媒体904に対して情報を読み書きする読書装置905と、キーボードやマウスなどの入力装置906と、ディスプレイなどの出力装置907と、通信ネットワークに接続するためのNIC(Network Interface Card)等の通信装置908と、を備えた一般的なコンピュータ900で実現できる。
例えば、記憶部110は、CPU901がメモリ902又は外部記憶装置903を利用することにより実現可能であり、制御部120は、外部記憶装置903に記憶されている所定のプログラムをメモリ902にロードしてCPU901で実行することで実現可能であり、入力部130は、CPU901が入力装置906を利用することで実現可能であり、出力部140は、CPU901が出力装置907を利用することで実現可能であり、通信部150は、CPU901が通信装置908を利用することで実現可能である。
この所定のプログラムは、読書装置905を介して記憶媒体904から、あるいは、通信装置908を介してネットワークから、外部記憶装置903にダウンロードされ、それから、メモリ902上にロードされてCPU901により実行されるようにしてもよい。また、読書装置905を介して記憶媒体904から、あるいは、通信装置908を介してネットワークから、メモリ902上に直接ロードされ、CPU901により実行されるようにしてもよい。
図10は、スキーマ変換装置100における全体の処理を示すフローチャートである。
まず、全体制御部121は、オリジナルスキーマ記憶領域113に記憶されているオリジナルスキーマ及びサンプルデータ記憶領域114に記憶されているサンプルデータを取得する(S10)。ここで、オリジナルスキーマに使用するサンプルデータが複数ある場合には、ステップS10において複数のサンプルデータを取得する。
次に、全体制御部121は、ステップS10で取得したサンプルデータからステップS14の制限候補の探索を未だ行っていないサンプルデータを一つ抽出して、スキーマ検証部122に入力するとともに(S11)、ステップS10で取得したオリジナルスキーマをスキーマ検証部122に入力する。
次に、スキーマ検証部122は、ステップS11で入力されたサンプルデータが、入力されたスキーマに対して妥当か否かを判断する(S12)。ここで、スキーマ検証部122での処理は、一般的なXMLパーサなどで実現されているものと同様である。
そして、サンプルデータがスキーマに対して妥当ではない場合には(ステップS12でNo)ステップS13に進み、サンプルデータがスキーマに対して妥当である場合には(ステップS12でYes)ステップS14に進む。
ステップS13では、スキーマ検証部122は、予め定められたエラーメッセージを出力部140に表示し、処理を終了する。
一方、ステップS14では、スキーマ検証部122は、全体制御部121より入力されたサンプルデータとオリジナルスキーマとを探索部123及び制限候補情報更新部124に入力して、探索部123及び制限候補情報更新部124は、制限候補情報を更新する処理を行う。なお、ステップS14での処理の詳細は、後述する。
次に、全体制御部121は、ステップS10で取得したサンプルデータのうち、ステップS14の制限候補の探索を未だ行っていないサンプルデータがあるか否かを判断し(S15)、ある場合には(ステップS15でYes)ステップS11に戻り処理を繰り返し、ない場合には(ステップS15でNo)ステップS16に進む。
ステップS16では、制限候補情報更新部124は、設定情報記憶領域112に記憶されている設定情報を取得して、制限候補情報記憶領域115に記憶されている制限候補のうち、設定情報において制限が許可されていないものを削除することで、制限候補の更新を行う。
具体的には、制限候補情報更新部124は、設定情報記憶領域112に記憶されている設定情報テーブル112aを取得して、制限候補情報記憶領域115に記憶されている第一制限候補テーブル115a及び第二制限候補テーブル115gの各々のレコードのうち、制限候補テーブル112aで制限が許可されていないものを削除する。
ここで、制限候補テーブル112aでは、ID欄112bが「1」のレコードにおいて、要素宣言ID欄112cが「Telephone」で、制約条件の種別欄112dが「基底型」のレコードについては、制約条件の制限を許可していることを示している。
また、制限候補テーブル112aでは、ID欄112bが「2」のレコードにおいて、要素宣言ID欄112cが「Telephone」で、制約条件の種別欄112dが「値の長さ」のレコードについては、制約条件の制限を許可していることを示している。
また、制限候補テーブル112aでは、ID欄112bが「3」のレコードにおいて、要素宣言ID欄112cが「*」で、これは、任意の要素であることを示しており、制約条件の種別欄112dが「出現パーティクル」のレコードについては、制約条件の制限を許可していることを示している。
また、制限候補テーブル112aでは、ID欄112bが「4」のレコードにおいて、要素宣言ID欄112cが任意の要素であり、制約条件の種別欄112dが「出現回数」のレコードについては、制約条件の制限を許可していることを示している。
また、制限候補テーブル112aでは、ID欄112bが「5」のレコードにおいて、要素宣言ID欄112cが任意の要素であり、制約条件の種別欄112dが「出現要素」のレコードについては、制約条件の制限を許可していることを示している。
従って、第一制限候補テーブル115aのID欄115bが「1,2,5〜10」のレコードは削除され、第二制限候補テーブル115gのレコードは削除しないことで、これらの制限候補情報を更新する。
そして、スキーマ変換部125は、ステップS16で更新された制限候補を用いてオリジナルスキーマを変換して、変換後スキーマを生成する(S17)。
まず、図6の第一制限候補テーブル115aのID欄115bが「3」及び「4」で識別されるレコードの制限について説明する。
この制限により、図4に示すオリジナルスキーマ113aの32行目のelement要素が、図8に示す変換後スキーマ116aの31行目〜37行目のelement要素に変換される。
ここで、変換後スキーマ116aの33行目のrestriction要素は、base属性の値で指定したデータ型を基底として制限することを表す。base属性の値には、第一制限候補テーブル115aの制約条件の候補欄115eに登録されている「NCName」を格納する。
また、変換後スキーマ116aの34行目のlength要素は、このデータ型がvalue属性の値で指定した長さの値のみを許すことを表す。value属性の値には、第一制限候補テーブル115aの制約条件の候補欄115eに登録されている「12」を格納する。
これらの変換により、オリジナルスキーマ113aのTelephone要素の要素宣言は、stringのデータ型であったが、変換後スキーマではNCName基底型とするデータ型になるため、制約条件が厳しくなる。また、オリジナルスキーマ113aでは値の長さの制限がなかったが、変換後スキーマ116aでは値の長さが「12」に限定されるため、制約条件が厳しくなる。
次に、図7に示した第二制限候補テーブル115gのID欄115hが「1」で識別されるレコードの制限について説明する。
この変換により、オリジナルスキーマ113aの15〜18行目のchoice要素が、変換後スキーマ116aの17行目のelement要素に変換される。
これにより、オリジナルスキーマ113aでは、Telephone要素とEmail要素のどちらの要素の出現も許可していたが、変換後スキーマ116aではTelephone要素の出現だけを許しEmail要素の出現を禁止することができるため、制約条件が厳しくなる。
次に、図7に示した第二制限候補テーブル115gのID欄115hが「2」及び「3」で識別されるレコードの制限について説明する。
この変換により、オリジナルスキーマ113aの27行目のany要素が、変換後スキーマ116aの26行目のelement要素に変換される。
これにより、オリジナルスキーマ113aでは任意の要素の出現が許可されていたが、変換後スキーマ116aではDiscount要素の出現だけを許すようになる。また、オリジナルスキーマ113aでは最大の出現回数の制限がなかったが、変換後スキーマでは最大出現回数を1回に制限することができるようになり、制約条件が厳しくなる。
次に、図7に示した第二制限候補テーブル115gのID欄115hが「4」で識別されるレコードの制限について説明する。
この変換により、オリジナルスキーマ113aの07行目のelement要素が、変換後スキーマ116aの09行目のelement要素に変換される。
これにより、オリジナルスキーマ113aでは最大の出現回数の制限がなかったが、変換後スキーマでは最大出現回数を2回に制限することができるようになり、制約条件が厳しくなる。
図11は、図10のステップS14に示す制限候補情報を更新する処理を示すフローチャートである。
まず、スキーマ変換装置100の探索部123は、探索の対象となっているサンプルデータから、要素を探索し、後述するステップS21〜ステップS24の調査を未だ行っていない要素Eを一つ抽出する(S20)。
ここで、本実施形態においては、探索部123は、深さ優先でサンプルデータの探索を行い、帰りがけ順に要素Eを抽出して後述する処理を行う。
例えば、探索の対象となっているサンプルデータが、図5に示すサンプルデータ114aである場合には、探索部123は、深さ優先でサンプルデータ114aの探索を行い、サンプルデータ114aに含まれる各要素を以下のような順番で要素Eとして抽出する。
(1)CustomerName要素(04行目)、(2)Telephone要素(05行目)、(3)CustomerInfo要素(03〜06行目)、(4)ProductName要素(08行目)、(5)Quantity要素(09行目)、(6)PurchaseInfo要素(07〜10行目)、(7)ProductName要素(12行目)、(8)Quantity要素(13行目)、(9)Discount要素(14行目)、(10)PurchaseInfo要素(11〜15行目)、(11)PurchaseOrder要素(01〜16行目)。
次に、制限候補情報更新部124は、要素Eに対応する要素宣言Dをオリジナルスキーマより取得する(S21)。ここで、要素宣言Dを取得する処理については、図12を用いて詳細に説明する。
次に、制限候補情報更新部124は、ステップS21で取得した要素宣言Dに、子要素の定義が含まれるか否かを判定する(S22)。ここで、要素宣言Dに子要素の定義が含まれるか否かは、要素宣言Dが「element」要素を子要素内に有するか否かにより判断する。
そして、子要素の定義がない場合には(ステップS22でNo)ステップS23に進み、子要素の定義がある場合には(ステップS22でYes)ステップS24に進む。
ステップS23では、制限候補情報更新部124は、テキストデータの制約条件の制限候補情報を更新する。なお、この処理の詳細については、図15を用いて詳細に説明する。
一方、ステップS24では、制限候補情報更新部124は、子要素の制約条件の制限候補情報を更新する。なお、この処理の詳細については、図16を用いて詳細に説明する。
そして、制限候補情報更新部124は、ステップS21〜ステップS24に示す調査を行っていない要素があるか否かを判断して(S25)、このような要素がある場合には(ステップS25でYes)ステップS20に戻り処理を繰り返し、このような要素がない場合には(ステップS25でNo)処理を終了する。
図12は、図11におけるステップS21の要素Eに対応する要素宣言Dのデータを取得する処理を示すフローチャートである。
まず、スキーマ変換装置100の制限候補情報更新部124は、要素Eの名前空間と、オリジナルスキーマの対象名前空間と、が同じか否かを判断する(S30)。
例えば、サンプルデータが図5に示すサンプルデータ114aであり、オリジナルスキーマが図4に示すオリジナルスキーマ113aである場合には、CustomerName要素(04行目)、Telephone要素(05行目)、CustomerInfo要素(03〜06行目)、ProductName要素(08行目)、Quantity要素(09行目)、PurchaseInfo要素(07〜10行目)、ProductName要素(12行目)、Quantity要素(13行目)、PurchaseInfo要素(11〜15行目)、および、PurchaseOrder要素(01〜16行目)の名前空間URI「http://example.org/order」であり、オリジナルスキーマ113aの対象名前空間URIは「http://example.org/order」であり、これらは一致するため、ステップS31に進む。一方、Discount要素(14行目)の名前空間URIは、「http://example.com/ext」であり、オリジナルスキーマ113aの対象名前空間URIは「http://example.org/order」であり、これらは一致しないため、ステップS36に進む。
ステップS31では、制限候補情報更新部124は、要素Eに対応した要素宣言が、オリジナルスキーマ内に存在するか否かを判断する(S31)。そして、このような要素宣言がオリジナルスキーマ内に存在する場合には(ステップS31でYes)ステップS33に進み、このような要素宣言がオリジナルスキーマ内に存在しない場合には(ステップS31でNo)ステップS32に進む。
ステップS32では、制限候補情報更新部124は、要素Eに対応した要素宣言が、インクルード先のスキーマ内に存在するか否かを判断する。そして、このような要素宣言がインクルード先のスキーマ内に存在する場合には(ステップS32でYes)ステップS33に進み、このような要素宣言がインクルード先のスキーマ内に存在しない場合には(ステップS32でNo)ステップS34に進む。
ステップS33では、オリジナルスキーマ内又はインクルード先のスキーマ内に存在する要素宣言を、要素Eに対応した要素宣言Dとして取得して、処理を終了する。
例えば、サンプルデータが図5に示すサンプルデータ114aであり、オリジナルスキーマが図4に示すオリジナルスキーマ113aである場合には、サンプルデータ114aのCustomerName要素(04行目)に対してはオリジナルスキーマ113aの31行目を、サンプルデータ114aのTelephone要素(05行目)に対してはオリジナルスキーマ113aの32行目を、サンプルデータ114aのCustomerInfo要素(03〜06行目)に対してはオリジナルスキーマ113aの11行目から21行目までを、サンプルデータ114aのProductName要素(08行目)に対してはオリジナルスキーマ113aの34行目を、サンプルデータ114aのQuantity要素(09行目)に対してはオリジナルスキーマ113aの35行目を、サンプルデータ114aのPurchaseInfo要素(07〜10行目)に対してはオリジナルスキーマ113aの22行目から30行目までを、サンプルデータ114aのProductName要素(12行目)に対してはオリジナルスキーマ113aの34行目を、サンプルデータ114aのQuantity要素(13行目)に対してはオリジナルスキーマ113aの35行目を、サンプルデータ114aのPurchaseInfo要素(11〜15行目)に対してはオリジナルスキーマ113aの22行目から30行目までを、および、サンプルデータ114aのPurchaseOrder要素(01〜16行目)に対してはオリジナルスキーマ113aの03行目から10行目までを、要素宣言Dとして取得する。
一方、ステップS34では、制限候補情報更新部124は、要素Eに対応した要素宣言が、スキーマリポジトリ記憶領域111に記憶されているスキーマ文書内に存在するか否かを判断する。
具体的には、制限候補情報更新部124は、要素Eの名前空間URIと一致する対象名前空間URIを有するスキーマ文書が格納されているレコードをスキーマリポジトリテーブル111aの対象名前空間URI欄111cより特定し、特定したレコードのロケーション欄111dに格納されているロケーションで示されるスキーマ文書内を検索することで、要素Eに対応した要素宣言があるかないかを判断する。
そして、このような要素宣言がある場合には(ステップS34でYes)ステップS35に進み、このような要素宣言がない場合には(ステップS34でNo)ステップS36に進む。
ステップS35では、制限候補情報更新部124は、発見した要素宣言を要素宣言Dとして取得するとともに、発見した要素宣言が含まれるスキーマ文書をオリジナルスキーマにインクルードする。
一方、ステップS36では、制限候補情報更新部124は、予め定められたエラーメッセージを出力部140に出力して、処理を終了する。なお、ステップS36で出力するエラーメッセージには、対応する要素宣言を有しない要素Eを特定する情報が含まれていることが望ましい。
次に、ステップS37では、オリジナルスキーマにインポートされているスキーマ文書内に、要素Eに対応する要素宣言があるか否かを判断する。このような要素宣言がある場合には(ステップS37でYes)ステップS38に進み、ない場合には(ステップS37でNo)ステップS39に進む。
なお、インポートとは名前空間の異なるスキーマ文書を取り込むことを言い、XML Schemaではimport要素を用いてインポートを実現することができる。
例えば、サンプルデータ114aのDiscount要素は、オリジナルスキーマ113aと名前空間が異なるため、当該Discount要素が要素Eとなっている場合には、ステップS37での処理となるが、オリジナルスキーマ113aでは、インポートを行っていないため、ステップS39に進むこととなる。
ステップS39では、制限候補情報更新部124は、要素Eに対応した要素宣言が、スキーマリポジトリ記憶領域111に記憶されているスキーマ文書内に存在するか否かを判断する。
具体的には、制限候補情報更新部124は、要素Eの名前空間URIと一致する対象名前空間URIを有するスキーマ文書が格納されているレコードをスキーマリポジトリテーブル111aの対象名前空間URI欄111cより特定し、特定したレコードのロケーション欄111dに格納されているロケーションで示されるスキーマ文書内を検索することで、要素Eに対応した要素宣言があるかないかを判断する。
例えば、サンプルデータ114aのDiscount要素の名前空間URIである「http://example.com/ext」は、図2に示すスキーマリポジトリテーブル111aのID欄11bが「3」のレコードの対象名前空間URI欄111cと一致するため、このレコードのロケーション111dで特定されるロケーションに記憶されているスキーマ文書を検索する。
そして、このような要素宣言がある場合には(ステップS39でYes)ステップS40に進み、このような要素宣言がない場合には(ステップS39でNo)ステップS41に進む。
ステップS40では、制限候補情報更新部124は、発見した要素宣言を要素宣言Dとして取得するとともに、発見した要素宣言が含まれるスキーマ文書をオリジナルスキーマにインポートする。
例えば、サンプルデータ114aのDiscount要素が要素Eである場合であって、ステップS39で発見されたスキーマ文書が、図13(スキーマ160の概略図)に示すスキーマ160であるときには、スキーマ160の04行目に対応する要素宣言があるため、この04行目の要素宣言を要素宣言Dとして取得するとともに、スキーマ160をオリジナルスキーマ113aにインポートする。例えば、図14(import要素161の概略図)に示すようなimport要素161をオリジナルスキーマ113aに追加する。
また、オリジナルスキーマ113aの02行目のnamespace属性の値には、図2に示すスキーマリポジトリテーブル111aのID欄11bが「3」のレコードの対象名前空間URI欄111cに格納されている値を追加し、03行目のschemaLocation属性の値には、図2に示すスキーマリポジトリテーブル111aのID欄111bが「3」のレコードのロケーション欄111dに格納されている値を追加する。
一方、ステップS41では、制限候補情報更新部124は、予め定められたエラーメッセージを出力部140に出力して、処理を終了する。なお、ステップS41で出力するエラーメッセージには、対応する要素宣言を有しない要素Eを特定する情報が含まれていることが望ましい。
図15は、図11のステップS23のテキストデータの制限候補情報を更新する処理を示すフローチャートである。
まず、制限候補情報更新部124は、要素Eの要素内容をサンプルデータより取得する(S50)。
次に、制限候補情報更新部124は、制限候補情報記憶領域115に記憶されている第一制限候補テーブル115aに要素宣言Dの情報があるか否かを判断する(S51)。このような情報がない場合には(ステップS51でNo)ステップS52に進み、このような情報がある場合には(ステップS51でYes)ステップS55に進む。
ステップS52では、制限候補情報更新部124は、ステップS50で取得した要素内容Cを妥当と判断することのできる制約条件のうち、最も厳しいデータ型を求める(S52)。
例えば、XML Schemaでは、ビルトイン型と呼ばれる様々なデータ型を規定している。これらのデータ型には、例えば文字列を表すStringや、復帰文字、改行、タブを含まない文字列を表すnormalizedStringなどがある。これらのデータ型には包含関係がある。例えば、normalizedStringはStringを制限することで定義されたデータ型であり、Stringに比べnormalizedStringの方が、制約条件がより厳しい。このようにして、データの包含関係から制約条件の厳しさを比較することができる。
従って、スキーマ変換装置100のオペレータは、このようなデータ型の包含関係を考慮して、データ型における制約条件の厳しさの序列を予め定めておき、制限候補情報更新部124に設定しておくことで、ステップS52での判定が可能となる。
なお、本実施形態では、XML Schemaで規定しているビルトイン型の中から制約条件の厳しいデータ型を求める処理を説明したが、他の方法により制約条件の厳しいデータ型を求めてもよい。例えば、本発明の利用者が独自に定義したデータ型の中から制約条件の厳しいデータ型を求めてもよい。例えば、A〜Zの文字と数字から構成される文字列のデータ型などを定義してもよい。また、データ型の派生により包含関係を判断するのではなく、独自の判断方法を定義して使用してもよい。
次に、制限候補情報更新部124は、第一制限候補テーブル115aに新たなレコードを追加して、ステップS52で求めたデータ型の他、必要な情報を格納する(S53)。
具体的には、制限候補情報更新部124は、追加したレコードにおいて、ID欄115bには、上方のレコードから連番となるようにIDの値を格納し、要素宣言ID欄115cには、要素宣言Dを識別することのできる識別情報(本実施形態では、要素宣言Dのname属性の値)を格納し、制約条件の種別欄115dには、「基底型」を示す情報を格納し、制約条件の候補欄115eには、ステップS52で求めたデータ型を示す情報を格納する。
次に、制限候補情報更新部124は、ステップS50で取得した要素内容Cの値の長さを求め、第一制限候補テーブル115aに新たなレコードを追加して、求めた値の長さの他、必要な情報を格納する(S54)。
具体的には、制限候補情報更新部124は、追加したレコードにおいて、ID欄115bには、上方のレコードから連番となるようにIDの値を格納し、要素宣言ID欄115cには、要素宣言Dを識別することのできる識別情報(本実施形態では、要素宣言Dのname属性の値)を格納し、制約条件の種別欄115dには、「値の長さ」を示す情報を格納し、制約条件の候補欄115eには、求めた値の長さを示す情報を格納する。
一方、ステップS55では、制限候補情報更新部124は、ステップS50で取得した要素内容Cを妥当と判断することのできる制約条件のうち、最も厳しいデータ型を求め、第一制限候補テーブル115aの要素宣言Dに対応するレコードであって、制約条件の種別欄115dが「基底型」のレコードの制約条件の候補欄115eに格納されているデータ型と、求めたデータ型と、の両方を包含することのできる最も厳しいデータ型を求め、当該レコードの制約条件の候補欄115eの値と入れ替えることで、第一制限候補テーブル115aを更新する(S55)。
次に、制限候補情報更新部124は、ステップS50で取得した要素内容Cの値の長さを求め、第一制限候補テーブル115aの要素宣言Dに対応するレコードであって、制約条件の種別欄115dが「値の長さ」のレコードの制約条件の候補欄115eに格納されている値の長さと、求めた値の長さと、の両方を含む値の長さの範囲を求め、当該レコードの制約条件の候補欄115eの値と入れ替えることで、第一制限候補テーブル115aを更新する(S56)。
以上に記載した図15のフローチャートにおける処理を、図4に示すオリジナルスキーマ113a及び図5に示すサンプルデータ114aに基づいて、具体的に説明する。ここで、第一制限候補テーブル115aは初期状態であって、制限候補情報を格納するレコードは設けられていないものとして説明する。
まず、制限候補情報更新部124は、要素Eがサンプルデータ114aの04行目のCustomerName要素である場合には、当該CustomerName要素の要素内容である「john」を取得する(S50)。
次に、制限候補情報更新部124は、第一制限候補テーブル115aの要素宣言ID欄115cにCustomerName要素宣言の情報があるか判定する(S51)。第一制限候補テーブル115aは、初期状態ではレコードを持たないためCustomerName要素宣言の情報はないものとする。
次に、制限候補情報更新部124は、ステップS50で取得した要素内容である「john」が含まれるなるべく制約条件の厳しいデータ型を求める。本実施形態では、制限候補情報更新部124は、XML Schemaのビルトイン型からなるべく制約条件の厳しいデータ型を求めることでNCNameのデータ型が求まる。ここで、NCNameのデータ型は、normalizedStringのデータ型を、さらに複数回派生させたデータ型あり、コロン「:」を含まないという特徴を持つ。
次に、制限候補情報更新部124は、第一制限候補テーブル115aに新たなレコードを追加して、ID欄115bには「1」の値を、要素宣言IDにはCustomerName要素の要素宣言IDである「CustomerName」を格納し、制約条件の種別欄115dには、「基底型」を格納し、制約条件の候補欄115eには、ステップS52で求めた「NCName」を格納する(S53)。
次に、制限候補情報更新部124は、要素内容であるjohnの値の長さである4を求め、第一制限候補テーブル115aに新たなレコードを追加して、ID欄115bには「2」の値を、要素宣言IDにはCustomerName要素の要素宣言IDである「CustomerName」を格納し、制約条件の種別欄115dには、「基底型」を格納し、制約条件の候補欄115eには、求めた「2」の値を格納する(S54)。
以上の処理を行うことで、第一制限候補テーブル115aにID欄115bが「1」及び「2」で識別されるレコードが追加される。
次に、制限候補情報更新部124は、要素Eがサンプルデータ114aの05行目のTelephone要素である場合には、上述の04行目のCustomerName要素の場合と同様の処理を行い、第一制限候補テーブル115aにID「3」及び「4」で識別されるレコードが追加される。
サンプルデータ114aにおける次の要素はCustomerInfo要素であるが、この要素に対する処理は図16で説明する。
次に、制限候補情報更新部124は、要素Eがサンプルデータ114aの08行目のProductName要素である場合、および、Quantity要素である場合には、上述のCustomerName要素の場合と同様の処理を行い、第一制限候補テーブル115aにID「5」〜「8」で識別されるレコードが追加される。但し、図6に示した第一制限候補テーブル115aでは、ID「6」に示すレコードの制約条件の候補欄115eには「8〜9」の値が格納されているが、要素Eがサンプルデータ114aの08行目のProductName要素である場合は、要素内容「LaptopPC」の値の長さに対応する「8」の値が格納され、また、ID「8」に示すレコードの制約条件の候補欄115eには「1〜2」の値が格納されているが、要素Eがサンプルデータ114aの09行目のQuantity要素である場合は、要素内容「1」の値の長さに対応する「1」の値が格納される。
サンプルデータ114aにおける次の要素はPurchaseInfo要素であるが、この要素に対する処理は図16で説明する。
次に、制限候補情報更新部124は、要素Eがサンプルデータ114aの12行目のProductName要素である場合には、当該ProductName要素の要素内容である「USBMemory」を取得する(S50)。
次に、制限候補情報更新部124は、第一制限候補テーブル115aの要素宣言ID欄115cにProductName要素宣言の情報があるか判定する(S51)。ここで、上述の処理により、第一制限候補テーブル115aには、ID欄115bが「5」及び「6」のレコードにおける要素宣言ID欄115cに「ProductName」が格納されているため、ステップS55に進む。
ステップS55では、制限候補情報更新部124は、処理中の要素の要素内容を含む制約条件の厳しいデータ型と、既に第一制限候補テーブル115aに格納されているデータ型の両方を含むデータ型のうち最も厳しい制限となるものを求める。
ここでは、処理中のProductName要素の要素内容であるUSBMemoryを含む制約条件の厳しいデータ型はNCNameであり、既に第一制限候補テーブル115aに登録されているProductName要素宣言のデータ型はNCNameであるため、両方のデータ型を含むデータ型もNCNameとなる。
次に、制限候補情報更新部124は、処理中の要素の要素内容「USBMemory」の値の長さ「9」を取得し、既に第一制限候補テーブル115aに格納されている値の長さ「8」の両方を満たす値の長さの範囲「8〜9」を求め、第一制限候補テーブル115aの要素宣言ID欄115cに「ProductName」、制約条件の種別115dに「値の長さ」、が格納されているレコードの制約条件の候補欄115eの値を「8〜9」に更新する(S56)。
以上の処理を行うことで、第一制限候補テーブル115aのID欄115bが「5」及び「6」で識別されるレコードの更新が行われる。
次に、制約候補情報更新部124は、要素Eがサンプルデータ114aの13行目のQuantity要素である場合の処理を行うが、この処理は、要素Eがサンプルデータ114aの12行目のProductName要素である場合の処理と同様であるため、説明を省略する。
次に、制限候補情報更新部124は、要素Eがサンプルデータ114aの14行目のDiscount要素である場合には、上述の04行目のCustomerName要素の場合と同様の処理を行い、第一制限候補テーブル115aにID「9」及び「10」で識別されるレコードが追加される。
サンプルデータ114aにおける次の要素はPurchaseInfo要素であり、その次は、PurchaseOrder要素であるが、これらの要素に対する処理は図16で説明する。
図16は、図11のステップS24の子要素の制限候補情報を更新する処理を示すフローチャートである。
まず、制限候補情報更新部124は、サンプルデータ114aより、要素Eの子要素のリストLを取得する(S60)。例えば、制限候補情報更新部124は、要素Eの子要素の要素名をカンマ(,)で区切って羅列することにより、リストLを取得する。
次に、制限候補情報更新部124は、制限候補情報記憶領域115に記憶されている第二制限候補テーブル115gに、要素宣言Dの情報があるか否かを判断する(S61)。このような情報がない場合には(ステップS61でNo)ステップS62に進み、このような情報がある場合には(ステップS61でYes)ステップS70に進む。
ステップS62では、制限候補情報更新部124は、オリジナルスキーマ113aにおける要素宣言Dの子要素内に、choice要素があるか否かを判断する。そして、このようなchoice要素がある場合には(ステップS62でYes)ステップS63に進み、ない場合には(ステップS62でNo)ステップS65に進む。
ステップS63では、制限候補情報更新部124は、オリジナルスキーマ113aより、要素宣言Dにおけるchoice要素の子要素のパーティクルを取得する。
次に、制限候補情報更新部124は、ステップS63で取得したパーティクルのうち、サンプルデータ114aの要素Eの子要素として選択されているものを特定し、第二制限候補テーブル115gに新たなレコードを追加して、特定した子要素を示す情報とともに、必要な情報を追加したレコードに格納する(S64)。
具体的には、制限候補情報更新部124は、追加したレコードにおいて、ID欄115hには、上方のレコードから連番となるようにIDの値を格納し、要素宣言ID欄115iには、要素宣言Dのname属性の値を示す情報を格納し、パーティクルID欄115jには、「choice」を示す情報を格納し、制約条件の種別欄115kには、「出現パーティクル」を示す情報を格納し、制約条件の候補欄115eには、ステップS64で特定した子要素を示す情報を格納する。
次に、制限候補情報更新部124は、オリジナルスキーマ113aにおける要素宣言Dの子要素内に、出現回数が固定でないパーティクルがあるか否かを判断する(S65)。そして、このようなパーティクルがある場合には(ステップS65でYes)ステップS66に進み、ない場合には(ステップS65でNo)ステップS68に進む。
ここで、XML Schemaでは、各パーティクルはminOccurs属性とmaxOccurs属性を持つことができる。minOccurs属性はパーティクルの最小出現回数を表し、maxOccurs属性はパーティクルの最大出現回数を表す。
また、minOccurs属性を省略した場合は、パーティクルの最小出現回数が1回であることを表す。maxOccurs属性を省略した場合は、パーティクルの最大出現回数が1回であることを表す。
さらに、maxOccurs属性の値がunboundedの場合、最大出現回数の制限がないことを表す。
従って、要素宣言Dにおけるパーティクルにおいて、minOccurs属性で特定される値よりもmaxOccurs属性で特定される値が大きい場合、minOccurs属性が省略されており、maxOccurs属性で特定される値が「2」以上である場合、または、maxOccurs属性の値がunboundedの場合は、出現回数が固定でないパーティクルであると判断できる。
ステップS66では、制限候補情報更新部124は、オリジナルスキーマ113aより、要素宣言Dにおける出現回数が固定でないパーティクルを取得する。
次に、制限候補情報更新部124は、ステップS66で取得したパーティクルの出現回数を、サンプルデータ114aの要素Eの子要素から特定し、第二制限候補テーブル115gに新たなレコードを追加して、特定した出現回数を示す情報とともに、必要な情報を追加したレコードに格納する(S67)。
具体的には、制限候補情報更新部124は、追加したレコードにおいて、ID欄115hには、上方のレコードから連番となるようにIDの値を格納し、要素宣言ID欄115iには、要素宣言Dのname属性の値を示す情報を格納し、パーティクルID欄115jには、出現回数が固定でないパーティクルを示す情報(ここでは、当該パーティクルの要素名)を格納し、制約条件の種別欄115kには、「出現回数」を示す情報を格納し、制約条件の候補欄115eには、ステップS67で特定した出現回数を示す情報を格納する。
次に、制限候補情報更新部124は、オリジナルスキーマ113aにおける要素宣言Dの子要素内に、any要素があるか否かを判断する(S68)。そして、any要素がある場合には(ステップS68でYes)ステップS69に進み、ない場合には(ステップS68でNo)処理を終了する。
ステップS69では、制限候補情報更新部124は、ステップS60で取得したリストLにおいて、any要素に対応する子要素の出現回数と、当該子要素を示す情報と、を特定し、第二制限候補テーブル115gに新たなレコードを二つ追加して、特定した出現回数を示す情報と、特定した子要素を示す情報と、を必要な情報とともに追加したレコードの各々に格納する。
具体的には、制限候補情報更新部124は、追加したレコードにおいて、ID欄115hには、上方のレコードから連番となるようにIDの値を格納し、パーティクルID欄115jには、「any」を示す情報を格納し、制約条件の種別欄115kには、「出現回数」を示す情報を格納し、制約条件の候補欄115eには、ステップS69で特定した出現回数を特定する情報を格納する。
また、制限候補情報更新部124は、追加したレコードにおいて、ID欄115hには、上方のレコードから連番となるようにIDの値を格納し、要素宣言ID欄115iには、要素宣言Dのname属性の値を示す情報を格納し、パーティクルID欄115jには、「any」を示す情報を格納し、制約条件の種別欄115kには、「出現要素」を示す情報を格納し、制約条件の候補欄115eには、ステップS69で特定した子要素を示す情報(ここでは、子要素名)を格納する。ここで、出現する子要素が複数ある場合には、子要素の要素名をカンマ(,)で区切る等により、各々の子要素を識別可能に格納する。
一方、ステップS70では、制限候補情報更新部124は、オリジナルスキーマ113aにおける要素宣言Dの子要素内に、choice要素があるか否かを判断する。そして、このようなchoice要素がある場合には(ステップS70でYes)ステップS71に進み、ない場合には(ステップS70でNo)ステップS73に進む。
ステップS71では、制限候補情報更新部124は、オリジナルスキーマ113aより、要素宣言Dにおけるchoice要素の子要素のパーティクルを取得する。
次に、制限候補情報更新部124は、ステップS71で取得したパーティクルのうち、サンプルデータ114aの要素Eの子要素として選択されているものを特定し、第二制限候補テーブル115gの対応するレコードに、特定した子要素を示す情報を追加等する(S72)。
具体的には、制限候補情報更新部124は、第二制限候補テーブル115gの要素宣言ID欄に要素宣言Dのname属性の値を示す情報が格納され、パーティクルID欄115jにchoiceを示す情報が格納されているレコードにおいて、制約条件の候補欄115eに、ステップS72で特定した子要素を示す情報が未だ格納されていない場合には、当該子要素を示す情報を格納する。
次に、制限候補情報更新部124は、オリジナルスキーマ113aにおける要素宣言Dの子要素内に、出現回数が固定でないパーティクルがあるか否かを判断する(S73)。そして、このようなパーティクルがある場合には(ステップS73でYes)ステップS74に進み、ない場合には(ステップS73でNo)ステップS76に進む。
ステップS74では、制限候補情報更新部124は、オリジナルスキーマ113aより、要素宣言Dにおける出現回数が固定でないパーティクルを取得する。
次に、制限候補情報更新部124は、ステップS74で取得したパーティクルの出現回数を、サンプルデータ114aの要素Eの子要素から特定し、第二制限候補テーブル115gの対応するレコードに、特定した出現回数を示す情報を追加等する(S75)。
具体的には、制限候補情報更新部124は、第二制限候補テーブル115gにおいて、要素宣言ID欄115iに要素宣言Dのname属性の値を示す情報が格納され、パーティクルID欄115jに出現回数が固定でないパーティクルを示す情報が格納されているレコードの制約条件の候補欄115eに格納されている数値に、ステップS74で特定した数値を加算する。
次に、制限候補情報更新部124は、オリジナルスキーマ113aにおける要素宣言Dの子要素内に、any要素があるか否かを判断する(S76)。そして、any要素がある場合には(ステップS76でYes)ステップS77に進み、ない場合には(ステップS76でNo)処理を終了する。
ステップS76では、制限候補情報更新部124は、ステップS60で取得したリストLにおいて、any要素に対応する子要素の出現回数と、当該子要素を示す情報と、を特定し、第二制限候補テーブル115gの対応する二つのレコードを選択して、特定した出現回数を示す情報と、特定した子要素を示す情報と、を追加等する。
具体的には、制限候補情報更新部124は、第二制限候補テーブル115gにおいて、要素宣言ID欄115iに要素宣言Dのname属性の値を示す情報が格納され、パーティクルID欄115jに「any」を示す情報が格納され、制約条件の種別欄115kに「出現回数」を示す情報が格納されているレコードを選択し、制約条件の候補欄115eに格納されている数値に、ステップS76で特定した出現回数を加算する。
また、制限候補情報更新部124は、第二制限候補テーブル115gにおいて、要素宣言ID欄115iに要素宣言Dのname属性の値を示す情報が格納され、パーティクルID欄115jに「any」を示す情報が格納され、制約条件の種別欄115kに「出現要素」を示す情報が格納されているレコードを選択し、制約条件の候補欄115eに、ステップS77で特定した子要素を示す情報が格納されていない場合には、当該子要素を示す情報を追加する。
以上に記載した図16のフローチャートにおける処理を、図4に示すオリジナルスキーマ113a及び図5に示すサンプルデータ114aに基づいて、具体的に説明する。ここで、第二制限候補テーブル115gは初期状態であって、制限候補情報を格納するレコードは設けられていないものとして説明する。
まず、要素Eがサンプルデータ114aの03行目から06行目までのCustomerInfo要素である場合には、制限候補情報更新部124は、CustomerInfo要素の子要素を特定し、リストLを取得する(S60)。ここで、CustomerInfo要素は04行目のCustomerName要素と、05行目のTelephone要素と、の2つの子要素を持つため、リストLとして、[CustomerName,Telephone]を取得する。子要素のリストLは、子要素の要素名をカンマ(,)で区切ることで各々の子要素を識別している。
次に、制限候補情報更新部124は、第二制限候補テーブル115gにCustomerInfo要素宣言のレコードがあるか判定する(S61)。第二制限候補テーブル115gは、初期状態ではレコードを持たないためCustomerInfo要素のレコードはない。そのため、ステップS62に進む。
次に、制限候補情報更新部124は、CustomerInfo要素宣言内にchoice要素があるか否かを判定する(S62)。
ここで、オリジナルスキーマ113aには、15行目から18行目までにchoice要素があるため、ステップS63に進む。
ステップS63では、制限候補情報更新部124は、オリジナルスキーマ113aよりchoice要素(15行目から18行目)を取得する。
ここで、取得したchoice要素の子要素には、16行目のelement要素(<element ref=“Telephone”>)と17行目のelement要素(<element ref=“Email”>)の2つのパーティクルが存在する。これは、XML文書の対応する箇所にTelephone要素かEmail要素のどちらかが出現しなくてはならないという制約条件を表す。
次に、制限候補情報更新部124は、ステップS71で取得したchoice要素の子要素のパーティクルのうち、サンプルデータ114aにおいて選択されたものを特定し、第二制限候補テーブル115gに格納する(S72)。
具体的には、制限候補情報更新部124は、ステップS60で取得したCustomerInfo要素の子要素のリストL[CustomerName,Telephone]から、choice要素の子要素のパーティクルであるTelephone要素とEmail要素のうち、Telephone要素の方が出現していることが分かる。よって、サンプルデータ114aにおいて選択されたのは16行目のelement要素(<element ref=“Telephone”>)であることが分かる。ここで、本element要素のパーティクルIDを「Telephone」とする。
そして、制限候補情報更新部124は、第二制限候補テーブル115gに新たなレコードを追加して、ID欄115hには、上方のレコードから連番となるようにIDの値を格納し、要素宣言ID欄115iには、処理対象となっているCustomerInfo要素の要素宣言IDである「CustomerInfo」を格納し、パーティクルID欄115jには、処理対象となっているchoice要素のパーティクルIDである「choice」を格納し、制約条件の種別欄115kには「出現パーティクル」を格納し、制約条件の候補欄115lには、サンプルデータ114aにおいて選択されたパーティクルのパーティクルIDである「Telephone」を格納する。
次に、制限候補情報更新部124は、CustomerInfo要素宣言内に、出現回数が固定でないパーティクルがあるか否かを判定する(S65)。
ここで、CustomerInfo要素宣言内に含まれるパーティクルは、全てminOccurs属性及びmaxOccurs属性を省略しているため、出現回数が1回に固定されており、出現回数が固定でないパーティクルは存在しない。従って、ステップS68に進む。
次に、制限候補情報更新部124は、CustomerInfo要素宣言内に、any要素があるか否かを判定する(S68)。ここで、CustomerInfo要素宣言内にany要素は存在しないため、制限候補情報更新部124は、CustomerInfo要素に対する制限候補情報の更新処理を終了する。
次に、要素Eがサンプルデータ114aの07行目から10行目までのPurchaseInfo要素である場合には、制限候補情報更新部124は、PurchaseInfo要素の子要素を特定し、リストLを取得する(S60)。ここで、PurchaseInfo要素の子要素のリストLは、[ProductName,Quantity]となる。
次に、制限候補情報更新部124は、第二制限候補テーブル115gにPurchaseInfo要素宣言に対応する情報があるか判定する(S61)。ここでは、第二制限候補テーブル115gには、PurchaseInfo要素宣言の情報はないものとする。そのため、ステップS62に進む。
次に、制限候補情報更新部124は、PurchaseInfo要素宣言内に、choice要素があるか否かを判定する(S62)。ここで、オリジナルスキーマ113aのPurchaseInfo要素宣言(22行目から30行目)には、choice要素は存在しないため、ステップS65に進む。
次に、制限候補情報更新部124は、PurchaseInfo要素宣言内に、出現回数が固定でないパーティクルがあるか否かを判定する(S65)。ここで、PurchaseInfo要素宣言内に含まれるパーティクルのうち27行目のany要素は、minOccurs属性が0であり、maxOccurs属性がunboundedであることから、出現回数が固定ではないことがわかり、ステップS66に進む。
ステップS66では、制限候補情報更新部124は、このany要素の情報(27行目)を取得する。ここで、このany要素のパーティクルIDは簡単のため「any」とする。
次に、制限候補情報更新部124は、ステップS67の処理として、以下の処理を行う。
まず、制限候補情報更新部124は、ステップS66で取得したany要素の出現回数を、ステップS60で取得した子要素のリストL[ProductName,Quantity]から特定する。ここで、子要素のリストL[ProductName,Quantity]には、any要素に対応した要素は出現しておらず、any要素の出現回数は0回であることが分かる。なお、any要素に対応した要素であるか否かは、any要素以外の要素に対応する子要素をリストLから差し引けばよい。
そして、制限候補情報更新部124は、第二制限候補テーブル115gに新たなレコードを追加して、ID欄115hには、情報のレコードから連番となるIDの値を格納し、要素宣言ID欄115iには、処理対象となっているPurchaseInfo要素の要素宣言IDである「PurchaseInfo」を格納し、パーティクルID欄115jには、処理対象となっているany要素のパーティクルIDである「any」を格納し、制約条件の種別欄115kには、「出現回数」を格納し、制約条件の候補欄115lには、any属性の出現回数である「0」を格納する。
次に、制限候補情報更新部124は、PurchaseInfo要素宣言内に、any要素があるか否かを判定する(S68)。ここで、オリジナルスキーマ113aのPurchaseInfo要素宣言(22行目から30行目)には、any要素が存在するため(27行目)、ステップS69に進む。
そして、制限候補情報更新部124は、ステップS69での処理として以下の処理を行う。
まず、制限候補情報更新部124は、any要素と対応するサンプルデータ114a内の要素を取得する。ここで、ステップS60で取得した子要素のリストL[ProductName,Quantity]から、サンプルデータ114aにはany要素に対応した要素は出現していない。
そして、制限候補情報更新部124は、以上により得られた情報を第二制限候補テーブル115gに格納する。
具体的には、第二制限候補テーブル115gに新たなレコードを追加して、ID欄115hには、情報のレコードから連番となるIDの値を格納し、要素宣言ID欄115iには、処理対象となっているPurchaseInfo要素の要素宣言IDである「PurchaseInfo」を格納し、パーティクルID欄115jには、処理対象となっているany要素のパーティクルIDである「any」を格納し、制約条件の種別欄115kには、「出現要素」を格納し、制約条件の候補欄115lには、any属性に対応した要素が存在しないため、空欄とする。
以上で、PurchaseInfo要素に対する制限候補情報の更新処理を終了する。
次に、要素Eがサンプルデータ114aの11行目から15行目までのPurchaseInfo要素である場合には、制限候補情報更新部124は、PurchaseInfo要素の子要素を特定し、リストLを取得する(S60)。ここで、PurchaseInfo要素の子要素のリストLは、[ProductName,Quantity,Discount]となる。
次に、制限候補情報更新部124は、第二制限候補テーブル115gにPurchaseInfo要素宣言に対応するレコードがあるか判定する(S61)。ここでは、既に、サンプルデータ114aの07行目から10行目までのPurchaseInfo要素に対する処理を行った結果、第二制限候補テーブル115gにPurchaseInfo要素宣言に対応するレコードがあるため、ステップS70に進む。
ステップS70では、制限候補情報更新部124は、PurchaseInfo要素宣言内に、choice要素があるか否かを判定する。ここで、オリジナルスキーマ113aのPurchaseInfo要素宣言(22行目から30行目)には、choice要素は存在しないため、ステップS73に進む。
次に、制限候補情報更新部124は、PurchaseInfo要素宣言内に、出現回数が固定でないパーティクルがあるか否かを判定する(S73)。ここで、PurchaseInfo要素宣言内に含まれるパーティクルのうち27行目のany要素は、minOccurs属性が0であり、maxOccurs属性がunboundedであることから、出現回数が固定でないことが分かり、ステップS74に進む。
ステップS74では、制限候補情報更新部124は、このany要素の情報(27行目)を取得する。ここで、このany要素のパーティクルIDは簡単のため「any」とする。
次に、制限候補情報更新部124は、ステップS75の処理として、以下の処理を行う。
まず、制限候補情報更新部124は、ステップS74で取得したany要素の出現回数を、ステップS60で取得した子要素のリストL[ProductName,Quantity,Discout]から特定する。ここで、子要素のリストL[ProductName,Quantity,Discout]には、any要素に対応した要素[Discout]が出現しているため、要素[Discout]の出現回数(1回)を取得する。
そして、制限候補情報更新部124は、第二制限候補テーブル115gにおいて、要素宣言ID欄115iに「PurcaseInfo」が格納され、パーティクルID欄115jに「any」が格納され、制約条件の種別欄115kに「出現回数」が格納されているレコードを選択して、制約条件の候補欄115lに格納されている数値と、当該数値に要素[Discout]の出現回数(1回)を加算した数値と、の両方を含む出現回数(ここでは、0〜1)を格納する。
次に、制限候補情報更新部124は、PurchaseInfo要素宣言内に、any要素があるか否かを判定する(S76)。ここで、オリジナルスキーマ113aのPurchaseInfo要素宣言(22行目から30行目)には、any要素が存在するため(27行目)、ステップS77に進む。
そして、制限候補情報更新部124は、ステップS77での処理として以下の処理を行う。
まず、制限候補情報更新部124は、any要素と対応するサンプルデータ114a内の要素を取得する。ここで、ステップS60で取得した子要素のリストL[ProductName,Quantity,Discount]から、サンプルデータ114aにはany要素に対応した要素[Discount]が出現している。
そして、制限候補情報更新部124は、以上により得られた情報を第二制限候補テーブル115gに格納する。
具体的には、第二制限候補テーブル115gにおいて、要素宣言ID欄115iに「PurcaseInfo」が格納され、パーティクルID欄115jに「any」が格納され、制約条件の種別欄115kに「出現要素」が格納されているレコードを選択して、制約条件の候補欄115lに「Discount」が格納されていない場合には、当該欄に「Discount」を格納する。
以上で、PurchaseInfo要素に対する制限候補情報の更新処理を終了する。
次に、要素Eがサンプルデータ114aの01行目から16行目までのPurchaseOrder要素である場合には、制限候補情報更新部124は、PurchaseOrder要素の子要素を特定し、リストLを取得する(S60)。ここで、PurchaseOrder要素の子要素のリストLは、[CustomerName,Telephone,CustomerInfo,ProductName,Quantity,PurchaseInfo,ProductName,Quantity,Discount,PurchaseInfo]となる。
次に、制限候補情報更新部124は、第二制限候補テーブル115gにPurchaseOrder要素宣言に対応する情報があるか判定する(S61)。ここでは、第二制限候補テーブル115gには、PurchaseOrder要素宣言の情報はないものとする。そのため、ステップS62に進む。
次に、制限候補情報更新部124は、PurchaseOrder要素宣言内に、choice要素があるか否かを判定する(S62)。ここで、オリジナルスキーマ113aのPurchaseOrder要素宣言(03行目から10行目)には、choice要素は存在しないため、ステップS65に進む。
次に、制限候補情報更新部124は、PurchaseOrder要素宣言内に、出現回数が固定でないパーティクルがあるか否かを判定する(S65)。ここで、PurchaseOrder要素宣言内に含まれるパーティクルのうち07行目のPurchaseInfo要素は、maxOccurs属性がunboundedであることから、出現回数が固定ではないことがわかり、ステップS66に進む。
ステップS66では、制限候補情報更新部124は、このPurchaseInfo要素の情報(07行目)を取得する。ここで、このPurchaseInfo要素のパーティクルIDは簡単のため「PurchaseInfo」とする。
次に、制限候補情報更新部124は、ステップS67の処理として、以下の処理を行う。
まず、制限候補情報更新部124は、ステップS66で取得したPurchaseInfo要素の出現回数を、ステップS60で取得した子要素のリストLから特定する。ここで、子要素のリストLには、PurchaseInfo要素に対応した要素は2回出現しているため、PurchaseInfo要素の出現回数は2回であることがわかる。
そして、制限候補情報更新部124は、第二制限候補テーブル115gに新たなレコードを追加して、ID欄115hには、情報のレコードから連番となるIDの値を格納し、要素宣言ID欄115iには、処理対象となっているPurchaseOrder要素の要素宣言IDである「PurchaseOrder」を格納し、パーティクルID欄115jには、処理対象となっているPurchaseInfo要素のパーティクルIDである「PurchaseInfo」を格納し、制約条件の種別欄115kには、「出現回数」を格納し、制約条件の候補欄115lには、PurchaseInfo要素の出現回数である「2」を格納する。
次に、制限候補情報更新部124は、PurchaseOrder要素宣言内に、any要素があるか否かを判定する(S68)。ここで、オリジナルスキーマ113aのPurchaseOrder要素宣言(03行目から10行目)には、any要素が存在しないため、PurchaseOrder要素に対する制限候補情報の更新処理を終了する。
以上により、サンプルデータ114a内の全ての要素について、図15又は図16の処理を実行したため、制限候補情報の更新処理は終了する。
以上のように、本実施形態によれば、サンプルデータ114aを用いて、オリジナルスキーマ113aをより厳しく制限した変換後スキーマ116aを生成することができる。このため、例えば、スキーマ変換装置100のオペレータは、システムにおいて許可することのできる最大限に緩い制限となるサンプルデータを少なくとも一つ以上作成しておくことで、このようなサンプルデータが妥当と判断される最も厳格なスキーマを容易に生成することができるようになる。
例えば、本実施形態におけるスキーマ変換装置100は、図17(Webサービスシステム170の概略図)に示すWebサービスシステム170において使用することができる。
図示するように、Webサービスシステム170は、スキーマ変換装置100と、メッセージ受信装置171と、スキーマ検証装置172と、アプリケーションサーバ装置173と、を備え、これらの装置は、ネットワーク180を介して、相互に情報を送受信することができる。
メッセージ受信装置171は、Webサービスクライアント(図示せず)から受信したメッセージををスキーマ検証装置172に送信する。ここでは、メッセージの全体又は一部分である検証前XML文書をスキーマ検証装置172に送信する。これは、例えばSOAPメッセージの本体部分であるSOAPボディの内容を取り出し、検証前XML文書としてスキーマ検証装置に送信する処理などが考えられる。
そして、スキーマ検証装置172においては、受信した検証前XML文書のスキーマ検証を実行する。ここで、スキーマ検証装置172は、スキーマ変換装置100で生成された変換後スキーマを用いて、スキーマ検証を実行する。
そして、検証前XML文書が、スキーマ変換装置100により生成された変換後スキーマに対して妥当である場合には、スキーマ検証装置172は、検証済みXML文書をアプリケーションサーバ装置173に送信する。
このような検証済みXML文書を受信したアプリケーションサーバ装置173は、検証済みXML文書を用いて、例えば、商品の受注処理や旅行の予約処理など、何らかの業務処理を実行する。
なお、図17に示した例では、アプリケーションサーバ装置173で提供するサービスにおいて、安全と判断されるサンプルデータを用いてスキーマ変換装置100において変換後スキーマを生成しておくことで、アプリケーションサーバ装置173のセキュリティを確保することができるようになる。
また、図17で示した例では、Webサービスシステム170での全体の処理を、スキーマ変換装置100、メッセージ受信装置171、スキーマ検証装置172及びアプリケーションサーバ装置173とで分担して行っているが、このような態様に限定されず、Webサービスシステム170での全体の処理を分担する態様は、任意の態様を選択可能である。例えば、Webサービスシステム170での全体の処理をスキーマ変換装置100だけで行うようにすることも可能であり、Webサービスシステム170での任意の処理をスキーマ変換装置100で行うようにすることも可能である。
以上に記載した実施形態においては、図15に記載したフローチャートにおいて、要素内容のデータ型と値の長さについてより制限を厳しくすることができるようにしているが、このような態様に限定されず、例えば、要素内容から、出現する文字列や、特殊記号の有無、整数値の範囲(最小値と最大値、正の値又は負の値)等の制限を厳しくするようにすることも可能である。
また、以上に記載した実施形態においては、サンプルデータ114aを用いて要素に関する制限をより厳しくするようにしているが、このような態様に限定されず、属性に関しても、例えば、図15と同様の処理で、属性値の値の範囲を限定することができ、また、図16と同様な処理で、anyAtribute属性値として出現する属性の限定等を行うことができる。
図18は、本発明の第二の実施形態であるスキーマ変換装置200の概略図である。
図示するように、スキーマ変換装置200は、記憶部110と、制御部220と、入力部130と、出力部140と、通信部150と、を備え、第一の実施形態と比較して、制御部220が異なっているため、以下、制御部220に関連する事項について説明する。
制御部220は、全体制御部121と、スキーマ検証部122と、探索部123と、制限候補情報更新部124と、スキーマ変換部225と、スキーマ編集部226と、を備え、第一の実施形態と比較して、スキーマ変換部225及びスキーマ編集部226が異なっているため、以下これらに関連する事項について説明する。
スキーマ変換部225は、制限候補情報記憶領域115に記憶されている制限候補のうち、後述するスキーマ編集部226において、スキーマ変換装置200のオペレータより制限の許可の入力を受け付けたものをオリジナルスキーマ113aに適用することで、スキーマの変換を行い、変換後スキーマを生成する。
スキーマ編集部226は、制限候補情報記憶領域115に記憶されている制限候補を出力部140に出力し、当該制限候補うち、オリジナルスキーマ113aに適用する制限候補の入力を、入力部130を介して受け付け、受け付けた制限候補をスキーマ変換部225に通知する。
例えば、本実施形態においては、図19(エディタ画面226aの概略図)に示すようなエディタ画面226aを出力部140に出力することで、オペレータより制限候補の選択を受け付ける。
エディタ画面226aは、オリジナルスキーマ表示領域226bと、行数表示領域226cと、を備える。
そして、行数表示領域226cには、制限候補情報記憶領域115に記憶されている制限候補が存在するパーティクルの行数に隣接する位置(図19では、向かって右横の所定位置)に、制限候補が存在することを示すマーク226dが配置される。
そして、このマーク226dを指定した実行指示の入力を、入力部130を介して受け付けると、スキーマ編集部226は、当該マーク226dに関連するパーティクルに隣接した位置(図19では、下方の所定位置)に、制限候補を特定する情報が表示される。
そして、スキーマ編集部226は、表示された制限候補を特定した実行指示の入力を、入力部130を介して受け付けることで(例えば、ダブルクリック等)、入力を受け付けた制限候補をスキーマ変換部225に通知する。
なお、このような通知を受けたスキーマ変換部225は、通知で特定される変換候補による変換をオリジナルスキーマ113aに対して実行する。
図20は、スキーマ変換装置200における制限候補の選択処理を示すフローチャートである。
まず、スキーマ編集部226は、例えば、図19に示すエディタ画面226aを出力部140に表示して、別ウィンドウにて表示する制限候補の入力を受け付ける(S80)。
そして、スキーマ編集部226は、入力部130を介して、行数表示領域226cに配置されているマーク226dを指定した実行指示の入力を受け付けると、入力された制限候補を特定する情報を表示する(S81)。
ここでは、スキーマ編集部226は、ステップS80で選択されたマーク226dに関連する行数で特定されるパーティクルの要素宣言IDが、第一制限候補テーブル115aの要素宣言ID欄115c、または、第二制限候補テーブル115gの要素宣言ID欄115i、に格納されているレコードを特定し、特定したレコードより、少なくとも制約条件の種別欄115d、115k及び制約条件の候補欄115e、115lに格納されている情報を抽出し、抽出した情報を所定の表示形式に編集して、エディタ画面226aの所定の位置に表示する。
そして、スキーマ編集部226は、入力部130を介して、表示した制限候補を特定した実行指示の入力を受け付けると、選択された制限候補に対応する第一制限候補テーブル115a又は第二制限候補テーブル115gのレコードに格納されている情報をスキーマ変換部225に通知し、スキーマ変換部225は、オリジナルスキーマ113aの変換を実行する(S83)。なお、変換を行った制限候補については、マーク226dを外したり、既に処理済みであることを明示したりする等の処理を行うことが望ましい。
ステップS80〜S83までの処理は、入力部130を介して、編集の終了の指示の入力を受け付けるまで行う(S84)。
そして、スキーマ変換部225は、変換後スキーマを変換後スキーマ記憶領域116に記憶する(S85)。
以上のように、本実施形態においては、オリジナルスキーマ113aの変換を行う前に、変換候補を表示して、オペレータの選択を受け付けることで、オペレータが望まない変換が行われてしまうことを防止することができる。このような場合でも、変換候補は、サンプルデータ114aに基づいて既に絞り込まれているため、オペレータは効率的に変換候補を選択することができる。
なお、以上に記載した実施形態においては、設定情報記憶領域112に記憶されている設定情報に基づいて制限候補を絞り込んでから、制限候補の選択を受け付けているが、このような態様に限定されず、設定情報記憶領域112に記憶されている設定情報に基づいて制限候補を絞り込まずに、スキーマ編集部226による編集処理を行ってもよい。
図21は、本発明の第三の実施形態であるWebサービスシステム370の概略図である。
図示するように、Webサービスシステム370は、スキーマ変換装置300と、クライアント端末374と、を備え、これらはネットワーク381を介して、相互に情報の送受信を行うことができるようにされている。
ここで、クライアント端末374は、通常のパーソナルコンピュータで構成可能であるため、詳細な説明を省略する。
図22は、スキーマ変換装置300の概略図である。
図示するように、スキーマ変換装置300は、記憶部310と、制御部320と、入力部130と、出力部140と、通信部150と、を備える。
記憶部310は、スキーマリポジトリ記憶領域111と、設定情報記憶領域112と、オリジナルスキーマ記憶領域113と、サンプルデータ記憶領域114と、制限候補情報記憶領域115と、変換後スキーマ記憶領域116と、ログ情報記憶領域317と、を備え、第一の実施形態と比較して、ログ情報記憶領域317が追加されているため、以下、ログ情報記憶領域317に関連する事項について説明する。
ログ情報記憶領域317には、スキーマ検証部122において、スキーマ検証の対象となったXML文書が、変換後スキーマに対しては妥当ではないが、オリジナルスキーマに対しては妥当であると判断された場合に、当該XML文書を特定する情報と、当該XML文書が、変換後スキーマに対しては妥当ではないが、オリジナルスキーマに対しては妥当であることを特定する情報と、が関連付けられて記憶される。
制御部320は、全体制御部121と、スキーマ検証部122と、探索部123と、制限候補情報更新部124と、スキーマ変換部125と、ログ取得部327と、アプリケーション部328と、を備え、第一の実施形態と比較して、ログ取得部327及びアプリケーション部328が異なっているため、以下これらに関連する事項について説明する。
ログ取得部327は、スキーマ検証部122において、スキーマ検証の対象となったXML文書が、変換後スキーマに対しては妥当ではないが、オリジナルスキーマに対しては妥当であると判断された場合に、当該XML文書を特定する情報と、当該XML文書が、変換後スキーマに対しては妥当ではないが、オリジナルスキーマに対しては妥当であることを特定する情報と、が関連付けてログ情報としてログ情報記憶領域317に記憶する。
また、ログ取得部327は、スキーマ検証部122において、スキーマ検証の対象であるXML文書が、オリジナルスキーマ113aに対しては妥当であり、変換後スキーマ116aに対しては妥当ではないと判断された場合に、当該XML文書のログ情報を、当該XML文書を送信してきたクライアント端末374に送信する処理を行う。
アプリケーション部は、スキーマ検証部122において妥当と判断された検証済みXML文書を用いて、例えば、商品の受注処理や旅行の予約処理など、何らかの業務処理を実行する。
図23は、スキーマ変換装置300においてXML文書の検証する際の処理を示すフローチャートである。
まず、スキーマ変換装置300では、全体制御部121が、通信部150を介して、クライアント端末374よりXML文書を受信する(S90)。
次に、スキーマ検証部122は、変換後スキーマ記憶領域116に記憶されている変換後スキーマを用いて、ステップS90で受信したXML文書のスキーマ検証を行う(S91)。
そして、スキーマ検証部122は、XML文書が変換後スキーマ116aに対して妥当か否かを判断し(S92)、妥当である場合には(ステップS92でYes)ステップS93に進み、妥当でない場合には(ステップS92でNo)ステップS94に進む。
ステップS93では、スキーマ検証部122は、妥当と判断された検証済みXML文書をアプリケーション部328に出力する。
一方、ステップS94では、スキーマ検証部122は、ステップS92で変換後スキーマに対して妥当ではないと判断されたXML文書を、オリジナルスキーマ記憶領域113に記憶されているオリジナルスキーマ113aを用いて、スキーマ検証を行う。
そして、スキーマ検証部122は、XML文書がオリジナルスキーマ113aに対して妥当か否かを判断し(S95)、妥当である場合には(ステップS95でYes)ステップS96に進み、妥当でない場合には(ステップS95でNo)ステップS97に進む。
ステップS96では、ログ取得部327は、スキーマ検証の対象となったXML文書がを特定する情報と、当該XML文書が、変換後スキーマに対しては妥当ではないが、オリジナルスキーマに対しては妥当であることを特定する情報と、が関連付けてログ情報としてログ情報記憶領域317に記憶する。
ステップS97では、全体制御部121は、XML文書がスキーマ検証で妥当でないと判断された旨を通知するエラーメッセージ(ログ情報がある場合には、当該ログ情報を添付して)をクライアント端末374に送信する。
以上のような処理を行うことにより、スキーマの変換を行うことにより、スキーマ検証の結果が異なることとなった履歴(ログ)を取得することができ、当該履歴(ログ)を分析することで、スキーマ変換の妥当性を判断することができるようになる。
以上に記載した実施形態においては、制約条件の厳しい変換後スキーマを用いて、XML文書のスキーマ検証を実施するようにしている。しかしながら、スキーマ文書の利用用途はスキーマ検証だけではなく、他の用途に使用してもよい。
例えば、変換後スキーマをWSDLの中に含めてインターフェースとして公開してもよい。また、JAXB(Java Architecture for XML Binding)などのデータバインディングツールでは、スキーマ文書の情報を元にJava(登録商標)のクラスを生成することができる。変換後ツールは、JAXBを用いてJava(登録商標)のクラスを生成する際に利用してもよい。
また、制限候補情報を保存しておけば、同じもしくは類似するオリジナルスキーマに対して変換を再度行なう場合、容易に再変換を実施することができる。
オリジナルスキーマを制約条件の厳しいスキーマに変更した後に、オリジナルスキーマの方に修正が加わってしまう可能性がある。その場合、スキーマの変更を再度実施することが考えられる。スキーマの変更を手作業で行っている場合、このような作業は非常に負担が大きい。しかし、本発明を用いると、制限候補情に変更内容が含まれているため、制限候補情を保存しておくことで、容易に再変換が可能である。
また、本実施形態では、any要素による任意の要素の出現を許す制約条件を、具体的な要素、例えばDiscount要素の出現だけを許す制約条件に変換する方法を説明した。ここでは具体的な要素名を特定できる場合を例に取り説明したが、具体的な要素名を特定することが困難な場合、例えば出現を許す要素の名前空間URIや名前空間の種別を特定するように制約条件を変更してもよい。any要素ではnamespace属性により出現を許す名前空間を特定することができる。例えば、namespace属性に##otherを指定した場合、対象名前空間以外の名前空間に属する要素の出現を許す。また、namespace属性に##targetNamespaceを指定すると、出現を許す具体的な名前空間URLを指定することができる。
また、図4の27行目のany要素を変換する場合、例えばany要素のnamespace属性に##otherを設定することで、対象名前空間とは異なる名前空間に属するDiscount要素の出現を許しつつ、対象名前空間に属する要素の出現を禁止することができるため、具体的な要素名を特定することなく制約条件を厳しくすることができる。また、##targetNamespaceを利用してDiscount要素が属する名前空間URIであるhttp://example.org/orderを指定することで、http://example.org/orderの名前空間URIに属するもののみ出現を許すことができ、より制約条件を厳しくすることができる。