機能
2つの値を比較します。比較には、値比較と汎用比較の2種類があります。
記述形式
参照項番
一般規則
2つの原子値を比較します。
値比較演算子の種類とその機能を以下に示します。
値比較演算子 | 機能 |
---|---|
eq | 第1オペランドの値が第2オペランドの値と等しい場合、trueを返します。 |
ne | 第1オペランドの値が第2オペランドの値と等しくない場合、trueを返します。 |
lt | 第1オペランドの値が第2オペランドの値より小さい場合、trueを返します。 |
le | 第1オペランドの値が第2オペランドの値より小さいか等しい場合、trueを返します。 |
gt | 第1オペランドの値が第2オペランドの値より大きい場合、trueを返します。 |
ge | 第1オペランドの値が第2オペランドの値より大きいか等しい場合、trueを返します。 |
値比較の評価は、まずオペランドを評価することから始まります。オペランドの評価手順を以下に示します。
オペランドに原子化が適用されます。
原子化されたオペランドが空シーケンスであれば、値比較の評価結果は空シーケンスになります。
原子化されたオペランドが、2個以上の項目を含むシーケンスであれば、型エラーが発生します。
原子化されたオペランドがxs:untypedAtomic型であれば、xs:string型にキャストされます。
オペランドの評価が終わった後、オペランドの評価結果のデータ型が、指定された値比較演算子について正しい組み合わせであれば、その値比較演算子をオペランドの評価結果に適用します。このとき、値比較の評価結果はtrue、またはfalseです。データ型が正しい組み合わせでなければ、値比較はエラーを返します。
さまざまな値比較演算子について、正しいオペランドのデータ型の組み合わせを以下の表に示します。
第1オペランドの型 | 第2オペランドの型 |
---|---|
数値(xs:double) | 数値(xs:double) |
xs:boolean | xs:boolean |
xs:string | xs:string |
xs:date | xs:date |
xs:time | xs:time |
xs:dateTime | xs:dateTime |
任意の長さの2つのシーケンスを比較します。第1オペランドのシーケンスの少なくとも1つの項目と、第2オペランドのシーケンスの少なくとも1つの項目が、指定された比較条件を満たしているかどうかを判別します。
汎用比較演算子の種類とその機能を以下に示します。
汎用比較演算子 | 機能 |
---|---|
= | 第1オペランドの少なくとも1つの項目の値が、第2オペランドの少なくとも1つの項目の値と等しい場合、trueを返します。 |
!= | 第1オペランドの少なくとも1つの項目の値が、第2オペランドの少なくとも1つの項目の値と等しくない場合、trueを返します。 |
< | 第1オペランドの少なくとも1つの項目の値が、第2オペランドの少なくとも1つの項目の値より小さい場合、trueを返します。 |
<= | 第1オペランドの少なくとも1つの項目の値が、第2オペランドの少なくとも1つの項目の値より小さいか等しい場合、trueを返します。 |
> | 第1オペランドの少なくとも1つの項目の値が、第2オペランドの少なくとも1つの項目の値より大きい場合、trueを返します。 |
>= | 第1オペランドの少なくとも1つの項目の値が、第2オペランドの少なくとも1つの項目の値より大きいか等しい場合、trueを返します。 |
汎用比較の評価手順は以下の通りです。
オペランドに原子化が適用されます。
原子化されたオペランドが空シーケンスであれば、汎用比較の評価結果はfalseになります。
原子化された第1オペランドのシーケンスの項目と、第2オペランドのシーケンスの項目をそれぞれ1個ずつ選択します。
選択した2つの項目に対して、汎用比較演算子を適用します。汎用比較演算子の適用規則は、以下の通りです。
- 項目の一方のデータ型がxs:untypedAtomic型であり、もう一方のデータ型が数値型(xs:double型)であれば、xs:untypedAtomic型の項目が以下の規則で変換されます。
1. 項目がxs:double型にキャスト可能であれば、xs:double型にキャストされます。
2. 項目がxs:double型にキャストできない場合、項目が表す文字列の中から数値型の書式に一致する文字列が含まれているかを調べます。
2-1. 数値型の書式に一致する文字列が含まれている場合、最初に一致した部分を抜き出します。抜き出した文字列がxs:double型にキャスト可能であれば、項目がキャストした値に置き換えられます。キャストできない場合、項目は空シーケンスに変換されます。
2-2. 数値型の書式に一致する文字列が含まれていない場合、項目は空シーケンスに変換されます。
注意
ここで述べた数値型の書式とは、数値リテラルの記述形式に負符号をゆるし、整数部にあらわれる“,”(カンマ記号)と指数部表現(E+2など)を無視した形式です。
項目が表す文字列と、その項目の変換結果の組合せの例を以下の表に示します。
項目が表す文字列 | 項目の変換結果 |
---|---|
"-10.23" | -10.23 |
"INF" | INF |
"5.6E+3" | 5600 |
"\2,980" | 2980 |
"約2.1E+3" | 2.1 |
"+30.5-1.3" | 30.5 |
"合計20万円" | 20 |
- 項目の一方のデータ型がxs:untypedAtomic型であり、もう一方のデータ型がxs:untypedAtomic型またはxs:string型であれば、xs:untypedAtomic型の項目(あるいは両方の項目)がxs:string型にキャストされます。
- 項目の一方のデータ型がxs:untypedAtomic型であり、もう一方のデータ型がxs:string型、xs:untypedAtomic型、数値型(xs:double型)のどの型でもなければ、xs:untypedAtomice型の項目はもう一方の項目の型にキャストされます。
- 上記で述べたキャスト処理の後、2つの項目の大小関係を値比較演算子(eq、ne、lt、le、gt、ge)を用いて比較します。使用する値比較演算子は、指定した汎用比較演算子に依存します。この値比較演算子と汎用比較演算子の対応関係を以下に示します。
汎用比較演算子 | 使用する値比較演算子 |
---|---|
= | eq |
!= | ne |
< | lt |
<= | le |
> | gt |
>= | ge |
4の値比較の結果がtrueであれば、汎用比較の評価結果はtrueです。値比較の結果がエラーを返すならば、汎用比較もエラーを返します。値比較の結果がtrueでもエラーでもなければ、2の処理に戻って、第1オペランドのシーケンスと第2オペランドのシーケンスの中から、これまでに試していない項目の組み合わせを選択します。全ての項目の組み合わせで、値比較の結果がtrueでもエラーでもなければ、汎用比較の評価結果はfalseです。
使用例
この式は、数値20が数値5よりも大きい値であるため、trueを返します。
20 gt 5
この式は、例1と同じ結果を返します。
20 > 5
この式は、第1オペランドの型がxs:string型であり、第2オペランドの型が数字型(xs:double型)であるため、エラーを返します。
"23" ge 5
この式は、例3と同じ結果を返します。
"23" >= 5
この式は、xs:date型の値1567-05-17がxs:date型の値1192-08-13よりも大きいため、falseを返します。
xs:date("1567-05-17") lt xs:date("1192-08-13")
この式は、例5と同じ結果を返します。
xs:date("1567-05-17") < xs:date("1192-08-13")
この式は、まずパス式/employees/employee[1]/nameによって返されるノードのシーケンスを原子化します。原子化の結果はxs:untypedAtomic型の原子値であるため、xs:string型にキャストされます。キャストされたxs:string方の原子値は、値“Tanaka Tarou”と一致するため、この比較式はtrueを返します。
/employees/employee[1]/name eq "Tanaka Tarou"
この式は、例7と同じ結果を返します。
/employees/employee[1]/name = "Tanaka Tarou"
この式は、第1オペランドの値が空シーケンスであるため、空シーケンスを返します。
() le 10
この式は、第1オペランドの値が空シーケンスであるため、falseを返します。
() <= 10
この式は、まずパス式/employees/employee[1]/ageによって返されるノードのシーケンスを原子化します。原子化の結果は、xs:untypedAtomic型の原子値であるため、xs:string型にキャストされます。その結果、第1オペランドの型がxs:string型であり、第2オペランドの型が数値型(xs:double型)となるため、この比較式はエラーを返します。
/employees/employee[1]/age eq 42
この式は、まずパス式/employees/employee[1]/ageによって返されるノードのシーケンスを原子化します。原子化の結果は、xs:untypedAtomic型の原子値であるため、数値型(xs:double型)の原子値に変換されます。変換されたxs:double型の原子値は、数値型(xs:double型)の値42と一致するため、この比較式はtrueを返します。
/employees/employee[1]/age = 42
この式は、第1オペランドの値が2個以上の項目を含むシーケンスであるため、エラーを返します。
(1, 2) eq 3
この式は、シーケンス(1, 2)の項目に3と等しい値がないため、falseを返します。
(1, 2) = 3
以下の3つの汎用比較式は、初めの2式がtrueを返し、3つ目の式がfalseを返します。つまり、汎用比較式は推移的ではありません。
(1, 2) = (2, 3) (2, 3) = (3, 4) (3, 4) = (1, 2)
以下の2つの汎用比較式はどちらもtrueを返します。つまり、汎用比較式演算子“=”と“!=”は、互いに逆の結果を返すとは限りません。
(1, 2) = (2, 3) (1, 2) != (2, 3)