(57)【要約】【課題】  リレーショナルおよび非リレーショナルデータソースにまたがって１つまたは複数のＸＭＬ言語照会のセマンティック表現を生成するコンピュータシステムおよび方法を提供すること。【解決手段】  セマンティック中間言語表現は、１つまたは複数のＸＭＬ言語照会の意味を明示的に記述する。セマンティック中間言語は、元のクエリの演算を記述するノードを備えたグラフ構造とすることができる。セマンティックグラフ中のノードに割り当てられた演算子は、元のＸＭＬクエリの確定的な定義を可能にする。セマンティック中間言語を使用して、単一または複数のデータソースにわたるＸＭＬクエリを実行することができる。方法は、少なくとも１つの照会を受け取り、受け取った照会内の演算ごとに少なくとも１つのノードオブジェクトを定義し、演算子を使用して各ノードオブジェクトをトランスレートし、演算子からセマンティック表現を生成することを含む。【選択図】  図２
2005018776.tif 000002
【特許請求の範囲】
【請求項１】
リレーショナルおよび非リレーショナルデータソースにまたがる１つまたは複数のＸＭＬ言語照会のセマンティック表現のための方法であって、
少なくとも１つの照会を受け取ることと、
前記少なくとも１つの受け取った照会内で演算ごとに少なくとも１つのノードオブジェクトを定義することと、
前記少なくとも１つのノードオブジェクトのそれぞれを、演算子を使用してトランスレートすることと
前記演算子からセマンティック表現を生成することとを備え、
前記セマンティック表現は、前記１つまたは複数のＸＭＬ言語照会の意味を明示的に記述することを特徴とする方法。
【請求項２】
前記セマンティック表現は、ターゲットクエリエンジンによる解釈および実行のために形成される中間言語表現であることを特徴とする請求項１に記載の方法。
【請求項３】
前記非リレーショナルデータソースは、テキスト文書、スプレッドシート、および非リレーショナルデータベースのうちの１つまたは複数を備えることを特徴とする請求項２に記載の方法。
【請求項４】
前記生成するステップは、前記受け取った照会の高水準の演算を明示的部分に落し込むことをさらに備えることを特徴とする請求項１に記載の方法。
【請求項５】
前記明示的部分は、複数のＸＭＬ言語にまたがって共通であることを特徴とする請求項４に記載の方法。
【請求項６】
前記演算子は、特殊演算子、データソース、リテラル、ブール演算子、シーケンス演算子、算術演算子、文字列演算子、値比較演算子、ノード比較演算子、タプルスペース、関数定義および呼び出し、ＸＭＬナビゲーション、ＸＭＬ構造、ＸＭＬプロパティアクセサ、型演算子、言語固有演算子、およびデータ操作演算子のうちの１つまたは複数を備えることを特徴とする請求項１に記載の方法。
【請求項７】
前記少なくとも１つのノードオブジェクトのグラフデータ構造を形成することをさらに備えることを特徴とする請求項１に記載の方法。
【請求項８】
前記少なくとも１つの受け取った照会は、ＸＭＬクエリ言語およびＸＭＬビュー定義言語のうちの１つまたは複数を備えることを特徴とする請求項１に記載の方法。
【請求項９】
前記少なくとも１つの受け取った照会は、ＸＰａｔｈ、ＸＳＬＴ、ＸＱｕｅｒｙ、ＤＭＬ、ＯＰａｔｈ、および注釈付きスキーマ照会のうちの１つまたは複数を備えることを特徴とする請求項１に記載の方法。
【請求項１０】
前記セマンティック言語表現は、リレーショナルデータのＸＭＬビューにわたってＸＭＬクエリを可能にするものであることを特徴とする請求項１に記載の方法。
【請求項１１】
複数のデータソースにまたがってＸＭＬクエリおよびＸＭＬビューのうちの１つまたは複数の意味を表現するためのセマンティック解釈プログラムであって、
照会を形成する前記ＸＭＬクエリおよびＸＭＬビューのうちの１つまたは複数を受け取るための入力と、
前記照会内の演算ごとにノードオブジェクトを定義するためのグラフ構造ジェネレータと、
各ノードオブジェクトに演算子を割り当てるためのトランスレータであって、前記演算子は前記照会の演算を明示的部分に落し込むトランスレータと、
前記明示的部分を、前記ＸＭＬクエリおよびＸＭＬビューのうちの１つまたは複数の意味を表現するための中間言語表現として提供するための出力と
を備えたことを特徴とするセマンティック解釈プログラム。
【請求項１２】
前記複数のデータソースは、リレーショナルおよび非リレーショナルデータソースを備えたことを特徴とする請求項１１に記載のセマンティック解釈プログラム。
【請求項１３】
前記非リレーショナルデータソースは、テキスト文書、スプレッドシート、および非リレーショナルデータベースのうちの１つまたは複数を備えたことを特徴とする請求項１２に記載のセマンティック解釈プログラム。
【請求項１４】
前記演算子は、特殊演算子、データソース、リテラル、ブール演算子、シーケンス演算子、算術演算子、文字列演算子、値比較演算子、ノード比較演算子、タプルスペース、関数定義および呼び出し、ＸＭＬナビゲーション、ＸＭＬ構造、ＸＭＬプロパティアクセサ、型演算子、言語固有演算子、およびデータ操作のうちの１つまたは複数を備えたことを特徴とする請求項１１に記載のセマンティック解釈プログラム。
【請求項１５】
前記明示的部分は、複数のＸＭＬ言語にまたがって共通であることを特徴とする請求項１１に記載のセマンティック解釈プログラム。
【請求項１６】
前記中間言語表現は、ターゲットクエリエンジンによる解釈および実行のために形成されることを特徴とする請求項１１に記載のセマンティック解釈プログラム。
【請求項１７】
受け取った照会の中間言語表現の方法を実行するためのコンピュータ実行可能命令を有するコンピュータ読取り可能媒体であって、
前記受け取った照会を形成するＸＭＬクエリおよびＸＭＬビューのうちの１つまたは複数を受け取ることと、
前記受け取った照会内で演算ごとにノードオブジェクトを定義することと、
前記受け取った照会の演算を明示的部分に落し込む演算子を使用して各ノードをトランスレートすることと、
リレーショナルおよび非リレーショナルデータソースのうちの１つまたは複数にわたる後続のクエリのための中間言語表現を形成する前記明示的部分に対応する命令を生成することと
を備えたことを特徴とするコンピュータ読取り可能媒体。
【請求項１８】
前記演算子は、特殊演算子、データソース、リテラル、ブール演算子、シーケンス演算子、算術演算子、文字列演算子、値比較演算子、ノード比較演算子、タプルスペース、関数定義および呼び出し、ＸＭＬナビゲーション、ＸＭＬ構造、ＸＭＬプロパティアクセサ、型演算子、言語固有演算子、およびデータ操作のうちの１つまたは複数を備えたことを特徴とする請求項１７に記載のコンピュータ読取り可能媒体。
【請求項１９】
前記明示的部分は、複数のＸＭＬ言語にまたがって共通であることを特徴とする請求項１７に記載のコンピュータ読取り可能媒体。
【請求項２０】
前記受け取った照会は、ＸＭＬクエリ言語およびＸＭＬビュー定義言語のうちの１つまたは複数を備えたことを特徴とする請求項１７に記載のコンピュータ読取り可能媒体。
【請求項２１】
照会のセマンティック表現を生成するためのコンピュータシステムは、
コンピュータ命令を実行するためのプロセッサと、
少なくとも１つのモジュールであって、
前記照会を形成するＸＭＬクエリおよびＸＭＬビューのうちの１つまたは複数を受け取るための入力機能と、
前記照会内の演算ごとにノードオブジェクトを定義するためのグラフ構造ジェネレータと、
各ノードオブジェクトに演算子を割り当てるためのトランスレータ機能であって、前記演算子が前記照会の演算を明示的部分に落し込むトランスレータ機能と、
前記明示的部分を、前記ＸＭＬクエリおよびＸＭＬビューの意味を表現するための中間言語表現として提供するための出力と
を備えた少なくとも１つのモジュールと
を備え、
前記少なくとも１つのモジュールは、１つまたは複数のソフトウェアモジュールおよび１つまたは複数のハードウェアモジュールのうちの１つまたは複数を備えたことを特徴とするコンピュータシステム。
【請求項２２】
前記演算子は、特殊演算子、データソース、リテラル、ブール演算子、シーケンス演算子、算術演算子、文字列演算子、値比較演算子、ノード比較演算子、タプルスペース、関数定義および呼び出し、ＸＭＬナビゲーション、ＸＭＬ構造、ＸＭＬプロパティアクセサ、型演算子、言語固有演算子、およびデータ操作のうちの１つまたは複数を備えたことを特徴とする請求項２１に記載のコンピュータシステム。
【請求項２３】
前記明示的部分は、複数のＸＭＬ言語にまたがって共通であることを特徴とする請求項２１に記載のコンピュータシステム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は一般に、データソースにわたってクエリを行うソフトウェアの分野に関し、より詳しくは、中間言語を使用して１つまたは複数のＸＭＬまたは仮想ＸＭＬデータソースにわたってクエリを行うことに関する。
【背景技術】
【０００２】
ＸＭＬ（ｅＸｔｅｎｓｉｂｌｅ  Ｍａｒｋｕｐ  Ｌａｎｇｕａｇｅ）は、汎用シンタックスを提供して人間が読み取ることができるタグでデータをマークアップする文書フォーマット化のためのＷｏｒｌｄ  Ｗｉｄｅ  Ｗｅｂコンソーシアム（Ｗ３Ｃ）公認規格である。ＸＭＬは、タグおよびエレメントの固定のセットを有しておらず、そのためＸＭＬ規格に準拠する限り、ユーザはこのようなタグを定義することができる。データは、テキストマークアップで囲まれているテキストの文字列としてＸＭＬ文書に格納することができる。Ｗ３Ｃは、ＸＭＬ情報セット（ＸＭＬ  Ｉｎｆｏｓｅｔ）と呼ばれる仕様においてＸＭＬの抽象データモデルを成文化している。Ｉｎｆｏｓｅｔは、プロパティ収容ノードに関してＸＭＬ文書の論理構造を記述している。ＸＭＬは、文書のコンテンツを適切に定義されたフォーマットで容易に記述することができるが、それらの構造が標準テキスト文書のものと一貫していないためか、またはＸＭＬと適合性のない何らかのその他の特徴のために、それほど容易に記述することのできない他のソースのデータがある。このようなデータソースの一例がスプレッドシートまたはリレーショナルデータベースである場合がある。
【０００３】
仮想ＸＭＬとは、多様なデータアクセスプログラミングモデルにわたって一貫性を確立する概念であり、実際の記憶フォーマットの代わりにユーザが考える方法でユーザのデータを扱うことができるようにする。仮想ＸＭＬデータを介したクエリの概念には、現実には決してデータをＸＭＬに変換することなく、データをあたかもＸＭＬであるかのように扱うことが含まれる。この概念の利点の１つは、ＸＭＬエンコード化のオーバヘッドが最小限に抑えられることである。仮想ＸＭＬのシナリオでは、クエリ言語を使用して、あたかもデータソースがＸＭＬであるかのように非ＸＭＬデータソースにわたってクエリを行うことができるという利点があれば望ましい。さらに、実際のデータと仮想ＸＭＬ表示との間のマッピングの忠実性が高いことも望まれる。
【０００４】
仮想ＸＭＬを実装するには固有の課題が数多くある。問題の１つは効率である。ＸＭＬＲｅａｄｅｒ（商標）などの仮想ＸＭＬインターフェースを用いて、データソースを単に公開し、その後、ＸＰａｔｈＮａｖｉｇａｔｏｒ（商標）などの既存のＸＭＬクエリ実装を用いて、そのインターフェースを介してクエリを行うことができる。しかし、作業のすべては、データソースそれ自体によって実行されるのではなく、ＸＭＬクエリエンジンで発生する。
【発明の開示】
【発明が解決しようとする課題】
【０００５】
例として、ＳＱＬＳｅｒｖｅｒに具体化されたＳＱＬ（ｓｔｒｕｃｔｕｒｅｄ  ｑｕｅｒｙ  ｌａｎｇｕａｇｅ）を介して次のような仮想ＸＭＬクエリを考えてみる：
ｓｑｌ：ｄａｔａｂａｓｅ（“Ｎｏｒｔｈｗｉｎｄ”／Ｃｕｓｔｏｍｅｒ［＠ＩＤ＝‘ＡＬＫＦＩ’］／Ｏｒｄｅｒ
【０００６】
このクエリでは、ｓｑｌ：ｄａｔａｂａｓｅ（“Ｎｏｒｔｈｗｉｎｄ”）は、仮想ＸＭＬとしてＳＱＬＳｅｒｖｅｒのＮｏｒｔｈｗｉｎｄデータベースを公開し、そして、ＸＰａｔｈ／Ｃｕｓｔｏｍｅｒ［＠ＩＤ＝‘ＡＬＫＦＩ’］／ＯｒｄｅｒがＣｕｓｔｏｍｅｒエレメントのうちの１つからすべてのＯｒｄｅｒエレメントを選択する。一実施例では、次のような試みが行われる可能性がある：
【０００７】
ＳＱＬＳｅｒｖｅｒＭａｐｐｉｎｇ  ｍａｐ  ＝  ｎｅｗ  ＳＱＬＳｅｒｖｅｒＭａｐｐｉｎｇ（“Ｎｏｒｔｈｗｉｎｄ”）；
ＳＱＬＳｅｒｖｅｒＸｍｌＲｅａｄｅｒ  Ｄａｔａ  ＝  ｎｅｗ  ＳＱＬＳｅｒｖｅｒＸｍｌＲｅａｄｅｒ（ｍａｐ）；
ＸＰａｔｈＮａｖｉｇａｔｏｒ  ｎａｖ  ＝  ｎｅｗ  ＸｐａｔｈＮａｖｉｇａｔｏｒ（ｄａｔａ，“／Ｃｕｓｔｏｍｅｒ［＠ＩＤ＝’ＡＬＫＦＩ’］／Ｏｒｄｅｒ；
【０００８】
このアプローチでは、少なくとも２つの欠陥がある。先ず、マッピング全体が、たとえその一部のみがクエリに使用されている場合であっても、ＸｍｌＲｅａｄｅｒによって行われることである。第２の欠点は、ＳＱＬＳｅｒｖｅｒはＸＰａｔｈＮａｖｉｇａｔｏｒよりもはるかに効率的に、ＩＤ別にＣｕｓｔｏｍｅｒｓを選択できることである。上記の例では、ＸＰａｔｈＮａｖｉｇａｔｏｒが作業のすべてを行っていることに留意されたい。この課題に対するより良い解決策は、できるだけ多くのクエリをデータソース（ここではＳＱＬＳｅｒｖｅｒデータベース）にオフロードすることであろう。しかし、これにはかなりのクエリ解析および書き換えを伴う可能性がある。
【０００９】
仮想ＸＭＬを実装するにあたっての別の問題は、ＸＭＬデータモデルが基礎となるデータモデルおよびその型システムと常にうまく整合していないことである。基礎となるデータソースの型のすべてをＸＭＬ型にマップすることがきるであろうが、このプロセスにより忠実性が失われ、非効率的にもなる。さらに、あるシステムにおける型が、別のシステムで明白な等価物を持たない可能性がある。たとえば、ＸＭＬでイメージなどのバイナリデータを表すには、ＸＭＬ文字セット（たとえばｂａｓｅ６４エンコード）へのコストのかかる変換が必要である。
【００１０】
仮想ＸＭＬを介してクエリを行うための以前の試みでは、１つはクエリ、もう１つはマッピングのための２つの異なるデータ構造を構築し、そしてそれらをタンデムにトラバースして、仮想ＸＭＬビューを実体化することなく、直接元のデータソースを介して効率的なクエリを生成することによって、この問題に対処していた。このアプローチは、当初はうまく機能するが、クエリおよびマッピング言語が複雑化するにつれて開発が桁外れに難しくなる。クエリまたはマッピングの概念は、直接ターゲットのデータモデルにトランスレートされないことが多く、複雑なビューを備えた複雑なクエリを構成することは、大量のセマンティック解析（ｓｅｍａｎｔｉｃ  ａｎａｌｙｓｉｓ）および書き換えを必要とする。
【００１１】
このように、ＸＭＬおよび非ＸＭＬデータソースを介したＸＭＬクエリおよびビューのための仮想ＸＭＬを実施するために、統一表現が求められている。クエリを、複雑なマッピングを介して、クエリを構成するあまり複雑でない問題に実装し、これらのクエリをあまり複雑でないマッピングを介して実行する方法およびシステムが望まれている。本発明は前述のニーズおよび欠点に取り組み、本明細書で表明されるような追加の利点によりこれらを解決する。
【課題を解決するための手段】
【００１２】
本発明は、ＸＭＬ言語のクエリまたはビューの意味を表す、クエリ中間言語（ＱＩＬ：ｑｕｅｒｙ  ｉｎｔｅｒｍｅｄｉａｔｅ  ｌａｎｇｕａｇｅ）と称されるＸＭＬ中間言語定義を対象とする。ＱＩＬは、ＸＭＬにおけるクエリまたはビューの意味の抽象化であり、クエリを実行するために使用するか、またはターゲット言語においてクエリを実行するための言語トランスレータまたはコンパイラへの入力として使用することができる。ＱＩＬを使用すると、リレーショナルおよび非リレーショナルの両方のデータソースにわたってクエリすることができる。
【００１３】
本発明の態様によれば、ＱＩＬは、ＸＭＬ言語照会を受け取り、ＸＭＬ言語照会内の演算ごとに少なくとも１つのノードオブジェクトを定義し、定義されたノードオブジェクトのそれぞれをＱＩＬ特有の演算子を使用してトランスレートし、そしてノードグラフの演算子から元の照会のクエリ中間言語表現を生成することによって構築される。
【００１４】
通常、ＱＩＬ言語は、ＸＭＬクエリおよびビューが生成されるＸＭＬ言語用のフロントエンドコンパイラと、ＱＩＬジェネレータと、ＸＭＬクエリまたはビューのＱＩＬセマンティック表現（ｓｅｍａｎｔｉｃ  ｒｅｐｒｅｓｅｎｔａｔｉｏｎ）を使用して１つまたは複数のデータソースにわたって検索することのできるバックエンドエンジンとを含むコンピュータシステムの一部として使用される。クエリされるデータソースは、リレーショナルデータまたは非リレーショナルデータであってよい。
【００１５】
フロントエンドＸＭＬ言語の例には、ＸＰａｔｈ、ＸＳＬＴ、ＸＱｕｅｒｙ、ＤＭＬ、ＯＰａｔｈ、および注釈付きスキーマ（Ａｎｎｏｔａｔｅｄ  Ｓｃｈｅｍａ）がある。バックエンドエンジンタイプの例として、言語変換器をクエリするためのＱＩＬを挙げることができ、この場合クエリ言語は、いくつかの例を挙げるとＳＱＬ、ＭＳＩＬ、およびＸＱｕｅｒｙなど、数多くのデータ検索言語のうちのいずれであってもよい。
【００１６】
例示的なＱＩＬ定義には、ＸＭＬクエリおよびビュー式の意味を表すための確定的で明示的な命令を提供するノード定義演算子として使用することのできるＸＭＬＩｎｆｏｓｅｔに基づいてうまく定義された演算子のセットが含まれる。この演算子には、たとえば、タプル（ｔｕｐｌｅ）、リテラル、ブール演算子、シーケンス演算子、算術演算子、文字列演算子、値比較演算子、ノード比較演算子、関数定義および呼び出し、ＸＭＬナビゲーション、ＸＭＬ構造体、ＸＭＬプロパティアクセサ（ａｃｃｅｓｓｏｒ）、型演算子、言語固有演算子、データ操作、特殊演算子、ならびにデータソース演算子などが含まれることが望ましい。
【発明を実施するための最良の形態】
【００１７】
本発明の追加の機能および利点は、付随する図面を参照して進める以下の例示的な実施形態の詳細な説明から明らかになろう。
【００１８】
前述の概要ならびに以下の好ましい実施形態に関する詳細な説明は、添付の図面と共に読むことでより良く理解される。本発明を例示する目的で本発明の例示的な構造が図面に示されているが、本発明は、開示された特定の方法および手段に限定されるものではない。
【００１９】
（概要）
本発明のＸＭＬ中間言語は、クエリの意味またはセマンティックを明示的に表す。ＸＭＬ中間言語は、クエリ中間言語（ＱＩＬ）と称される。
【００２０】
ＸＭＬ中間言語ＱＩＬは、（１）それによってクエリ／ビュー複合（ｃｏｍｐｏｓｉｔｉｏｎ）問題がかなり簡略化されるＸＭＬクエリおよびＸＭＬビューの統一表現、ならびに（２）システムのインターフェースをかなり簡略化する「仮想ＸＭＬ」としてすべてのビューを取り扱うこと、を提供する。あらゆる考えられる言語およびデータモデルについて１つのＡＰＩを有する代わりに、すべてのＡＰＩが共通のデータモデル、すなわちＸＭＬ中間言語ＱＩＬの演算子を共有することができる。
【００２１】
ＱＩＬは、よく知られたコンパイラ問題についても取り組んでいる。通常、ある言語で、コンパイラはＮ個のバックエンドターゲットマシンにわたってＭ個のフロントエンド言語を実装する必要がある。各２つ１組の組合せが実装される場合、必要な組合せをカバーするにはＭ×Ｎ個のコンパイラ実装が必要になる。しかし、共通の中間表現を導入することでこれら２つが分離されれば、コンパイラの複雑さはＭ＋Ｎだけにまで低減される。
【００２２】
クエリ中間言語は、このようなコンパイラの複雑さの低減に対応するために、ＸＭＬクエリ／ビュー言語とターゲットデータモデル（．ＮＥＴの実ＸＭＬデータ、ＳＱＬデータまたはファイルシステムにわたる仮想ＸＭＬビュー）との間の抽象化を提供する。
【００２３】
クエリ中間言語は、ＸＭＬクエリ言語それら自体のどれよりも表現に富む場合がある。これにより、クエリおよびビューにオリジナル言語だけが使用された場合には可能ではなかったであろう新しい種類の解析および最適化が可能である。
【００２４】
（例示的なコンピューティングデバイス）
図１および以下の考察は、本発明が実施可能な好適なコンピューティング環境の簡単な一般的説明を提供することを意図している。しかし、すべての種類のハンドヘルド、ポータブルおよびその他のコンピューティングデバイス、ならびにコンピューティングオブジェクトが、前述のように本発明に関連した使用に企図されていることが理解されるべきである。このように、以下では汎用コンピュータについて説明するが、これは一例に過ぎず、本発明は、ネットワーク／バスの相互運用性およびやりとりを有するクライアントなど、その他のコンピューティングデバイスで実施することもできる。このように、本発明は、ほんの僅かまたは最小限のクライアントリソースしか関与していないネットワーク化されたホストサービスの環境で実施することができ、これは、たとえばクライアントデバイスがアプライアンス内に配置されたオブジェクト、またはその他のコンピューティングデバイスおよびオブジェクトなど、ネットワーク／バスへの単なるインターフェースとして機能するネットワーク化された環境である。本質において、データを格納することができるか、またはデータを取り出すことのできる場所であればどこでも、本発明による操作にとって望ましいか、または適した環境である。
【００２５】
必須ではないが、本発明は、デバイスまたはオブジェクトのためのサービスの開発者による使用のために、オペレーティングシステムを介して実施すること、および／または本発明に従って動作するアプリケーションソフトウェア内に含めることができる。ソフトウェアは、クライアントワークステーション、サーバ、またはその他のデバイスなど、１つまたは複数のコンピュータによって実行されている、プログラムモジュールなどのコンピュータ実行可能命令の一般的な関連で説明することができる。一般に、プログラムモジュールには、特定のタスクを行うかまたは特定の抽象データ型を実装するルーチン、プログラム、オブジェクト、コンポーネント、データ構造などが含まれる。一般に、プログラムモジュールの機能は、所望に応じて、様々な実施形態で組合せるか、または分散させることができる。さらに当業者であれば、本発明が他のコンピュータ構成でも実施可能であることを理解されよう。本発明と共に使用するのに適する可能性のあるその他のよく知られたコンピューティングシステム、環境、および／または構成には、パーソナルコンピュータ（ＰＣ）、現金自動預払機、サーバコンピュータ、ハンドヘルドもしくはラップトップデバイス、マルチプロセッサシステム、マイクロプロセッサベースのシステム、プログラム可能な民生用電子機器、ネットワークＰＣ、アプライアンス、照明、環境制御要素、ミニコンピュータ、メインフレームコンピュータなどが含まれるが、これらに限定されない。本発明は、通信ネットワーク／バスまたはその他のデータ伝送媒体を介してリンクされたリモート処理デバイスによってタスクが実行される分散コンピューティング環境で実施することもできる。分散コンピューティング環境では、メモリ記憶デバイスを含むローカルおよびリモートの両方のコンピュータ記憶媒体に、プログラムモジュールを配置することが可能であり、クライアントノードはサーバノードとして振る舞うことがある。
【００２６】
図１は、本発明が実施可能な好適なコンピューティングシステム環境１００の一例を示しているが、上記で明らかにしたように、コンピューティングシステム環境１００は好適なコンピューティング環境の一例に過ぎず、本発明の用途または機能の範囲についていかなる限定を示唆するものではない。コンピューティング環境１００は、例示的なオペレーティング環境１００に示された構成要素のいずれか１つまたはそれらの組合せに関して、どのような依存性または要件を有するものと解釈されるべきではない。
【００２７】
図１を参照すると、本発明を実施するための例示的なシステムには、コンピュータシステム１１０の形態の汎用コンピューティングデバイスが含まれる。コンピュータシステム１１０の構成要素は、処理ユニット１２０、システムメモリ１３０、および、システムメモリを含む様々なシステム構成要素を処理ユニット１２０に結合するシステムバス１２１を含むことができるが、これらに限定されるものではない。システムバス１２１は、メモリバスまたはメモリコントローラ、周辺バス、および様々なバスアーキテクチャのうちのいずれかを使用するローカルバスを含む、いくつかのタイプのバス構造のうちのいずれかであってよい。限定ではなく、例として、このようなアーキテクチャには、ＩＳＡ（Ｉｎｄｕｓｔｒｙ  Ｓｔａｎｄａｒｄ  Ａｒｃｈｉｔｅｃｔｕｒｅ）バス、ＭＣＡ（Ｍｉｃｒｏ  Ｃｈａｎｎｅｌ  Ａｒｃｈｉｔｅｃｔｕｒｅ）バス、ＥＩＳＡ（Ｅｎｈａｎｃｅｄ  ＩＳＡ）バス、ＶＥＳＡ（Ｖｉｄｅｏ  Ｅｌｅｃｔｒｏｎｉｃｓ  Ｓｔａｎｄａｒｄｓ  Ａｓｓｏｃｉａｔｉｏｎ）ローカルバス、およびＰＣＩ（Ｐｅｒｉｐｈｅｒａｌ  Ｃｏｍｐｏｎｅｎｔ  Ｉｎｔｅｒｃｏｎｎｅｃｔ）バス（メザニンバスとしても知られている）が含まれる。
【００２８】
コンピュータシステム１１０は、通常、様々なコンピュータ読取り可能媒体を含む。コンピュータ読取り可能媒体は、コンピュータシステム１１０によってアクセスすることができる任意の利用可能な媒体であってよく、揮発性および不揮発性の媒体、取外し可および取外し不可の媒体の両方を含む。限定ではなく、例として、コンピュータ読取り可能媒体は、コンピュータ記憶媒体および通信媒体を含むことがある。コンピュータ記憶媒体は、コンピュータ読取り可能命令、データ構造、プログラムモジュール、またはその他のデータなど、情報を格納するための任意の方法または技術で実施された、揮発性および不揮発性、取外し可および取外し不可の媒体を含む。コンピュータ記憶媒体は、ＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）、ＲＯＭ（Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）、ＥＥＰＲＯＭ（Ｅｌｅｃｔｒｉｃａｌｌｙ  Ｅｒａｓａｂｌｅ  Ｐｒｏｇｒａｍｍａｂｌｅ  Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）、フラッシュメモリもしくはその他のメモリ技術、ＣＤＲＯＭ（Ｃｏｍｐａｃｔ  Ｄｉｓｋ  Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）、ＣＤＲＷ（ｃｏｍｐａｃｔ  ｄｉｓｋ−ｒｅｗｒｉｔａｂｌｅ）、ＤＶＤ（ｄｉｇｉｔａｌ  ｖｅｒｓａｔｉｌｅ  ｄｉｓｋｓ）もしくはその他の光ディスクストレージ、磁気カセット、磁気テープ、磁気ディスクストレージもしくはその他の磁気記憶デバイス、または所望の情報を格納するために使用することができ、コンピュータシステム１１０によってアクセスすることができる任意のその他の媒体を含むが、これらに限定されない。通信媒体は、通常、コンピュータ読取り可能命令、データ構造、プログラムモジュール、または他のデータを、搬送波または他のトランスポートメカニズムなどの変調データ信号で具体化し、任意の情報配信媒体を含む。「変調データ信号」という用語は、情報を信号内に符号化するような方法でその特徴のうちの１つまたは複数を設定または変更した信号を意味する。限定ではなく、例として、通信媒体には、有線ネットワークまたは直接配線ド接続などの有線媒体、ならびに、音響、ＲＦ、赤外線およびその他の無線媒体などの無線媒体が含まれる。上記のいずれかの組合せも、コンピュータ読取り可能媒体の範囲に含まれるものとする。
【００２９】
システムメモリ１３０は、読取り専用メモリ（ＲＯＭ）１３１およびランダムアクセスメモリ（ＲＡＭ）１３２などの、揮発性および／または不揮発性メモリの形態のコンピュータ記憶媒体を含む。起動時などにコンピュータシステム１１０内の要素間での情報の転送を助ける基本ルーチンが入っている基本入出力システム（ＢＩＯＳ）１３３は、通常はＲＯＭ１３１に格納される。ＲＡＭ１３２は、通常、処理ユニット１２０によって即時にアクセス可能であり、そして／または現在操作中であるデータおよび／またはプログラムモジュールを収容する。限定ではなく、例として、図１には、オペレーティングシステム１３４、アプリケーションプログラム１３５、他のプログラムモジュール１３６、およびプログラムデータ１３７が示されている。
【００３０】
コンピュータシステム１１０は、他の取外し可／取外し不可の揮発性／不揮発性コンピュータ記憶媒体も含むことができる。単なる例として、図１には、取外し不可の不揮発性磁気媒体との読取りまたは書込みを行うハードディスクドライブ１４１と、取外し可の不揮発性磁気ディスク１５２との読取りまたは書込みを行う磁気ディスクドライブ１５１と、ＣＤＲＯＭ、ＣＤＲＷまたはその他の光媒体などの、取外し可の不揮発性光ディスク１５６との読取りまたは書込みを行う光ディスクドライブ１５５とが示されている。例示的なオペレーティング環境で使用することができる他の取外し可／取外し不可の揮発性／不揮発性コンピュータ記憶媒体には、磁気テープカセット、フラッシュメモリカード、デジタル多用途ディスク、デジタルビデオテープ、ソリッドステートＲＡＭ、ソリッドステートＲＯＭなどが含まれるが、これらに限定されない。ハードディスクドライブ１４１は、通常インターフェース１４０などの取外し不可のメモリインターフェースを介してシステムバス１２１に接続され、磁気ディスクドライブ１５１および光ディスクドライブ１５５は、通常インターフェース１５０などの取外し可のメモリインターフェースによってシステムバス１２１に接続される。
【００３１】
上記で論じ図１に示したドライブおよび関連するコンピュータ記憶媒体は、コンピュータシステム１１０のためのコンピュータ読取り可能命令、データ構造、プログラムモジュールおよび他のデータの記憶機能を提供する。図１では、たとえば、ハードディスクドライブ１４１は、オペレーティングシステム１４４、アプリケーションプログラム１４５、他のプログラムモジュール１４６、およびプログラムデータ１４７を格納するものとして示されている。これらのコンポーネントは、オペレーティングシステム１３４、アプリケーションプログラム１３５、他のプログラムモジュール１３６、およびプログラムデータ１３７と同じものであっても異なるものであってもよいことに留意されたい。オペレーティングシステム１４４、アプリケーションプログラム１４５、他のプログラムモジュール１４６、およびプログラムデータ１４７には、少なくともそれらが異なるコピーであることを示すために、ここでは異なる番号が与えられている。ユーザは、キーボード１６２および、一般にマウス、トラックボール、またはタッチパッドと呼ばれるポインティングデバイス１６１などの入力デバイスを介して、コンピュータシステム１１０にコマンドおよび情報を入力することができる。他の入力デバイス（図示せず）には、マイクロフォン、ジョイスティック、ゲームパッド、衛星アンテナ、スキャナ、などが含まれる。これらおよび他の入力デバイスは、システムバス１２１に結合されているユーザ入力インターフェース１６０を介して処理ユニット１２０に接続されることが多いが、パラレルポート、ゲームポート、またはユニバーサルシリアルバス（ＵＳＢ）などの他のインターフェースおよびバス構造によって接続することも可能である。モニタ１９１または他のタイプのディスプレイデバイスも、ビデオインターフェース１９０などのインターフェースを介してシステムバス１２１に接続され、これらはビデオメモリ（図示せず）と通信することもできる。モニタ１９１に加えて、コンピュータシステムは、スピーカ１９７およびプリンタ１９６などの他の周辺出力デバイスを含むことも可能であり、これらは出力周辺インターフェース１９５を介して接続可能である。
【００３２】
コンピュータシステム１１０は、リモートコンピュータ１８０などの１つまたは複数のリモートコンピュータへの論理接続を使用してネットワーク環境または分散環境で動作可能である。リモートコンピュータ１８０は、パーソナルコンピュータ、サーバ、ルータ、ネットワークＰＣ、ピアデバイスまたは他の共通ネットワークノードであってよく、通常は、コンピュータシステム１１０に関して上記で述べた多くまたはすべての要素を含むが、図１にはメモリ記憶デバイス１８１のみが示されている。図１に示した論理接続には、ローカルエリアネットワーク（ＬＡＮ）１７１およびワイドエリアネットワーク（ＷＡＮ）１７３が含まれているが、他のネットワーク／バスを含むこともできる。このようなネットワーキング環境は、家庭、オフィス、企業規模のコンピュータネットワーク、イントラネット、およびインターネットで一般に普及している。
【００３３】
ＬＡＮネットワーキング環境で使用される場合、コンピュータシステム１１０は、ネットワークインターフェースまたはアダプタ１７０を介してＬＡＮ１７１に接続される。ＷＡＮネットワーキング環境で使用される場合、コンピュータシステム１１０は、通常、インターネットなどのＷＡＮ１７３を介した通信を確立するためのモデム１７２または他の手段を含む。モデム１７２は内蔵型でも外付けでもよく、ユーザ入力インターフェース１６０または他の適切なメカニズムを介してシステムバス１２１に接続することができる。ネットワーク環境では、コンピュータシステム１１０に関して示したプログラムモジュールまたはその一部を、リモートメモリ記憶デバイスに格納することができる。限定ではなく、例として、図１には、リモートアプリケーションプログラム１８５がメモリデバイス１８１上にあるものとして示されている。図示されたネットワーク接続は例示的なものであり、コンピュータ間の通信リンクを確立する他の手段が使用可能であることを理解されよう。
【００３４】
パーソナルコンピューティングおよびインターネットの収斂に鑑みて、これまでに様々な分散コンピューティングフレームワークが開発され、また現在も開発されている。個人および法人のユーザにも同様に、アプリケーションおよびコンピューティングデバイスのためのシームレスに相互運用可能なＷｅｂ使用可能なインターフェースが提供されており、コンピューティング活動はますますＷｅｂブラウザまたはネットワーク指向のものとなりつつある。
【００３５】
たとえば、ＭＩＣＲＯＳＯＦＴ（登録商標）の．ＮＥＴプラットフォームは、サーバ、Ｗｅｂベースのデータストレージなどのビルディングブロックサービス、およびダウンロード可能なデバイスソフトウェアが含まれる。本明細書では、例示的な実施形態についてコンピューティングデバイス上に常駐するソフトウェアに関連して説明するが、本発明の１つまたは複数の部分は、オペレーティングシステム、アプリケーションプログラムインターフェース（ＡＰＩ）、またはコプロセッサ、ディスプレイデバイス、および要求元オブジェクトのうちのいずれかの間の「媒介者（ｍｉｄｄｌｅ  ｍａｎ）」オブジェクトを介して実施することも可能であり、その結果、本発明に従った操作は、．ＮＥＴの言語およびサービスのすべてによって実行するか、サポートするか、またはアクセスすることが可能であり、さらに他の分散コンピューティングフレームワーク内でも同様である。
【００３６】
（例示的な実施形態）
図２は、本発明を具体化しているシステムアーキテクチャを示すブロック図である。このアーキテクチャは、複数のデータソースに関して効果的なＸＭＬクエリのためにデータを受け入れ、コンパイルし、解釈し、ノーマライズし（ｎｏｒｍａｌｉｚｅ）、アクセスするのに必要な基本ブロックを表している。複数のフロントエンド言語コンパイラ２１０は、ＸＭＬまたはＸＭＬ関連の標準に適合するものと理解することができる。これらのフロントエンドコンパイラ２１０は、ＸＭＬクエリ、ＸＭＬビュー、または他の関連するＸＭＬ言語照会を生成してコンパイル済みのＸＭＬコード２１５を生成する。
【００３７】
中間言語ジェネレータ２２０は、入力されたコンパイル済みＸＭＬコードの中間言語表現２２５を生成する。中間言語表現をアーキテクチャ２００の中の機能２３０によってノーマライズし、複数のデータソースにまたがってユーティリティを提供することができる。ノーマライザ２３０を使用して、効率的な中間言語表現２３５を生成するように中間言語を最適化することもできる。中間言語ノーマライザは、図２のアーキテクチャ２００にとって厳密に要求されるものではないことに留意されたい。
【００３８】
中間コード表現を介してアクセス可能な多様なデータソース２６０をサポートするために、複数のバックエンドクエリエンジン２４０があってよい。サポートされた各データソース内のデータのモデルに適合するデータソース上で効率的に機能するように、各バックエンドエンジンを構築することができる。バックエンドエンジン２４０は、中間言語のＸＭＬ式に対応するターゲットのデータソースクエリを生成する。バックエンドクエリエンジン２４０は、所与のクエリを実行することができるクエリ実行エンジン２５０に適切なマシンコード２４５を渡す。クエリ実行エンジン２５０は、通常、１つまたは複数のデータソース２６０とアクセスし（２６５）、その結果エンジンはクエリ結果２７０を出力する（２５５）ことができる。
【００３９】
１つまたは複数の当初のクエリを、異なるタイプの１つまたは複数の異なるデータソースにわたって使用して、所望のクエリ結果を生成することができる。
【００４０】
図３は、本発明に従った例示的な中間言語ジェネレータ（たとえば、図２の要素２２０）の機能ブロック図である。図３は、中間言語（ＩＬ）ジェネレータ２２０に送り込む複数のＭ個までのＸＭＬ言語コンパイラソース２１０ａ〜ｄがあることを表現している。これらのＸＭＬ言語コンパイラは、一般に、何らかのタイプのＸＭＬ言語に対するスキャン、構文解析、セマンティック解析、および変換を伴う。このような言語の典型的な例は、ＸＰａｔｈ、ＸＭＬスタイルシート言語（ＸＳＬ）、ＸＳＬＴ、ＸＭＬクエリ言語（ＸＱｕｅｒｙ）のＷ３Ｃ標準、ならびに、ＸＱｕｅｒｙ  ＤＭＬ（商標）、ＯＰａｔｈ（商標）、およびＷＰａｔｈ（商標）などのＭｉｃｒｏｓｏｆｔ（登録商標）クエリ言語である。ＸＭＬビューコンパイラも存在可能であり、ＸＱｕｅｒｙ（商標）のＷ３Ｃ  ＸＭＬ標準ビュー、および、ＳＱＬＸＭＬ（商標）などのＭｉｃｒｏｓｏｆｔ（登録商標）注釈付きスキーマを含むことができる。本発明の中間言語表現技法は、クエリおよびビューのための他のＸＭＬ言語にも同様に適合可能である。総称的に、ＸＭＬに適合するクエリおよびビューのすべてを、ＸＭＬ言語照会と呼ぶことができる。
【００４１】
図３に示された中間言語ジェネレータ２２０は２つの主要部分に分けられ、１つは演算識別子３１０、もう１つはノード演算子プロセッサ３２０である。総合して、ＸＭＬ中間言語ジェネレータ２２０のセマンティック解釈機能を表している。演算識別子３１０は、コンパイラ２１０ａ〜ｄからのオリジナルＸＭＬクエリまたはビュー内で演算を識別するタスクを実行する。識別された演算は、演算識別子３１０によって構築されたグラフ構造中のノードポイントにマップされる。ノード演算子プロセッサ３２０は、ＸＭＬ  ＩＬ固有の演算子を構築されたグラフノード中にマップして、クエリのグラフ表現を完成する。ノード演算子プロセッサ３２０は、次に演算子をオリジナルのクエリまたはビューのＸＭＬ中間言語表現にデコードする。この出力は、その後１つまたは複数のバックエンドエンジン２４０ａ〜ｄに渡すことができる。
【００４２】
Ｎ個までのバックエンドエンジン２４０ａ〜ｄを、中間言語表現を使用して複数のデータソースにわたってクエリを実行するためにアーキテクチャに追加することができる。クエリおよびビュー言語と複数のターゲットモデルとの間の中間言語抽象化によって、Ｍｉｃｒｏｓｏｆｔ（登録商標）．ＮＥＴ（商標）などの実ＸＭＬデータおよび仮想ＸＭＬデータを、リレーショナル（たとえばＳＱＬ）および非リレーショナル（たとえばフラットファイル）の両方のデータにわたって使用することができるようになる。
【００４３】
図４は、例示的な中間言語ジェネレータのセマンティック解釈機能を表す本発明の実施形態の流れ図である。ＸＭＬクエリまたはビューは、ステップ４１０で中間言語ジェネレータによって受け取られる。受け取られたクエリは、ステップ４２０で識別機能に渡され（４１５）、先ず受け取られたＸＭＬクエリまたはビューの中の各ＸＭＬ演算に対応するグラフノードを識別および生成する。ノードオブジェクトが識別されると、ステップ４３０でトランスレーション機能に渡される。トランスレーション機能は、識別されたオブジェクトを中間言語演算子に割り当てる。通常では、各ノードにつき１つの中間言語演算子がある。今は中間言語演算子であるトランスレートされたノードオブジェクトは、ステップ４４０で中間言語構成エンジンに渡される（４３５）。これにより、中間言語演算子が構築済み中間言語２２５を形成して明示的ＸＭＬ部分にマップされる。構築済み中間言語は、たとえば図２のアイテム２３０に示されるような中間言語ノーマライザに出力するか、たとえば図３のアイテム２４０ａ〜ｄに示されるような１つまたは複数のバックエンドエンジンに出力することができる。
【００４４】
クエリ中間言語の属性および機能
ＸＭＬ中間言語は、ＸＭＬクエリまたはビューの表現である。そのため、ＸＭＬクエリの意味の明示的表現なので、クエリ中間言語（ＱＩＬ）と呼ぶことができる。ＱＩＬは、ＸＭＬクエリおよびビューの言語コンパイラにわたって共通のセマンティック表現とみなすことができる。ＱＩＬは、普通の抽象シンタックスツリー（ＡＳＴ）と同様であるが、ＱＩＬはクエリのシンタックスではなくセマンティックまたは意味を捉えるという点で異なる。別の相違点は、ＱＩＬはグラフ構造であり、ＡＳＴのようなツリー構造ではないことである。
【００４５】
ＱＩＬは、様々な異なるターゲットデータソース（リレーショナルおよび非リレーショナルデータなど）にわたって、複数の異なるＸＭＬクエリ言語およびビュー定義言語（ＸＰａｔｈ、ＸＳＬＴ、ＸＱｕｅｒｙ、ＤＭＬおよび注釈付きスキーマなど）の抽象化を可能にする。そのためＱＩＬにより、共通構造が適合性のあるＸＭＬ言語のすべてをサポートできるようにする。どの演算も明示的および確定的であり、これによってＱＩＬは冗長になるが、ＱＩＬを使用するバックエンドエンジンから、ＱＩＬの生成を支援するフロントエンドコンパイラを切り離す。
【００４６】
クエリ中間言語は、任意のデータソースを仮想ＸＭＬとしてモデル化する方法も提供する。データソースはＸＭＬデータモデルを介して直接公開することができるか、あるいはＱＩＬユーザは先ずクエリによって生成された中間言語を解析し、クエリを最もうまく分散する方法を決定することができる。たとえば、いくつかのクエリ結果では、一部の演算子をそのデータソースに好適なクエリエンジンに直ぐに追い込み（ｐｕｓｈ  ｉｎｔｏ）、このようにクエリを論理的な方法で区分することのできることを示すことができる。ＱＩＬにより、そのクエリタスクを最も効果的に行うことができるエンジンにクエリタスクを追い込むことができるようになる。
【００４７】
クエリ中間言語は、オリジナルのクエリを表すグラフ構造のノードと共に、それ自体の演算子を利用する。これらの演算子により、新しい種類のクエリ最適化、クエリ書き換え、および以前には対応するデータソースで実現できなかった他の解析が可能になる。ほとんどのＱＩＬ演算子は複数の言語にまたがって共通であり、一部は特定のＸＭＬクエリ言語に固有である。どのＸＭＬ言語にもそれ自体の暗黙の規則および特殊なケースがあるが、クエリ中間言語はこれらの意味を明示的および確定的にエンコードする。
【００４８】
クエリ中間言語は、ノードオブジェクトのグラフである。この中間言語は、ＸＭＬ中間言語機能を定義するゼロ以上の追加のグラフを伴って、主要なクエリである、多くても１つのルートとなるグラフからなる。メモリ内のグラフを表す方法は数多くあるが、ノードオブジェクトのネットワークを使用することは実施形態の１つである。ＱＩＬは、ノード型ごとに１つのクラスを定義するのではなく、多くの異なるノード型にまたがって共用されるクラスを用いる。
【００４９】
ＱＩＬは、たとえオリジナルのクエリ言語がそうでなくとも、強く型付けされて（ｓｔｒｏｎｇｌｙ−ｔｙｐｅｄ）いる。ＱＩＬは、ＸＭＬデータにわたるＸＭＬクエリ、リレーショナルデータのＸＭＬビューにわたるＸＭＬクエリ、リレーショナルデータにわたるＸＳＬＴ、ならびに、テキストファイル、スプレッドシート、および非リレーショナルデータベースなどの非リレーショナルデータにわたるＸＭＬクエリをサポートすることができる。ＱＩＬを使用して、複数のデータソースをまたがって異種の分散化されたクエリを行うことも、そしてＸＭＬと仮想ＸＭＬデータソースとを統合することもできる。
【００５０】
ＱＩＬはクエリの意味を表すものであり、そのため、論理クエリプランであり、物理クエリプランではない。ＱＩＬに対する複数の実行戦略がある。言語を直接実行し、ＱＩＬグラフ全体にわたって左の深さ優先の様式（ｌｅｆｔ−ｄｅｐｔｈ−ｆｉｒｓｔ  ｆａｓｈｉｏｎ）で繰り返すことができる。あるいは、クエリ中間言語を実行のためにＳＱＬなどの別の言語にトランスレートすることができる。さらに別の方法では、ＱＩＬを渡して解析し、あるエンジンによる実行のために特定の部分を抽出し、必要に応じてグラフを修正し、別の既存のエンジンによる実行のために残りをそのままにしておく。
【００５１】
ＱＩＬは強く型付けされている。ＱＩＬには詳細な型システムがあり、この型システムは、その一部を本明細書で説明する例示的なＱＩＬ演算子を参照するテーブルに反映されている。特に注記されない限り、記述は静的な型の式を示し、式が評価される動的な型の値ではない。
【００５２】
ＤｏｃｕｍｅｎｔＯｒｄｅｒおよびＤＭＬのようないくつかの選択された「演算子」を除き、あらゆるＱｉｌＮｏｄｅ式は何らかの基数（ｃａｒｄｉｎａｌｉｔｙ）のシーケンスである。この基数は、特に指示のない限り、常にＮｏｎｅ（未知（ｕｎｋｎｏｗｎ））、Ｚｅｒｏ（空）、Ｏｎｅ（シングルトン）、Ｍｏｒｅ（２以上）、またはこれらの組合せのうちの１つである。
【００５３】
シーケンスはアイテムで構成されており、これらのアイテムは異種のシーケンスが許容されるので、原子値（ａｔｏｍｉｃ  ｖａｌｕｅ）もしくはノード、またはその両方であってよい。原子値は、さらにＩｎｔ３２、Ｓｔｒｉｎｇ、およびＤａｔｅＴｉｍｅなどの型のセットに分類される。ほとんどの部分で、ＱＩＬの原子型はＸＱｕｅｒｙ原子型のサブセットであり、実際的な実装の選択肢を反映している。式は原子（すなわちノードまたはＤＭＬのような選択された演算子型）でないときは、原子型Ｎｏｎｅを有する。
【００５４】
例示的なＱＩＬ演算子
好ましくは、ＱＩＬの各演算子は一意の対応するＮｏｄｅＴｙｐｅと、それを表すクラスとを有する。本来、演算子はＱＩＬグラフ構造のノード中に存在する。結果として、ノードに割り当てられた演算子はノード型を有し、演算子はノード型の関数となる。クラス毎に多くのノード型があるが、ノード型毎には１つのクラスしかない。各演算子は、単一の明示的および確定的な意味を有することが望ましい。一般に、この意味は、そのオペランドの型またはそれが使用されるコンテキストには非依存である。それゆえ、各演算子はコンテキストフリーであるとみなすことができる。各演算子は、本明細書に記載されたＱＩＬ型システムに従って強く型付けされている。
【００５５】
本明細書では、各演算子ノード型に対していくつかの例示的プロパティを示す表が与えられている。特に注記のない限り、オペランドがヌルであることはない。ＱＩＬ演算子は、次の例示的なグループに類別することができる。これらは、特殊演算子（エラー、無演算（ｎｏｐ）、未知）、データソース、リテラル（スカラ定数）、ブール演算子、シーケンス演算子、算術演算子、文字列演算子、値比較演算子、ノード比較演算子、タプルスペース（ソート化を含む）、関数定義および呼び出し、ＸＭＬナビゲーション、ＸＭＬ構造体、ＸＭＬプロパティアクセサ、型演算子、ＸＰａｔｈの言語固有演算子、ＸＳＬＴ、ＸＱｕｅｒｙ、およびデータ操作言語（ＤＭＬ）である。
【００５６】
タプルスペース演算子
ＱＩＬにおける１つの例示的な演算子がタプルである。タプル演算子はＱＩＬで頻繁に使用することができ、ネストされた様式で使用することができる。この演算子はＴｕｐｌｅノード型（クラスＱＩＬ  Ｔｕｐｌｅ）で表され、正確に３つの子ノードを常時有することが望ましく、これらは、タプルスペースを構築する反復子のリスト、タプルスペースをフィルタするｗｈｅｒｅ節、およびタプルスペースの結果を生成するｒｅｔｕｒｎ節である。
【００５７】
ネストされたタプルを視覚化する１つの方法は、セルそれら自体が表を収容する、行および列の表をイメージすることである。６面のさいころのペアを例に取ってみる。可能な組合せは３６通りあり、その一部を以下の表１に示す。
【００５８】
【表１】
2005018776.tif 000003
【００５９】
このタプルスペースには３つの列がある。最初の２つはそれぞれ第１および第２のさいころに対応する。第３の列は、結果、すなわちこの場合は値のペアを保持するために使用される。このタプルスペースには、２つのさいころを振った結果として得られる区別可能な組合せの数に対応する３６の行がある。以下は、セット（１，２，３，４，５，６）とそれ自体、たとえば次のＸＱｕｅｒｙで、結合した結果として得られるタプルスペースである。
【００６０】
ｆｏｒ  ＄ｄｉｅ１  ｉｎ  （１，２，３，４，５，６），
＄ｄｉｅ２  ｉｎ  （１，２，３，４，５，６）
ｒｅｔｕｒｎ （＄ｄｉｅ１，＄ｄｉｅ２）
【００６１】
このＸＱｕｅｒｙは、２つのセットのクロス乗積を計算し、そのクロス乗積の各メンバについて、シーケンス、すなわちさいころの値のペアを戻す。結果は、リストの順序付けされたリストとなる。
【００６２】
（（１，１），（１，２），（１，３），（１，４），（１，５），（１，６），（２，１），（２，２），．．．）
【００６３】
しかし、ＸＱｕｅｒｙはリストのリストをそれらすべての連結として扱うため、これは実際には単なる平坦なリストとなる。
（１，１，１，２，１，３，１，４，１，５，１，６，２，１，２，２，．．．）
【００６４】
クエリは、次のようにも書くことができることに留意されたい。
ｆｏｒ  ＄ｄｉｅ１  ｉｎ  （１，２，３，４，５，６），
ｆｏｒ  ＄ｄｉｅ２  ｉｎ  （１，２，３，４，５，６）
ｌｅｔ  ＄ｒｅｓｕｌｔ：  ＝（＄ｄｉｅ１，＄ｄｉｅ２）
ｒｅｔｕｒｎ  ＄ｒｅｓｕｌｔ
【００６５】
この形では、各ＸＱｕｅｒｙ変数はタプルスペースの中の正確に１つの列に対応する。これは、ＱＩＬの概念でもある。ＱＩＬ  Ｔｕｐｌｅノードまたは演算子の中の各反復子は、タプルスペースの１つの列に対応する。ｒｅｔｕｒｎ節は、上記でＬＥＴを使用して変数割当てとして書かれた、追加の列に寄与する。
【００６６】
Ｔｕｐｌｅノードを実行した結果が結果の順序付けされたリストであり、結果それら自体がリストである場合、前と同じように共に連結（平坦化）される。ＸＱｕｅｒｙ同様、ＱＩＬはリストとリストのリストとを区別しない。
【００６７】
ｗｈｅｒｅ節は、いくつかの行を削除することによって、タプルスペースをフィルタする機会を提供する。ｗｈｅｒｅ節は、タプルスペース上で他の影響がないことが望ましい。上記のすべての例において、ｗｈｅｒｅ節は、あらゆる行が受け入れられる（フィルタが行われていない）ことを意味する、単一のｔｒｕｅノードからなる。しかし、この結果は、以下のように、合計が７になる６通りのさいころの目に限られる場合があり、
ｆｏｒ  ＄ｄｉｅ１  ｉｎ  （１，２，３，４，５，６），
ｆｏｒ  ＄ｄｉｅ２  ｉｎ  （１，２，３，４，５，６）
ｌｅｔ  ＄ｒｅｓｕｌｔ：  ＝（＄ｄｉｅ１，＄ｄｉｅ２）
ｗｈｅｒｅ  ＄ｄｉｅ１  ＋  ＄ｄｉｅ２  ＝  ７
ｒｅｔｕｒｎ  ＄ｒｅｓｕｌｔ
これによって、表２に記載されたフィルタされたタプルスペースが作成される。
【００６８】
【表２】
2005018776.tif 000004
【００６９】
このＸＱｕｅｒｙの例は、以下のクエリ中間言語表現で表すことが可能である。
注：これはＱＩＬデータ構造の単なるＸＭＬ表現である。
【００７０】
【表３】
2005018776.tif 000005
【００７１】
反復子ノード（Ｆｏｒ、Ｌｅｔ）は反復子リストに導入され、後にクエリで再度参照される。それらを記号的に参照するために、一意のｉｄ属性が与えられ、後にこれらの名前で参照されることがある。これらのｉｄ文字列は、実際にはグラフ中に存在せず、オリジナルのクエリとは関係がなく、グラフをＸＭＬとして印刷するときにのみ生成されることに留意されたい。好ましくは、これらの参照はオリジナルのノードインスタンスに対するメモリポインタである。
【００７２】
結果的に、このＱＩＬグラフには２２個の一意のノードと、太字で強調表示された５つの参照（＄ｃの定義の２つ、Ｔｕｐｌｅのｗｈｅｒｅ節の２つ、そしてＴｕｐｌｅのｒｅｔｕｒｎ節の１つ）が含まれる。
【００７３】
別の例として、次のＸＱｕｅｒｙについて考えてみる。
ｆｏｒ  ＄ｉ  ｉｎ  ｄｏｃｕｍｅｎｔ（‘ｆｏｏ．ｘｍｌ’）／ｘ／ｙ
ｒｅｔｕｒｎ＜ｚ／＞
これは次のＸＱｕｅｒｙと等価であり、
ｆｏｒ  ＄ａ  ｉｎ  ｄｏｃｕｍｅｎｔ（‘ｆｏｏ．ｘｍｌ’）
ｒｅｔｕｒｎ
ｆｏｒ  ＄ｂ  ｉｎ  ＄ｉ／ｘ
ｒｅｔｕｒｎ
ｆｏｒ  ＄ｃ  ｉｎ  ＄ｊ／ｙ
ｒｅｔｕｒｎ＜ｚ／＞
どちらも、以下のＱＩＬ式で表すことができる。
【００７４】
＜Ｔｕｐｌｅ＞
＜Ｆｏｒ  ｉｄ  ＝  “＄ａ”＞
＜ＤａｔａＳｏｕｒｃｅ＞
＜Ｓｔｒｉｎｇ＞ｆｏｏ．ｘｍｌ＜／Ｓｔｒｉｎｇ＞
＜ＤａｔａＳｏｕｒｃｅ＞
＜／Ｆｏｒ＞
＜Ｔｒｕｅ／＞＜！−−ｗｈｅｒｅ節なし−−＞
＜Ｔｕｐｌｅ＞
＜Ｆｏｒ  ｉｄ  ＝  “＄ｂ”／＞
＜／Ｃｏｎｔｅｎｔ＞
＜Ｆｏｒ  ｉｄ  ＝  “＄ａ”／＞
＜／Ｃｏｎｔｅｎｔ＞
＜／Ｆｏｒ＞
＜Ｅｑ＞
＜ＮａｍｅＯｆ＞
＜Ｆｏｒ  ｉｄ  ＝  “＄ｂ”／＞
＜／ＮａｍｅＯｆ＞
＜ＱＮａｍｅ  ｌｏｃａｌ−ｎａｍｅ  ＝  “ｘ”／＞
＜／Ｅｑ＞
＜Ｔｕｐｌｅ＞
＜Ｆｏｒ  ｉｄ  ＝  “$c”＞
＜Ｃｏｎｔｅｎｔ＞
＜Ｆｏｒ  ｉｄ  ＝  “＄ｂ”＞
＜／Ｃｏｎｔｅｎｔ＞
＜／Ｆｏｒ＞
＜Ｅｑ＞
＜ＮａｍｅＯｆ＞
＜Ｆｏｒ  ｉｄ  ＝  “＄ｃ”／＞
＜／ＮａｍｅＯｆ＞
＜ＱＮａｍｅ  ｌｏｃａｌ−ｎａｍｅ＋“ｙ”／＞
＜／Ｅｑ＞
＜ＥｌｅｍｅｎｔＣｔｏｒ＞
＜ＱＮａｍｅ  ｌｏｃａｌ−ｎａｍｅ  ＝  “ｚ”／＞
＜Ｌｉｓｔ／＞
＜／ＥｌｅｍｅｎｔＣｔｏｒ＞
＜／Ｔｕｐｌｅ＞
＜／Ｔｕｐｌｅ＞
【００７５】
オリジナル文書ｆｏｏ．ｘｍｌが以下のＸＭＬからなる場合
＜x  ｉｄ  ＝  “x１”＞
＜ｙ  ｉｄ  ＝  “ｙ１”／＞
＜ｙ  ｉｄ  ＝  “ｙ２”／＞
＜／ｘ＞
＜ｘ  ｉｄ  ＝  “ｘ２”＞
＜ｘ  ｉｄ  ＝  “ｙ３”／＞
＜ｘ  ｉｄ  ＝  “ｙ４”／＞
＜ｘ  ｉｄ  ＝  “ｙ５”／＞
＜／ｘ＞
【００７６】
次にこのＱＩＬおよびＸＱｕｅｒｙ例は、表３に示されたネスとされたタプルスペースを生成する。
【００７７】
【表４】
2005018776.tif 000006
【００７８】
このデータモデル例はリストのリストを含まないので、Ｎ列を備えた表が入っている列はそれらのＮ列によって、必要に応じて行の拡張およびコピーして置き換えることができる。それゆえ、このタプルスペースは、一連のネストされていない演算子を通じて、表４の「平坦化された」タプルスペースと等価である。
【００７９】
【表５】
2005018776.tif 000007
【００８０】
ＱＩＬを実行することにより、期待される文書順序でｘ／ｙにわたって反復される、５つの＜ｚ／＞エレメントが作成される。
【００８１】
タプルスペース演算子としてグループ化された演算子のセットについて、表５に関して説明する。Ｔｕｐｌｅは変数バインディング（割当てまたは反復）を導入し、これをｗｈｅｒｅ節でフィルタして、結果式を戻す。戻された結果はそれ自体Ｔｕｐｌｅであるとき、クロス乗積または結合となる。
【００８２】
反復子ノードには、ＦＯＲおよびＬＥＴの２種類がある。ＬＥＴは単なる変数割当てであり、基数１を有する。ＦＯＲはシーケンスにわたって繰り返され、順に各メンバとバインディングする。それゆえＦＯＲの基数はそのバインディングの長さである。タプルスペースの基数は、多くてもその反復子の基数にそのｒｅｔｕｒｎ節の基数を掛けたものである。タプルスペースの中の各アイテムについてｗｈｅｒｅ節が評価され、ｔｒｕｅの場合、ｒｅｔｕｒｎ節が評価され、戻される。タプルの結果は、すべてのこれらの戻り値（お可能性として空のシーケンス）のシーケンス連結である。タプルに導入されたとき、各反復子はｗｈｅｒｅ節およびｒｅｔｕｒｎ節のすべてについての範囲内にある。ＬＥＴ反復子はその引数のノード識別を保持する。この複雑さを除き、ＱＩＬは参照上トランスペアレントである（ＬＥＴはそのバインディングによって置き換えられるか、またはその逆が可能であることを意味する）。
【００８３】
ＰＯＳＩＴＩＯＮＯＦ演算子は反復子に適用することができる。これは、そのバインディング内の反復子の現在位置を決定する。この位置は１を基準とするインデックスである。このＰＯＳＩＴＩＯＮＯＦ  ａ  ＬＥＴ反復子は常に１である。ＰＯＳＩＴＩＯＮＯＦ  ａ  ＦＯＲ反復子は、１からその長さまでの間である。
【００８４】
【表６】
2005018776.tif 000008
【００８５】
リテラル演算子
リテラル演算子としてグループ化された演算子のセットについて、下記および表６で説明する。リテラルは定数を表す。単一クラスＱＩＬＬｉｔｅｒａｌは、すべてのリテラルタイプを表す（ＱＩＬＮｏｄｅそれ自体を使用して表されるＢｏｏｌｅａｎ、およびＱＩＬＮａｍｅを使用して表されるＮａｍｅを除く）。リテラル値はオブジェクトとして格納される。
【００８６】
【表７】
2005018776.tif 000009
【００８７】
ブール演算子
ブール演算子としてグループ化された演算子のセットについて、下記および表７で説明する。ＱＩＬは、従来の２つの値を持つ論理演算子、ＡＮＤ、ＯＲ、およびＮＯＴ、ならびにＣＯＮＤＩＴＩＯＮＡＬ（含意）をサポートすることが望ましい。汎用（ｕｎｉｖｅｒｓａｌ）および存在（ｅｘｉｓｔｅｎｔｉａｌ）の修飾（ｑｕａｌｉｆｉｃａｔｉｏｎ）はＩｓＥｍｐｔｙとＴｕｐｌｅの組合せを通じて達成されるのが好ましい。
【００８８】
ＱＩＬは、論理積正規形、論理和正規形、および一種のスイッチのための便利な演算子をサポートしている。ＡＮＤおよびＯＲの場合、どちらのオペランドもブールシングルトン（ｓｉｎｇｌｅｔｏｎ）であることが望ましい。ＮＯＴ演算子のオペランドは、ブールシングルトンであることが望ましい。
【００８９】
演算子ＣＯＮＤＩＴＩＯＮＡＬの場合、条件式（ＱＩＬＴｅｒｎａｒｙノードの左プロパティ）はブールシングルトンであることが望ましく、ｔｒｕｅ／ｆａｌｓｅブランチ（それぞれ中央および右プロパティ）はいずれの型でもよい。ｅｌｓｅブランチはオプションではない。しかし通常は、空のリストを使用して「ｄｕｍｍｙ」ブランチの効果を得ることができる。式全体の型は、ｔｒｕｅ／ｆａｌｓｅブランチ型の共用体（ｕｎｉｏｎ）である。
【００９０】
オペランドにＢｏｏｌｅａｎを強制するために、アプリケーションの必要性に応じてＸＱＵＥＲＹＥＢＶまたはＣＯＮＶＥＲＴなどのオペレータを使用することができる。
【００９１】
【表８】
2005018776.tif 000010
【００９２】
シーケンス演算子
シーケンス演算子としてグループ化された演算子のセットについて、下記および表８で説明する。どのＱＩＬ式も何らかの基数の順序付けされたシーケンスであることが好ましい。シーケンスで機能するため、ＸＱｕｅｒｙはいくつかの演算子および統合機能を定義する。ＬＩＳＴ演算子は、そのメンバに関してシーケンス連結を行う。空リストではほとんどの型がＮｏｎｅに設定されるが、そうでない場合、リストの型はそのメンバのすべての型の共用体である。ＬＩＳＴは、識別による重複ノードまたは重複値を除去しない。シーケンスから重複を除去するためには、区別演算子（ＤＩＳＴＩＮＣＴ、ＤＩＳＴＩＮＣＴＢＹＶＡＬＵＥ）のうちの１つを明示的に適用することが可能であり、そうでなければＳＥＴ演算子を使用することができる。
【００９３】
ＲＡＮＧＥは、ＸＱｕｅｒｙ  ＴＯ演算子と同様に、左バウンドと右バウンドの間に整数の連続するシーケンスを構築する。右バウンドが左バウンドよりも小さい場合、シーケンスは減少している。それらが等しい場合、シーケンスは単一のメンバ（その値）を有する。
【００９４】
ＮＴＩＭＥＳはバイナリ演算子であり、その左オペランドは任意の型でよく、右オペランドは負でない整数のシングルトンであることが望ましい。左オペランドをＮ回含むシーケンスを生成し、ここでＮは右オペランドの値である。これはオリジナルをコピーしないことに留意されたい。（ＮＴＩＭＥＳ  ｌｅｆｔ  ｒｉｇｈｔ）は、式（Ｔｕｐｌｅ（Ｆｏｒ（Ｒａｎｇｅ  １  Ｒｉｇｈｔ））（Ｔｒｕｅ）（Ｌｅｆｔ））と同等である。
【００９５】
ＤＩＳＴＩＮＣＴは、リストから（識別により）重複ノードを除去する。ノードが除去される順序は、実装により定義されるのが好ましい。
【００９６】
ＤＩＳＴＩＮＣＴＢＹＶＡＬＵＥは、シーケンスにわたって、その第１の引数としてＦＯＲ反復子を取り、これは次に参照のために第２の引数の範囲内である。第２の引数は、重複を除去する際に使用する値の計算方法を指定する。
【００９７】
ＵＮＩＯＮ、ＩＮＴＥＲＳＥＣＴＩＯＮ、およびＤＩＦＦＥＲＥＮＣＥ演算子は、ノード識別を使用して対応するセット演算子を実行して、重複を除去する。それらのオペランドはノードシーケンスであってよい。セット差は非対称であり、２つのシーケンスＡおよびＢの対称差について、それらの２つ１組の差のＵＮＩＯＮである（Ｕｎｉｏｎ（Ｄｉｆｆｅｒｅｎｃｅ  Ａ  Ｂ）（Ｄｉｆｆｅｒｅｎｃｅ  Ｂ  Ａ））か、あるいは同等に、それらのＩＮＴＥＲＳＥＣＴＩＯＮを有するそれらＵＮＩＯＮのＤＩＦＦＥＲＥＮＣＥである（Ｄｉｆｆｅｒｅｎｃｅ  （Ｕｎｉｏｎ  Ａ  Ｂ）（Ｉｎｔｅｒｓｅｃｔｉｏｎ  Ａ  Ｂ））のいずれかを取ることができる。
【００９８】
数値集約関数（ＡＶＥＲＡＧＥ、ＳＵＭ、ＭＩＮＩＭＵＭ、ＭＡＸＩＭＵＭ）は、望ましくは数値のシーケンスであるオペランドを有する。これらは、シーケンスのすべてのメンバを共通の型に昇格（ｐｒｏｍｏｔｅ）させ、適切な関数を計算する。たとえば、（Ａｖｅｒａｇｅ（Ｄｅｃｉｍａｌ  １．０）（Ｉｎｔ３２  ３））は（Ｄｅｃｉｍａｌ  ２．０）である。空シーケンスに適用されるすべての４つの演算子は、空のシーケンスとなる。
【００９９】
これらの演算子のほとんどについて、全体式の型はその引数に依存する。たとえば、エレメントのシーケンスの属性のシーケンスとの共用体は、そのＮｏｄｅＫｉｎｄとしてそれら２種類の共用体を有する。グループシーケンス演算子のすべては、どのような基数のオペランドも受け入れる。
【０１００】
【表９】
2005018776.tif 000011
【０１０１】
算術演算子
算術演算子としてグループ化された演算子のセットについて、下記および表９で説明する。算術演算子は、それらのオペランドの型に依存して変化する振る舞いを有する。すべての算術演算子は、それらのオペランドが同じ（数値の）型および基数１を有し、その型で算術を実行するように要求する。除算がこれらの規則の１つの例外である。ＤＩＶＩＤＥは、整数オペランドを常にｄｏｕｂｌｅに昇格させる。ＩＮＴＥＧＥＲＤＩＶＩＤＥは整数除算を実行し、したがってそのオペランドは整数である。
【０１０２】
オーバフローおよびアンダフローなどの算術例外は、実装により定義される。浮動小数点型の場合、ＮａＮは非シグナリングであり、無限大および負のゼロが許容される。
【０１０３】
算術演算子は、非数値型または非シングルトンには定義されない。文字列に関して動作させるため、文字列演算子（ＳＴＲＣＯＮＣＡＴのような）を使用するか、またはそれらを数値型に変換することができる。
【０１０４】
数字のシーケンスに関して演算を行うために、ＴＵＰＬＥを使用してシーケンスを通じて繰り返し、メンバワイズ（ｍｅｍｂｅｒ−ｗｉｓｅ）の演算を行うか、そうでなければＳＵＭなどのシーケンスアグリゲータのうちのいくつかを使用することを検討することができる。
【０１０５】
【表１０】
2005018776.tif 000012
【０１０６】
文字列演算子
文字列演算子としてグループ化された演算子のセットについて、下記および表１０で説明する。文字列演算子は、連結および部分文字列マッチングなどの共通の文字列機能を提供する。
【０１０７】
ＳＴＲＬＥＮＧＴＨは文字列の長さを計算する。その引数はシングルトン文字列であることが望ましい。ＳＴＲＣＯＮＣＡＴは、ＬＩＳＴのような可変引数演算子である。これは、その引数を単一の文字列に連結する。各引数は文字列のリストまたは空のリストであってよい。空の文字列に対して空のリストを取る。ＳＴＲＣＯＮＣＡＴは、デフォルトで空の文字列を取る、オプションの文字列プロパティＤｅｌｉｍｉｔｅｒを受け入れる。これは、文字列メンバのあらゆるペアの間に区切り値を挿入する。ＳＴＲＣＯＮＣＡＴ（（），（））は依然として空の文字列であるが、ＳＴＲＣＯＮＣＡＴ（“”，“”）は結果として区切り文字となることに留意されたい。
【０１０８】
ＳＴＲＳＵＢＳＴＲＩＮＧノード演算子は、文字列の部分文字列を計算する。第１の引数はシングルトン文字列でなければならず、第２および第３の引数はシングルトン整数であることが望ましい。これは、最大の０または第２の引数（ｉ０と呼ばれる）、および最大の０または第３の引数（ｉ１と呼ばれる）を取り、ｉ０からｉ０＋ｉ１までの間の文字からなる部分文字列を計算する。
【０１０９】
ＳＴＲＣＯＮＴＡＩＮＳは、２つのシングルトン文字列を引数として取り、第１の文字列が第２の文字列を含む場合はｔｒｕｅを戻し、そうでない場合はｆａｌｓｅを戻す。どの文字列にも空の文字列が含まれる。ＳＴＲＥＮＤＳＷＩＴＨおよびＳＴＲＢＥＧＩＮＳＷＩＴＨは同じ機能を持つが、マッチを制約して、それぞれ文字列の終わりまたは始まりに現れる。
【０１１０】
【表１１】
2005018776.tif 000013
【０１１１】
値比較演算子
値比較演算子としてグループ化された演算子のセットについて、下記および表１１で説明する。ＱＩＬは、値を比較するためのいくつかの演算子を定義する。これらは同じ名前（ＥＱ、ＮＥ、ＬＴ、ＬＥ、ＧＴ、およびＧＥ）を有するＸＱｕｅｒｙの値比較演算子に対応する。ノード比較演算子については、以下で説明する。
【０１１２】
各オペランドはシングルトンが望ましく、どちらのオペランドも同じ型を有することが望ましい。ＴＲＥＡＴ、ＣＯＮＶＥＲＴ、または他の型の演算子を使用して、必要に応じてオペランドを昇格させるかまたは変換することができる。
【０１１３】
文字列比較は、通常、照合（ｃｏｌｌａｔｉｏｎ）を考慮に入れなければならない。シーケンスは、存在、汎用、第１、メンバワイズなど、多くの異なる方法で比較することができる。
【０１１４】
【表１２】
2005018776.tif 000014
【０１１５】
ノード比較演算子
ノード比較演算子としてグループ化された演算子のセットについて、下記および表１２で説明する。ＱＩＬは、識別または文書順序によってノードを比較するためのいくつかの演算子を定義する。これらはＸＱｕｅｒｙのノード比較演算子（ＩＳ、ＩＳＮＯＴ、ＢＥＦＯＲＥ（＜＜）、およびＡＦＴＥＲ（＞＞））に対応する。
【０１１６】
ＢＥＦＯＲＥ（ＡＦＴＥＲ）は、文書順序で左のオペランドが右よりも前（後）に表示される場合、ｔｒｕｅを戻す。異なる文書からの（または文書にまったくない）ノードの場合、順序付けが定義され、クエリの実行内で安定しているが、そうでなければ、実装により定義される。
【０１１７】
各オペランドはシングルトンノードであることが望ましい。ノード型ＩＳは、２つのオペランドが同じノード（識別による）の場合はｔｒｕｅを戻し、そうでない場合はｆａｌｓｅを戻す。ＩＳＮＯＴはその反対を戻す。ＢＥＦＯＲＥ／ＡＦＴＥＲの定義から、ＢＥＦＯＲＥおよびＡＦＴＥＲの両方がそれらについてｆａｌｓｅを戻す場合、その場合にのみ、２つのノードが同じ識別を有することになる。結果として、（ＩｓＮｏｔ＄ｘ＄ｙは（Ｏｒ（Ｂｅｆｏｒｅ  ＄ｘ  ＄ｙ）（Ａｆｔｅｒ  ＄ｘ  ＄ｙ））と等価である。シーケンスは、存在、汎用、第１、メンバワイズなど、多くの異なる方法で比較することができる。
【０１１８】
【表１３】
2005018776.tif 000015
【０１１９】
ソートおよび照合演算子
ソートおよび照合演算子としてグループ化された演算子のセットについて、下記および表１３で説明する。ＱＩＬは、単一のＳＯＲＴノードまたは演算子を定義し、これは２つの引数を取る。第１の引数は、ソートされる照合にわたってＦＯＲ反復子を導入する。この反復子は、第２の引数に対する範囲内にあり、ソートキーを表現する。
【０１２０】
各ソートキーはＡＳＣＥＮＤＩＮＧまたはＤＥＳＣＥＮＤＩＮＧのいずれかである。キー式はＤＯＣＵＭＥＮＴＯＲＤＥＲのような定数またはより複雑な式であってよい。
【０１２１】
ＤＯＣＯＲＤＥＲＤＩＳＴＩＮＣＴは文書順別にシーケンスをソートし、識別によって重複ノードが除去される便利な演算子である。（ＤｏｃＯｒｄｅｒＤｉｓｔｉｎｃｔ  ｘ）は（Ｄｉｓｔｉｎｃｔ（Ｓｏｒｔ  Ｘ（Ａｓｃｅｎｄｉｎｇ  ＤｏｃＯｒｄｅｒ）））と等価である。そのオペランドは可能性として空であるノードシーケンスでなければならない。
【０１２２】
【表１４】
2005018776.tif 000016
【０１２３】
関数定義および呼び出し演算子
関数定義および呼び出し演算子としてグループ化された演算子のセットについて、下記および表１４で説明する。ＱＩＬは、関数定義と呼び出しの両方を表すことができる。呼び出しにはいくつかのスタイルがあり、ＱＩＬを使用してそれ自体が定義された関数の呼び出し、実行時関数に組み込みの呼び出し、ならびに、任意メソッド（たとえば、ＸＳＬＴ拡張オブジェクト）の早期バインド（ｅａｒｌｙ−ｂｏｕｎｄ）および遅延バインド（ｌａｔｅ−ｂｏｕｎｄ）された両方の呼び出しがある。
【０１２４】
引数は定位置であること（ｐｏｓｉｔｉｏｎａｌ）が好ましい。ＱＩＬを介して名前によるコール（ｃａｌｌ−ｂｙ−ｎａｍｅ）セマンティックスをトンネルする必要がある場合、すべての名前を位置にマップする（ＸＳＬＴコンパイラがするように）必要があるか、そうでなければ名前を値とペアにする（ｍｓ：ｖａｒｉａｂｌｅｓ（）がＳＱＬＸＭＬストアドプロシージャ（ｐｒｏｃ）にうまく行うように）構造を構築し、ＱＩＬで名前マッチングアルゴリズムをエンコードすることができる。
【０１２５】
呼び出しは、ＬＥＴ反復子のアレイを使用して引数を渡す。ＦＵＮＣＴＩＯＮ定義では、これらの反復子は、実行時に値が外部から供給される記号参照として機能しているヌルにバインドされる。
【０１２６】
【表１５】
2005018776.tif 000017
【０１２７】
ＸＭＬナビゲーション演算子
ＸＭＬナビゲーション演算子としてグループ化された演算子のセットについて、下記および表１５で説明する。ＰａｔｈスタイルナビゲーションはＱＩＬでシンタックスに保持されず、タプルスペースおよびナビゲーション演算子に解かれる。
【０１２８】
一般的に言えば、ＱＩＬでのナビゲーションはＣＯＮＴＥＮＴノード演算子を使用して行われる。この演算子はノード内のすべてのコンテンツ（たとえば、すべての属性、名前スペース、テキスト、処理命令、コメント、および１エレメント内のエレメントノード）を選択することが望ましい。コンテンツシーケンスを次にフィルタして、特定のノード種類のみを（たとえば、ＴＵＰＬＥおよびＩＳＴＹＰＥを使用して）選択的に保持することができる。
【０１２９】
ＡＴＴＲＩＢＵＴＥ演算子はパターン認識で便利なように供給され、名前によって属性ノードを選択し（右オペランド）、０または１の属性ノードをマッチする。他のナビゲーションノードはグラフの中の共通の指示に与えられ、これらはほとんどＸＰａｔｈから取られ、同じ意味を有する。
【０１３０】
どの演算子にも１回に１つのノードが適用され、ノードの全シーケンスに適用するために、ＴＵＰＬＥを使用してこのノードシーケンスにわたって繰り返すことができる。１つの例外はＤＥＲＥＦであり、その引数は単一のＩＤ値でなければならない。これはｉｄ（）ルックアップの結果を計算する。
【０１３１】
【表１６】
2005018776.tif 000018
【０１３２】
ＸＭＬ構造演算子
ＸＭＬ構造演算子としてグループ化された演算子のセットについて、下記および表１６で説明する。ＱＩＬは、あらゆるＸＭＬノード種類を構築するための演算子を定義する。これらのコンストラクタはすべて、通常のＸＭＬデータモデル制約に従う。たとえば、どのノードも文書ノードを収容することができず、連続するテキストノードがマージされる。
【０１３３】
あらゆる構築済みノードは一意の識別を取得することが好ましい。この識別は、ＸＱｕｅｒｙの場合と同様に、ＱＩＬのために定義される。これはＬＥＴのような演算にまたがって保持され、副作用を伴う演算子、特にＤＭＬによって尊重されるべきである。
【０１３４】
あらゆる構築済みノードは、あらゆる他のノードに関する順序付けを取得する。これは、たとえ文書内ではなくノード、および異なる文書からのノードに適用するとしても、「文書順序」と称される。この順序付けは、ＸＱｕｅｒｙの場合とまったく同様に、ＱＩＬのために定義される。
【０１３５】
ＥＬＥＭＥＮＴＣＴＯＲ演算子
ＥＬＥＭＥＮＴＣＴＯＲは、クラスＱｉｌＢｉｎａｒｙを使用して実装される。左オペランドは名前、右オペランドはコンテンツである。これは、コンテンツの中のいずれかのノードが文書ノードであれば、エラーとなることがある。コンテンツの中のすべてのノードは暗黙的にコピーされる。
【０１３６】
ＡＴＴＲＩＢＵＴＥおよびＮＡＭＥＳＰＡＣＥノードは、エレメントの中の他の非属性／名前スペースコンテンツの後には構築されないことがある。このような状況での振る舞いは実装により定義される。エレメント名が名前スペースにあり、名前スペースが範囲内にない場合、実装により合成された名前スペース宣言および／またはプリフィックスを発行することができる。実装は名前のプリフィックス値に従う必要はなく、これは単なる逐次化のヒントである。
【０１３７】
ＡＴＴＲＩＢＵＴＥＣＴＯＲ演算子
ＡＴＴＲＩＢＵＴＥＣＴＯＲは、ＱｉｌＢｉｎａｒｙクラスを使用して実装される。左オペランドは名前、右オペランドはコンテンツである。右オペランドは、ＸＱＵＥＲＹＡＴＴＲＩＢＵＴＥＣＯＮＴＥＮＴなどの演算子を使用して、所望の式に強制することができる。属性名が名前スペースにあり、名前スペースが範囲内にない場合、実装により合成された名前スペース宣言および／またはプリフィックスを発行することができる。実装は名前のプリフィックス値に従う必要はなく、これは単なる逐次化のヒントである。型付け属性を構築するために、これをＸＭＬスキーマ型情報でマーク付けするか、またはＸＱＵＥＲＹＶＡＬＩＤＡＴＥなどの型演算子を適用することができる。
【０１３８】
ＴＥＸＴＣＴＯＲおよびＣＤＡＴＡＣＴＯＲ演算子
ＴＥＸＴＣＴＯＲはＱｉｌＵｎａｒｙクラスを使用して実装される。子オペランドはテキストコンテンツであり、文字列型付けシングルトンでなければならない。ＣＤＡＴＡＣＴＯＲは、オプションの逐次化のヒントを示すＴＥＸＴＣＴＯＲである（すなわち、ＣＤＡＴＡセクションを使用するため）。実装によりこのヒントを無視することができる。
【０１３９】
ＣＯＭＭＥＮＴＣＴＯＲ演算子
ＣＯＭＭＥＮＴＣＴＯＲはＱｉｌＵｎａｒｙクラスを使用して実装される。ＣＬＡＳＳオペランドはテキストコンテンツであり、文字列型付けシングルトンでなければならない。
【０１４０】
ＰＩＣＴＯＲ演算子
ＰＩＣＴＯＲはＱｉｌＢｉｎａｒｙクラスを使用して実装される。左オペランドはターゲットＮＣＮＡＭＥであり、ヌルであってもよい。そうでない場合はＱＮａｍｅ型付けシングルトンでなければならない。右オペランドは残りのコンテンツであり、文字列型付けシングルトンでなければならない。
【０１４１】
ＮＡＭＥＳＰＡＣＥＤＥＣＬ演算子
ＮａｍｅｓｐａｃｅＤｅｃｌはＱｉｌＢｉｎａｒｙクラスを使用して実装される。これは名前スペース宣言を構築する。左オペランドはプリフィックスであり、望ましくはＱＮａｍｅ型付けシングルトンである。右オペランドは名前スペースであり、望ましくは文字列型付けシングルトンである。左オペランドが空の文字列の場合、ＮＡＭＥＳＰＥＣＥＣＴＯＲはデフォルトの名前スペース宣言に対応する。
【０１４２】
名前スペース宣言の競合が発生した場合（たとえば、エレメントのコンテンツの中の同じプリフィックスに対する２つのＮＡＭＥＳＰＡＣＥＣＴＯＲＳ、またはすでに発行されたプリフィックス付き名前と競合するＮＡＭＥＳＰＡＣＥＣＴＯＲ）、この振る舞いは実施により定義される。
【０１４３】
ＲＴＦＣＴＯＲ演算子
ＲＴＦＣＴＯＲはＱｉｌＵｎａｒｙクラスを使用して実装され、その子はノードシーケンスまたは空のシーケンスであることが望ましい。これは、結果ツリーフラグメントを（ＸＳＬＴから）構築する。効果的には、ＲＴＦＣＴＯＲはナビゲーションに対するバリアであり、コンポジションが行われるのを防ぐ。多くの点で、これはノードよりは原子値のように振る舞う。
【０１４４】
【表１７】
2005018776.tif 000019
【０１４５】
ノードプロパティ演算子
ノードプロパティ演算子としてグループ化された演算子のセットについて、下記および表１７で説明する。ＱＩＬは名前などの特定のノードプロパティにアクセスするための演算子をサポートする。
【０１４６】
ＮＡＭＥＯＦ演算子は、ノードのＱＮａｍｅを計算する。ノードに名前がない場合、空のシーケンスを戻す。ＬＯＣＡＬＮＡＭＥＯＦ、ＮＡＭＥＳＰＡＣＥＯＦ、およびＰＲＥＦＩＸＯＦ演算子は、ノードの名前の対応部分を計算する。ノードに名前がないか、またはこれらの部分のうちの１つが欠けている場合、空の文字列を戻す。これら演算子のすべては、それらのオペランドがシングルトンノードである必要がある。
【０１４７】
【表１８】
2005018776.tif 000020
【０１４８】
コピーおよびプロジェクション演算子
コピーおよびプロジェクション演算子としてグループ化された演算子のセットについて、下記および表１８で説明する。ＱＩＬはいくつかの種類のコピーおよびプロジェクション演算子をサポートする。コピーは望ましくは原子値に影響を与えない演算である。ノードに関する影響は、実質上オリジナルの正確な複製であるが、新しいノード識別を備えた複製を生成する。プロジェクションはノード識別を「保持」するが、選択的にノードを枝取り（ｐｒｕｎｅ）してそのコンテンツの一部のみを保持する。
【０１４９】
ＤＥＥＰＣＯＰＹは、ノードによってヘッドされた部分グラフ全体のコピーを構築する。ＳＨＡＬＬＯＷＣＯＰＹは、エレメントおよび文書ノード以外のすべてのノード種類について、そのコンテンツではなく文書ノードをコピーする文書について、そのコンテンツではなく（すなわち属性なし）エレメントノード（すなわちその名前）をコピーするエレメントについて、ＤＥＥＰＣＯＰＹと同じである。
【０１５０】
ＰＲＯＪＥＣＴＩＮＣＬＵＤＥおよびＰＲＯＪＥＣＴＥＸＣＬＵＤＥは、どちらもバイナリ演算子である。左オペランドは、ノードのシーケンスにわたるＦＯＲ反復子でなければならない。右オペランドは、可能性としてその反復子を参照しているブールシングルトンでなければならない。どちらの演算子も、左オペランドによって記述されたフォレスト（ｆｏｒｅｓｔ）にわたって再帰的に繰り返すこと、ならびに、右オペランドがｔｒｕｅと評価するすべてのノードおよびすべての祖先をそれぞれ含むかまたは除外することによって、プロジェクションを実行する。
【０１５１】
【表１９】
2005018776.tif 000021
【０１５２】
型演算子
型演算子としてグループ化された演算子のセットについて、下記および表１９で説明する。ＱＩＬは、ＱＩＬ型システムと共に動的に機能するための多くの演算子を定義する。
【０１５３】
【表２０】
2005018776.tif 000022
【０１５４】
ＡＴＯＭＩＺＥ演算子
ＡＴＯＭＩＺＥ演算子は、標準に記載されたＸＱｕｅｒｙ原子化（ａｔｏｍｉｚａｔｉｏｎ）規則を実行することによって、ＸＭＬノードの型付け値を効果的に取り出す。詳細には、ＡＴＯＭＩＺＥは任意の基数のシーケンスを取り、原子値に対しては無演算（ｎｏ−ｏｐ）であり、ノードに対しては型付け値のアクセサへのコールのような、オリジナルシーケンスのメンバの原子値からなる新しいシーケンスを戻す。たとえば、（ＸＱｕｅｒｙＡｔｏｍｉｚｅ（Ｌｉｓｔ（１  “ｂ”  ３））では結果的にリストは変更されないが、＄ｘは型付け値（１，２）を備えたノードであり、＄ｙは型付け値（“３”，４）を備えたノードである、（ＸＱｕｅｒｙＡｔｏｍｉｚｅ（Ｌｉｓｔ  ＄ｘ  ＄ｙ））は、結果的に組み合わせられたシーケンス（１，２，“３”，４）となるであろう。
【０１５５】
ＴＲＥＡＴＡＳ演算子
ＱＩＬは強くかつ静的に型付けされているため、式が静的に有するよりもより強いかまたはより弱い型が望まれる場合がある。たとえば、式が整数の場合、ダブル（ｄｏｕｂｌｅ）が望ましい場合がある。このような場合（たとえばアップキャスティング（ｕｐｃａｓｔｉｎｇ）またはダウンキャスティング（ｄｏｗｎｃａｓｔｉｎｇ））、ＴＲＥＡＴＡＳを使用して、式を所望の型または基数に強制することができる。
【０１５６】
ＴＲＥＡＴＡＳは、引数および型を取る。これは、引数をその型を有するものとして扱おうとする。動的影響は、何もしないこと（すなわち、値は変更されないままである）か、そうでなければエラーである。静的影響は、式の静的型を変更することである。ＣｏｎｖｅｒｔまたはＸＱｕｅｒｙ  Ｖａｌｉｄａｔｅとは異なり、型の階層にまたがって動くことは可能でなく、構文解析は行われない。たとえば、文字列を整数として扱ったり、または小数をダブルとして扱ったりしようとするとエラーになる。
【０１５７】
ターゲット型のすべてのプロパティが使用される。ターゲット型のプロパティが引数型のそれに等しいとき、何の働きも行われない。プロパティが異なるとき、効果は以下のとおりである。引数の基数がターゲット基数と互換性がある場合、値は変更されずに戻される。そうでない場合、エラーが発生することがある。表２０は基数の互換性を示している。引数の（正確、動的ば）基数が左側、（静的）ターゲット基数が上側にある。「ＯＫ」はＴＲＥＡＴ−ＡＳの成功を意味し、「ｅｒｒ」は失敗を意味する。
【０１５８】
【表２１】
2005018776.tif 000023
【０１５９】
引数アイテムの種別がターゲットアイテムの種別と互換性がある場合、値は変更されずに戻される。そうでない場合、エラーがスローされる。表２１は、アイテムの種別の互換性を記述している。
【０１６０】
【表２２】
2005018776.tif 000024
【０１６１】
引数原子型がターゲット原子型と互換性がある場合、値は変更されずに戻される。そうでない場合、エラーが発生することがある。この互換性は、リスト／共用体によってではなく制約によって、一方が他方から継承する場合、そしてその場合にのみ、２つの型が互換性がある部分型置換性規則によって決定される。ターゲット型が厳密でなければ、ＸＭＬ型情報を調べて、引数型が静的なものの部分型であるかどうかを判定することができる。そうでなければ、これはＱＩＬ原子型から判定することができる。引数ノード種別とターゲットノード種別とのビットワイズの論理和がゼロであれば、エラーが発生することがある。そうでなければ、ノード種別は互換性がある。
【０１６２】
最終的に、ターゲット型が厳密でなければ、厳密さはチェックされない。ターゲット型が厳密であり、引数型はそうでない場合、引数は厳密なターゲット型を動的に有しているはずであり、そうでなければエラーが生じる可能性がある。
【０１６３】
ＣＡＮＴＲＥＡＴＡＳ演算子
ＣＡＮＴＲＥＡＴＡＳはＴＲＥＡＴＡＳが成功するとｔｒｕｅを戻し、そうでない場合はｆａｌｓｅを戻す（ＴＲＥＡＴＡＳがエラーとなる場合）。この演算子は主にＣＯＮＶＥＲＴ/ＩＳＣＯＮＶＥＲＴＩＢＬＥとの対称のために存在する。
【０１６４】
ＣＯＮＶＥＲＴ演算子
ＣＯＮＶＥＲＴ演算子は、１つの型の値から別の型の値へのデータ型変換を適用する。たとえば、（Ｃｏｎｖｅｒｔ（Ｓｔｒｉｎｇ“１”）Ｉｎｔ３２）の結果は整数１となる。ＣＯＮＶＥＲＴは、値がすでに有しているか、または有するように昇格される型にのみキャストすることができる、ＴＲＥＡＴＡＳとは異なる。
【０１６５】
適用される固有の型変換は、ＸＱｕｅｒｙによって使用されるものとマッチすることになる。
【０１６６】
ＩＳＣＯＮＶＥＲＴＩＢＬＥ演算子
ＩＳＣＯＮＶＥＲＴＩＢＬＥは、ＣＯＮＶＥＲＴが成功するであろう場合ｔｒｕｅを戻し、そうでない場合はｆａｌｓｅを戻す（ＣＯＮＶＥＲＴがエラーとなるであろう場合）。これは通常ＣＯＮＶＥＲＴを実行するのと同じくらい費用がかかるが、計算をエラーで終了する代わりに条件付きブランチを可能にする。この演算子は主にＸＱｕｅｒｙのＣＡＳＴＡＢＬＥ演算子をサポートするために存在する。
【０１６７】
ＩＳＴＹＰＥ演算子
ＩＳＴＹＰＥは、値が指示された型を有する場合にｔｒｕｅを戻す。これは、型のスイッチおよび等化物を実施するのに役立つ。ＱｉｌＴｙｐｅの各態様では、常にあらゆる値と一致するワイルドカード値（たとえば、ＱｉｌＣａｒｄｉｎａｌｉｔｙ．Ａｎｙ、ＱｉｌＡｔｏｍｉｃＴｙｐｅ．Ａｎｙなど）がある。したがって、たとえばある式が任意の型のエレメントであるかどうかをテストするために、ＱｉｌＴｙｐｅのＸｍｌＮｏｄｅＫｉｎｄがＱｉｌＸｍｅＮｏｄｅＫｉｎｄ．Ｅｌｅｍｅｎｔであり、エレメントおよび他のすべての値はワイルドカードであるＱｉｌＴｙｐｅを使用することができる。ある式が所与の基数を有するかどうかをテストするために、ＱｉｌＴｙｐｅの基数がその値であり、その型の他のすべてのアスペクトはワイルドカードであるＱｉｌＴｙｐｅを使用することができる。
【０１６８】
ＩＳＥＭＰＴＹ演算子
ＩＳＴＹＰＥ（ＱｉｌＣａｒｄｉｎａｌｉｔｙ．Ｚｅｒｏを使用する）と同様に、この演算子はシーケンスが空の場合にｔｒｕｅを、そうでない場合はｆａｌｓｅを戻す。
【０１６９】
ＸＱｕｅｒｙ演算子
ＸＱｕｅｒｙ演算子としてグループ化された演算子のセットについて、下記および表２２で説明する。特定の言語は、他のＱＩＬ演算子を使用して表現することができない追加の演算子を有するか、そうでなければその言語がそれ自体のノード型に値するほど一般的である。
【０１７０】
【表２３】
2005018776.tif 000025
【０１７１】
ＸＱＵＥＲＹＥＢＶ演算子
この単項演算子は値のシーケンスを取り、ＸＱｕｅｒｙ仕様に記載された規則に従ってこれをブール値に変換する。
【０１７２】
具体的には、オペランドが空のシーケンスか、ブール値ｆａｌｓｅか、空の文字列か、ゼロ（任意の数値型）か、またはＮａＮ（ｄｏｕｂｌｅまたはｆｌｏａｔ）である場合に、ｆａｌｓｅを戻す。それ以外の場合はｔｒｕｅを戻す。
【０１７３】
ＸＱＵＥＲＹＥＬＥＭＥＮＴＣＯＮＴＥＮＴ演算子
ＸＱＵＥＲＹＥＬＥＭＥＮＴＣＯＮＴＥＮＴは、その引数としてシーケンスを取り、ノードのシーケンスを戻す。オリジナルシーケンスの中の各ノードは保持され、隣接する原子値の各シーケンスは、分離スペースと連結された原子値が入っているテキストノードに変換される。
【０１７４】
ＸＱＵＥＲＹＡＴＴＲＩＢＵＴＥＣＯＮＴＥＮＴ演算子
ＸＱＵＥＲＹＡＴＴＲＩＢＵＴＥＣＯＮＴＥＮＴは、その引数としてシーケンスを取り、文字列値を戻す。オリジナルシーケンスノ中の各ノードはその文字列値によって置き換えられ、各原子値も文字列に変換される。その後、結果として生じる原子値のシーケンスは、分離スペースと連結される。
【０１７５】
ＸＱＵＥＲＹＶＡＬＩＤＡＴＥ演算子
ＸＱＵＥＲＹＶＡＬＩＤＡＴＥ演算子は、ノードのシーケンスを妥当性検査し、その結果、妥当性検査エラーか、そうでなければ型注釈付きノードの新しいシーケンスとなる。これは、ＸＱｕｅｒｙのＶＡＬＩＤＡＴＥ演算子と同じ意味を有する。
【０１７６】
ＸＰａｔｈ演算子
ＸＰａｔｈ演算子としてグループ化された演算子のセットについて、下記および表２３で説明する。ＸＰａｔｈは追加のナビゲーション軸および何らかの型変換を表すのに必要な、少数の演算子を有する。これらの一部は、既存のＱＩＬ演算子を使用して表現することが可能であるが、それら自体の表現に値するほど十分に一般的である。
【０１７７】
ＸＰＡＴＨＮＯＤＥＶＡＬＵＥ、ＸＰＡＴＨＮＵＭＢＥＲＴＯＳＴＲＩＮＧ、およびＸＰＡＴＨＳＴＲＩＮＧＴＯＮＵＭＢＥＲは、ＸＰａｔｈ型変換規則を実装する。３つはすべて単項演算子である。ＸＰＡＴＨＮＯＤＥＶＡＬＵＥに対するオペランドはシングルトンノードでなければならない。オペランドＸＰＡＴＨＮＵＭＢＥＲＴＯＳＴＲＩＮＧは、シングルトン数値型でなければならない。ＸＰＡＴＨＳＴＲＩＮＧＴＯＮＵＭＢＥＲに対するオペランドはシングルトン文字列でなければならない。
【０１７８】
その他の演算子はナビゲーションを実行する。オペランドがシングルトンノードでなければならないものはすべて単項演算子であり、それらは結果として、そのナビゲーション演算によって到達したノードの期待シーケンスとなる。
【０１７９】
【表２４】
2005018776.tif 000026
【０１８０】
ＤＭＬ演算子
ＤＭＬ演算子としてグループ化された演算子のセットについて、下記および表２４で説明する。ＱＩＬは、挿入、削除、および更新などのデータ変更演算を表すことができる。
【０１８１】
ＸＱｕｅｒｙのＤＭＬ文法は、ＸＱｕｅｒｙ文法の条件付き生成を変えて、いずれかのブランチとしてＤＭＬステートメントを可能にする。これは条件のためのＱＩＬ式を変更する必要はなく、コンパイラは条件付きノードのｔｒｕｅ／ｆａｌｓｅブランチとしてＤＭＬ式を配置することになる。ＸＱｕｅｒｙのＤＭＬ文法はＦＬＷＲ式を変えて、通常のｒｅｔｕｒｎ節に代わってＤＭＬステートメントが現れるようにもできる。ＦＬＷＲ式のＱＩＬ式（Ｔｕｐｌｅ）は、ＴＵＰＬＥノードの戻りメンバである。ＸＱｕｅｒｙのＤＭＬ文法は、ＩＮＳＥＲＴ、ＵＰＤＡＴＥ、ＤＥＬＥＴＥ、およびＲＥＰＬＡＣＥという４つの新しい演算子を追加する。表２４にリスト表示されたＱＩＬ演算子が、ＸＱｕｅｒｙのＤＭＬ仕様によって定義されたものと同じセマンティックスと共にこれらを表す。
【０１８２】
ＤＭＬ演算子には戻り値がないため、対応するＱＩＬＤａｔａＴｙｐｅがない。値ＱｉｌＩｔｅｍＫｉｎｄ．Ｄｍｌは、コンパイラおよびオプティマイザでのスタティック型チェックを容易にするＤＭＬ式型を表す。ＱＩＬ式がＤＭＬを実行できるかどうかをテストするためには、一番上のノードのＭｅｍｂｅｒＫｉｎｄを調べる必要がある。
【０１８３】
【表２５】
2005018776.tif 000027
【０１８４】
特殊演算子
特殊演算子としてグループ化された演算子のセットについて、下記および表２５で説明する。ＮＯＰノード型は、主としてＱＩＬオンデマンドの構築をサポートするためか、またはＱＩＬのトップダウン構築を容易にするために存在する。たとえば、開発者はＮＯＰノードをグラフの中に配置し、構築が発展するにつれて、後でそのコンテンツをあてがうことができる。ノード型は依然として適切に設定されなければならないことに留意されたい。
【０１８５】
ＵＮＫＮＯＷＮノード型は、主として、コンパイル中に部分的に構築されたＱＩＬをサポートするため、およびアプリケーションがそれら独自の目的でＱＩＬを「再利用」できるようにするために存在する。基本的に、ＵＮＫＮＯＷＮは定義されたセマンティックスのない不透明なノード型であり、全くどのようなクラスを使用しても表すことができる。
【０１８６】
ＥＲＲＯＲノード型は２つの引数を取る。第１は文字列シーケンスでなければならず、ユーザへのメッセージを記述する。第２はブールシングルトンでなければならず、ｔｒｕｅの場合はエラーが致命的である（実行終了に関する）ことを示す。ｆａｌｓｅの場合、実行はメッセージ後も続行することができる。
【０１８７】
オペランドの型または基数に関して制約は設定されない。
【０１８８】
【表２６】
2005018776.tif 000028
【０１８９】
外部データソース演算子
外部データソースと称される演算子について、下記および表２６で説明する。外部データの主なソースはＤＡＴＡＳＯＵＲＣＥノード型であり、ＱＩＬＤＡＴＡＳＯＵＲＣＥクラスで実装される。この演算子は、そのデータソースの種類を記述する（たとえば名前スペースのように）文字列タグ値と、ＱＩＬによって解釈されないが、何らかのバックエンドプロセッサに対する意味を有する可能性のある任意のＵｓｅｒ  Ｄａｔａオブジェクトとを有する。
【０１９０】
データソースはディレクトリまたはファイルに対するパス名であるか、あるいはユニバーサルリソースロケータアドレスであってよい。このデータソース型の場合、Ｕｓｅｒ  Ｄａｔａオブジェクトは文字列を評価するＱＩＬノード式である。文字列値は、（たとえば、ｄｏｃｕｍｅｎｔ（）関数に対するコールとまったく同様）ＸＭＬ文書をロードするための関数に渡すためのロケーションを識別する。ＸＭＬ文書は実際のＸＭＬである必要はなく、文書は仮想ＸＭＬの型などのＸＭＬの抽象化であってよい。
【０１９１】
【表２７】
2005018776.tif 000029
【０１９２】
（まとめ）
上記で述べたように、本発明の例示的な実施形態について、様々なコンピューティングデバイスおよびネットワークアーキテクチャに関連して説明してきたが、基礎となる概念は、ＸＭＬのための中間言語表現を実装することが望ましい任意のコンピューティングデバイスまたはシステムに適用することができる。このように、本発明の方法およびシステムは、様々なアプリケーションおよびデバイスに適用することができる。例示的なプログラミング言語、名前、および例が、本明細書では、様々な選択肢の代表として選択されているが、これらの言語、名前、および例に限定されることを意図するものではない。通常の当業者であれば、本発明によって達成されるものと同じ、同様、または等価のシステムおよび方法を達成する、オブジェクトコードを提供する数多くの方法があることを理解されよう。
【０１９３】
本明細書に記載された様々な技法は、ハードウェアまたはソフトウェア、あるいは適切であればその両方の組合せに関連して実装することができる。このように、本発明の方法および装置、またはその特定の態様または部分は、フロッピー（登録商標）ディスク、ＣＤ−ＲＯＭ、ハードドライブ、または任意の他のマシン読取り可能媒体などの有形の媒体に具体化されるプログラムコード（すなわち命令）の形を取ることが可能であり、当該プログラムコードがコンピュータなどのマシンにロードされ、マシンによって実行される場合、このマシンは本発明を実施するための装置となる。プログラム可能コンピュータ上でプログラムコードを実行する場合、コンピューティングデバイスは一般に、プロセッサ、プロセッサによって読取り可能な記憶媒体（揮発性および不揮発性のメモリおよび／または記憶エレメントを含む）、少なくとも１つの入力デバイス、ならびに少なくとも１つの出力デバイスを含むことになる。たとえばデータ処理ＡＰＩなどの使用を通じて、本発明の信号処理サービスを利用することができる１つまたは複数のプログラムは、コンピュータと通信するために、高水準手続き型またはオブジェクト指向型のプログラミング言語で実施されることが好ましい。しかしプログラムは、必要であればアセンブリまたはマシン言語で実施することができる。いずれの場合でも、言語はコンパイルまたは解釈された言語であり、ハードウェア実装と組み合わせることができる。
【０１９４】
本発明の方法および装置は、電気配線またはケーブルを介するか、光ファイバを介するか、または任意の他の形式の伝送を介するなど、何らかの伝送媒体を介して伝送される、プログラムコードの形態で具体化される通信を経由して実施することも可能であり、当該プログラムコードが、ＥＰＲＯＭ、ゲートアレイ、プログラム可能な論理デバイス（ＰＬＤ）、クライアントコンピュータ、ビデオレコーダなどまたは前述の例示的実施形態に記載されたような信号処理機能を有する受信側マシンによって受信され、ロードされ、実行されると、本発明を実施するための装置となる。汎用プロセッサ上で実施される場合、プログラムコードはプロセッサと組み合わされて、本発明の機能を呼び出すために動作する固有の装置を提供する。さらに、本発明に関連して使用される任意の記憶技法は、常にハードウェアおよびソフトウェアの組合せであってよい。
【０１９５】
以上、本発明について、様々な図面の好ましい実施形態に関連して述べてきたが、他の同様の実施形態が使用可能であり、あるいは記載の実施形態に、本発明を逸脱することなくその同じ機能を実行するために修正および追加が可能であることを理解されよう。さらに、特に無線ネットワークデバイスの数が激増を続けるにつれて、ハンドヘルドデバイスオペレーティングシステムおよび他のアプリケーション特有のオペレーティングシステムを含む、様々なコンピュータプラットフォームが企図されることも強調されるべきであろう。それゆえ、本発明はどの単一の実施形態にも限定されるべきではなく、むしろ添付の特許請求の範囲による範囲および広がりにおいて解釈されるべきである。
【図面の簡単な説明】
【０１９６】
【図１】本発明の態様が実施可能な例示的なコンピューティング環境を示すブロック図である。
【図２】本発明の例示的態様を実現する例示的な機能アーキテクチャを示すブロック図である。
【図３】本発明の実施形態による中間言語生成のいくつかの例示的な要素を示すブロック図である。
【図４】本発明の実施形態による中間言語生成の例示的なプロセスを示すブロック図である。
【符号の説明】
【０１９７】
２１０ａ〜ｄ  フロントエンド言語コンパイラ
３１０  演算識別子
３２０  ノード演算子プロセッサ
２４０ａ〜ｄ  バックエンドクエリエンジン
【図１】
2005018776.tif 000030
【図２】
2005018776.tif 000031
【図３】
2005018776.tif 000032
【図４】
2005018776.tif 000033