比較式は、パスによって指定するノード固有の値が特定の値の範囲にある場合に真となる式です。
比較式の定義を以下に示します。
比較式 ::= 左辺値 比較演算子 右辺値 左辺値 ::= メソッド値 右辺値 ::= リテラル | 関数 メソッド値 ::= パス | パス '!' メソッド
パスで示すノードの値は、パスに続けて“!”+メソッドを記述することで指定できます。
たとえば、要素値や属性値を表す“value()”メソッドを使用して、「A要素の値が100であるXMLデータ」を表すパスは以下のように記述できます。
/[A!value() = 100]
valueメソッドによって参照している値の詳細については“6.5.4 メソッド”を参照してください。
メソッドの記述を省略した場合は、“value()”メソッドが指定されたものとして式を解釈します。
つまり、上記のパスと以下のパスは等価になります。
/[A = 100]
フィルタ内の比較式に出現するパスを絶対パスで指定する場合は、パスが示すノードはフィルタが修飾するノードの子孫ノードでなければなりません。
たとえば以下のXML検索式を指定することはできません。
/[A/B[/A/C/D = 100] = 10]
ただし、上記のXML検索式を以下のように書くことで、同等の意味をもたせることができます。
/[A[C/D = 100 $and$ B = 10]]
比較式の左辺に指定するメソッド値は、メソッドの種類パスの指定およびXMLグループ定義の内容によって値の型が異なります。メソッド値の型は、これらの条件にしたがって以下のどれかとなります。
文字列型
数値型
日付型
比較式を指定する場合は、左辺に指定するメソッド値の型と同じ型のリテラル、または関数を右辺に指定してください。
メソッド値、リテラルおよび関数の型については“6.5.4 メソッド”、“6.5.5 リテラル”および“6.5.6 関数”を参照してください。
比較式の左辺のメソッド値に指定したパスが複数のノードを指す場合があります。
1つはパスに指定した名前の要素が複数XMLデータ中に出現する場合です。
この場合は、パスと対応するノードのうち1つでも比較式の条件を満たすノードが存在した場合に比較式は真となります。
もう1つの場合は、パス演算子“//”や“*”“@*”を使用したパスを指定したときです。
たとえば、“/A/B/C”および“/A/D/E/C”というパスに一致するノードが存在するXMLデータに対して“/A//C = 100”という比較式を指定した場合です。
このような場合は、パスに一致するノードごとにメソッド値の型が異なることがあります。
パスに一致するノードが複数存在しそれぞれのメソッド値の型が異なる場合は、比較式の右辺値と同じ型のノードのなかで1つでも比較式の条件を満たすノードが存在する場合に比較式は真となります。また、パスに一致するノードすべてのメソッド値の型が右辺値の型と異なる比較式は指定できません。