前のメモの最後で、XML ドキュメント内の特定の範囲を選択するために使用される 2 つの要素
1. 関連用語
(1) ノード: 適切にフォーマットされた XML ドキュメントは、XPath のノードもこのツリー構造のノードです。要約すると、以下の 7 種類のノードがあります:
ノード タイプ | 説明 |
XML ドキュメント ルート ノード | XML ドキュメントのルートはドキュメント ノードまたはルート ノードと呼ばれます |
要素ノード | 開始タグ、終了タグ、およびその間のすべてのコンテンツは要素ノードと呼ばれます |
属性ノード | 要素の各属性は、属性名と属性値を含む属性ノードを構成します。要素ノードへ |
名前空間ノード | XML 文書の xmlns:prefix 属性は名前空間ノードと呼ばれます 属性ノード |
テキスト ノード | XML 要素の途中にある文字 データ (文字データを含む) CDATAセグメント内 |
コメントノード | XML文書中のに含まれるコメント部分がコメントノードを構成します |
処理命令ノード | XML文書の処理命令部分処理命令ノードを構成します |
(2) 基本値 (アトミック値、アトミック値とも呼ばれます): 整数値、文字列などの単純なリテラル値を表すために特に使用されます。基本値は、親ノードも子ノードも持たないノードとみなすことができる。
(3) アイテム: アイテムは基本値またはノードを表します。
(4) ノードセットとシーケンス (Sequence): XPath 式は複数のノードを表すことができます。XPath1.0 では、複数のノードの組み合わせをノードセットと呼び、XPath2.0 では「シーケンス」という用語が追加されました。 、通常のプロジェクトまたはノード セットを表すことができます。
(5) ノード関係:
ノード関係 | 説明 | ||
親ノード | 各要素または属性には親ノードがあります | ||
子ノード Children | Elementノードは 0 、 1 があります複数の子ノード|||
同じ親ノードを持つノードを兄弟ノードと呼びます | |||
ノードの親ノード、親ノードの親ノード、ずっとルートノードへ | |||
ノードの子ノード、子ノードの子ノード... |
ancestor | 現在のノードのすべての祖先 (親、祖父など) ノードを選択します。 | |
ancestor-or-self | 現在のノードのすべての祖先(親、祖父など)ノードと現在のノード自体を選択します | |
attribute | @ | 現在のノード、現在のノードが要素ノードでない場合、属性軸方向に設定されているノードは空です |
child | 省略して書かないでください | 現在のノードの子ノードをすべて選択します |
descendant | // | 現在のノードのすべての子孫ノード (子、孫など) を選択します |
descendant-or-self | 現在のノードのすべての子孫ノード (子、孫など) を選択しますノードと現在のノード自体 | |
following | ドキュメント内の現在のノードを選択します 終了タグの後のすべてのノードには、現在のノードの子孫ノードと属性ノードは含まれません | |
following-sibling | ドキュメント内の現在のノードの終了タグの後にあるすべての兄弟ノードを選択します | |
namespace | 現在のノードが要素ノードでない場合、ノードセットにあるすべての名前空間ノードを選択します。名前空間軸の方向が空です | |
parent | .. | 現在のノードの親ノードを選択します |
preceding | 子孫を除く、ドキュメント内の現在のノードの開始タグの前にあるすべてのノードを選択します現在のノードのノードと属性ノード | |
preceding-sibling | ドキュメント内の現在のノードの開始タグの前にあるすべての兄弟を選択 Node | |
self | . | 現在のノードを選択 |
(2) ノード テスト: ノード テストは、指定された軸方向から特定の一致するノードを選択するために使用されます。XPath では、次の表に示すように、一般的に使用されるノード テスト構文が使用されます。
指定された軸方向からノード名のノードを選択します | |||
子孫::book は現在のノードのすべての book 子孫ノードを選択します(ブックの子ノード、孫ノードなどを含む) |
node() 指定された軸に一致するすべてのタイプのノードを選択します | ||
に一致するすべてのテキストタイプのノードを選択します指定された軸 | |||
子孫::text() は現在のノードのすべてのテキスト子孫ノード (テキスト サブノード、テキスト孫ノードを含む) を選択します, など) |
comment() 指定された軸に一致するすべてのコメントノードを選択します | ||
指定された軸に一致するすべての処理命令ノードを選択します | |||
ノードテストワイルドカードの意味はすべて、つまりフィルタリングなし |
/bookstore/book[1] | bookstore 要素の子要素である最初の book 要素を選択します。 |
/bookstore/book[last()] | bookstore 要素の子要素である最後の book 要素を選択します。 |
/bookstore/book[last()-1] | bookstore 要素の子要素である最後から 2 番目の book 要素を選択します。 |
/bookstore/book[position()<3] | bookstore 要素の子要素である最初の 2 つの book 要素を選択します。 |
//title[@lang] | lang という名前の属性を持つすべての title 要素を選択します。 |
//title[@lang='eng'] | eng の値を持つ lang 属性を持つすべての title 要素を選択します。 |
/bookstore/book[price>35.00] | bookstore 要素の book 要素をすべて選択します。price 要素の値は 35.00 より大きくなければなりません。 |
/bookstore/book[price>35.00]/title | bookstore 要素内の book 要素の title 要素をすべて選択し、price 要素の値は 35.00 より大きくなければなりません。 |
3、运算符
从上面的实例中可以看到,在限定谓语中,还可以使用运算符、表达式,还有很多内置的函数供使用。这一小节先看看XPath中支持的运算符:
(1)算术运算符:加(+)、减(-)、乘(*)、除(div)、取模(mod)
算术运算符非常简单,但是需要注意几点:
A、因为减号实际上也就是中划线,而中划线在XML中是合法的标识符号,从而带来了歧义,于是XPath强制规定,使用减号的时候,需要前后各加一个空格。
B、在XPath中,所有的数值都是64位的double类型,即便直接书写成0、100;另外,XPath还有几个特殊的数值:正无穷大、负无穷大、非数。
C、在运算时,如果操作数不是数值类型,会自动转换,下面的比较运算符、逻辑运算符如果有必要也会发生相应的自动类型转换。
(2)比较运算符:等于(=)、不等于(!=)、小于(<)、小于或等于(<=)、大于(>)、大于或等于(>=)
需要注意的是,不像其它编程语言,这里表示相等只需要一个等于号。
(3)逻辑运算符:与(and)、或(or)
(4)集合运算符:并集(|)
4、表达式
(1)for表达式:用于循环访问序列中的每个项,并对每项进行一次计算,最后将每项计算得到的结果组合成序列后返回,语法格式如下:
for $var in sequence return rtExpression
实际上,这里的for更类似于js中的foreach。还可以使用下面的形式遍历多个序列:
for $var1 in sequence1, $var2 in sequence2 return fn($var1,$var2)
(2)if表达式:用于处理分支,根据不同条件得到不同的返回值,语法格式如下:
if (condition1)then rtVal1[else if (condition2)then rtVal2...]elseotherVal
(3)some表达式:迭代中只要有一项满足条件就返回true,否则返回false,语法格式如下:
some $var in sequence satisfies condition
(4)every表达式:迭代中只有有一项不满足条件就返回false,否则返回true,语法格式如下:
every $var in sequence satisfies condition
5、内置函数库
在XPath中还有大量的内置函数,用于增强相关功能,这些内置函数可以参考:XPath函数。我在下面也抄录一份供参考:
分类 | 函数 | 说明 | |
存取函数 | fn:node-name(node) | 返回参数节点的节点名称。 | |
fn:nilled(node) | 返回是否拒绝参数节点的布尔值。 | ||
fn:data(item.item,...) | 接受项目序列,并返回原子值序列。 | ||
fn:base-uri() fn:base-uri(node) | 返回当前节点或指定节点的 base-uri 属性的值。 | ||
fn:document-uri() fn:document-uri(node) | 返回当前节点或指定节点的 document-uri 属性的值。 | ||
错误和跟踪函数 | fn:error() fn:error(error) fn:error(error,description) fn:error(error,description,error-object) | 例子:error(fn:QName('http://example.com/test', 'err:toohigh'), 'Error: Price is too high') 结果:向外部处理环境返回 http://example.com/test#toohigh 以及字符串 "Error: Price is too high"。 | |
fn:trace(value,label) | 用于对查询进行 debug。 | ||
数值函数 | fn:number(arg) | 返回参数的数值。参数可以是布尔值、字符串或节点集。 例子:number('100') 结果:100 | |
fn:abs(num) | 返回参数的绝对值。 | ||
fn:ceiling(num) | 返回大于或等于 num 参数的最小整数。 | ||
fn:floor(num) | 返回小于或等于 num 参数的最大整数。 | ||
fn:round(num) | 把 num 参数四舍五入为最接近的整数。 | ||
fn:round-half-to-even() | 返回最接近参数num的偶数 例子:round-half-to-even(0.5) 结果:0 例子:round-half-to-even(1.5) 结果:2 例子:round-half-to-even(2.5) 结果:2 | ||
字符串函数 | fn:string(arg) | 返回参数的字符串值。参数可以是数字、逻辑值或节点集。 | |
fn:codepoints-to-string(int,int,...) | 根据一个Unicode值序列序列返回字符串。 例子:codepoints-to-string((84, 104, 233, 114, 232, 115, 101)) 结果:'Thérèse' 注: この関数のパラメータは Unicode 値のシーケンスであるため、パラメータは括弧で囲む必要があります | ||
fn:string-to-codepoints(string) | 次に従って各文字に対応する Unicode 値を返します。シーケンスの文字列。 | ||
fn:codepoint-equal(comp1,comp2) | Unicode 値シーケンスの比較に従って、comp1 の値が comp2 の値と等しい場合は true を返し、そうでない場合は false を返します。 | ||
fn:compare(comp1,comp2) fn:compare(comp1,comp2,collation) | 比較規則に従って、comp1 が comp2 より小さい場合は -1 を返し、comp1 が comp2 と等しい場合は返します。 0; comp1 が comp2 より大きい場合は 1 を返します。 | ||
fn:concat(string,string,...) | 文字列の連結を返します。 | ||
fn:string-join((string,string,...),sep) | 文字列パラメータを連結した後の文字列を返すには、セパレータとして sep パラメータを使用します。 | ||
fn:substring(string,start,len) fn:substring(string,start) | 開始位置から始まる指定された長さの部分文字列を返します。最初の文字のインデックスは 1 です。 len パラメータが省略された場合は、文字列の開始位置から末尾までの部分文字列を返します。 | ||
fn:string-length(string) fn:string-length() | 指定された文字列の長さを返します。文字列パラメータがない場合は、現在のノードの文字列値の長さが返されます | ||
指定された文字列の先頭と末尾の空白を削除しますを実行し、内部の連続空白を 1 つに圧縮して結果を返します。パラメータを指定しないと、現在のノードが処理されます。 | |||
Unicode 正規化を実行します。 | |||
文字列パラメータを大文字に変換します。 | |||
文字列パラメータを小文字に変換します。 | |||
string1 の string2 を string3 に置き換えます。 例:translate('12:30','30','45') 結果: '12:45' 例:translate('12:30','03','54') 結果: '12:45' 例: translation('12:30','0123','abcd') 結果: 'bc:da'
| |||
例:escape-uri("http://example.com/test#car", true()) 結果:"http%3A%2F%2Fexample.com%2Ftest#car" 例:escape-uri("http://example.com/test#car", false()) 結果:http://example.com/test#car 例:escape-uri(" http://example.com/~bébé", false()) 結果: "http://example.com/~b%C3%A9b%C3%A9"
| |||
string1 に string2 が含まれる場合は true を返し、それ以外の場合は false を返します。 | |||
string1 が string2 で始まる場合は true を返し、それ以外の場合は false を返します。 | |||
string1 が string2 で終わる場合は true を返し、それ以外の場合は false を返します。 | |||
string1 に出現する前の string2 の部分文字列を返します。 | |||
string1 に string2 が出現した後の部分文字列を返します。 | |||
文字列パラメータが指定されたパターンと一致する場合は true を返し、それ以外の場合は false を返します。 | |||
指定されたパターンを replace パラメータで置換し、結果を返します。 | |||
例: tokenize("XPath is fun", "s+") | 結果: ("XPath", "is", "fun") | ||
任意のURI関数 | fn:resolve-uri(relative,base) | ||
論理関数 | fn:boolean(arg) | 数値、文字列、またはノードセットのブール値を返します。 | |
fn:not(arg) | まず、boolean() 関数を使用してパラメーターをブール値に復元し、次にそれを否定します。 | ||
fn:true() | ブール値 true を返します。 | ||
fn:false() | ブール値 false を返します。 | ||
日付時刻関数 | fn:dateTime(date,time) | パラメータを日付と時刻に変換します。 | |
fn:years-from-duration(datetimedur) | 標準の字句表記で表現された、パラメーター値の年の部分の整数を返します。 | ||
fn:months-from-duration(datetimedur) | 標準語彙表記で表現された、パラメーター値の月の部分の整数を返します。 | ||
fn:days-from-duration(datetimedur) | 標準の語彙表記で表現された、パラメーター値の日数部分の整数を返します。 | ||
fn:hours-from-duration(datetimedur) | パラメーター値の時間の部分を、標準的な語彙表記で表現された整数として返します。 | ||
fn: minutes-from-duration(datetimedur) | パラメーター値の分の部分を、標準の字句表記で表現された整数として返します。 | ||
fn:seconds-from-duration(datetimedur) | 標準語彙表記で表現された、パラメーター値の分の部分の 10 進数を返します。 | ||
fn:year-from-dateTime(datetime) | パラメーターのローカル値の年の部分の整数を返します。 | ||
fn:month-from-dateTime(datetime) | パラメーターのローカル値の月の部分の整数を返します。 | ||
fn:day-from-dateTime(datetime) | パラメーターのローカル値の日の部分の整数を返します。 | ||
fn:hours-from-dateTime(datetime) | パラメーターのローカル値の時間の部分を整数として返します。 | ||
fn: minutes-from-dateTime(datetime) | パラメーターのローカル値の分の部分の整数を返します。 | ||
fn:seconds-from-dateTime(datetime) | パラメーターのローカル値の秒部分の 10 進数を返します。 | ||
fn:timezone-from-dateTime(datetime) | パラメータのタイムゾーン部分が存在する場合はそれを返します。 | ||
fn:year-from-date(date) | パラメーターのローカル値で年を表す整数を返します。 | ||
fn:month-from-date(date) | パラメーターのローカル値で月を表す整数を返します。 | ||
fn:day-from-date(date) | パラメータのローカル値で日を表す整数を返します。 | ||
fn:timezone-from-date(date) | パラメーターのタイムゾーン部分が存在する場合、それを返します。 | ||
fn:hours-from-time(time) | パラメータのローカル値の時間の部分を表す整数を返します。 | ||
fn: minutes-from-time(time) | パラメーターのローカル値の分の部分を表す整数を返します。 | ||
fn:seconds-from-time(time) | パラメータのローカル値の秒部分を表す整数を返します。 | ||
fn:timezone-from-time(time) | パラメータのタイムゾーン部分が存在する場合はそれを返します。 | ||
fn:adjust-dateTime-to-timezone(datetime,timezone) | timezone パラメーターが空の場合は、タイムゾーンなしで dateTime を返します。それ以外の場合は、タイムゾーンを含む dateTime が返されます。 | ||
fn:adjust-date-to-timezone(date,timezone) | timezone パラメーターが空の場合は、タイムゾーンなしの日付を返します。それ以外の場合は、タイムゾーンを含む日付が返されます。 | ||
fn:adjust-time-to-timezone(time,timezone) | timezone パラメーターが空の場合は、タイムゾーンなしの時間が返されます。それ以外の場合は、タイムゾーン付きの時刻を返します。 | ||
QName 関連関数 | fn:QName() | ||
fn:local-name-from-QName() | |||
fn:namespace-uri-from -QName () | |||
fn:namespace-uri-for-prefix() | |||
fn:in-scope-prefixes() | |||
fn:resolve-QName() | |||
fn:name() fn:name(nodeset) | 現在のノードまたは指定されたノード セット内の最初のノードの名前を返します。 | ||
fn:local-name() fn:local-name(nodeset) | 現在のノードの名前、または指定されたノード セット内の最初のノードの名前を名前空間プレフィックスなしで返します。 | ||
fn:namespace-uri() fn:namespace-uri(nodeset) | 現在のノードまたは指定されたノード セット内の最初のノードの名前空間 URI を返します。 | ||
fn:lang(lang) | 現在のノードの言語が指定された言語と一致する場合、true を返します。 例: Lang("en") は ... の場合 true です例: Lang("de") は ... | ||
fn:root() fn:root(node) | 現在のノードまたは指定されたノードが属するノード ツリーのルート ノードを返します。ノードが所属します。通常はドキュメント ノードです。 | ||
コンテキスト関数 | fn:position() | 現在処理中のノードのインデックス位置を返します。 例: //book[position()<=3] 結果: 最初の 3 つの book 要素を選択します | |
fn:last() | 処理されたノード リスト内のアイテムの数を返します。 例: //book[last()] 結果: 最後の書籍要素を選択します | ||
fn:current-dateTime() | 現在の dateTime (タイムゾーン付き) を返します。 | ||
fn:current-date() | 現在の日付 (タイムゾーン付き) を返します。 | ||
fn:current-time() | 現在時刻 (タイムゾーン付き) を返します。 | ||
fn:implicit-timezone() | 暗黙的なタイムゾーンの値を返します。 | ||
fn:default-collation() | デフォルトの照合順序の値を返します。 | ||
fn:static-base-uri() | base-uri の値を返します。 | ||
シーケンス関数 | 一般的なシーケンス関数 | fn:index-of((item,item,...),searchitem) | searchitem パラメータに等しい項目シーケンス内の位置を返します。 例:index-of ((15, 40, 25, 40, 10), 40) 結果: (2, 4) |
fn:remove((item,item,...), Position) | position パラメータで指定された項目を削除しながら、項目パラメータから構築された新しいシーケンスを返します。 | ||
fn:empty(item,item,...) | パラメータ値が空のシーケンスの場合は true を返し、それ以外の場合は false を返します。 | ||
fn:exists(item,item,...) | パラメータ値が空のシーケンスでない場合は true を返し、それ以外の場合は false を返します。 | ||
fn:distinct-values((item,item,...),collation) | 一意の個別の値を返します。 例: unique-values((1, 2, 3, 1, 2)) 結果: (1, 2, 3) | ||
fn:insert-before((item,item,...),pos,inserts) | item パラメータによって構築された新しいシーケンスを返します。同時に、insert パラメータの値を、パラメータによって指定された位置に挿入します。 pos パラメータ。 | ||
fn:reverse((item,item,...)) | 指定された項目の逆の順序を返します。 | ||
fn:subsequence((item,item,...),start,len) | start パラメータで指定された位置にある項目シーケンスを返します。シーケンスの長さは len パラメータで指定されます。最初の項目の位置は 1 です。 | ||
fn:unowned((item,item,...)) | 実装によって決定された順序で項目を返します。 | ||
容量テスト関数 | fn:zero-or-one(item,item,...) | 項目が 0 個または 1 個含まれている場合はパラメーターを返し、それ以外の場合はエラーを生成します。 | |
fn:one-or-more(item,item,...) | パラメータに 1 つ以上の項目が含まれる場合はパラメータを返し、それ以外の場合はエラーが生成されます。 | ||
fn:exactly-one(item,item,...) | パラメータに項目が含まれる場合はパラメータを返し、それ以外の場合はエラーが生成されます。 | ||
比較関数 | fn:deep-equal(param1,param2,collation) | param1とparam2が等しい(deep-equal)場合はtrueを返し、そうでない場合はfalseを返します。 | |
Total 関数 | fn:count((item,item,...)) | ノードの数を返します。 | |
fn:avg((arg,arg,...)) | パラメータ値の平均を返します。 | ||
fn:max((arg,arg,...)) | パラメータの最大値を返します。 | ||
fn:min((arg,arg,...)) | パラメータの最小値を返します。 | ||
fn:sum(arg,arg,...) | 指定されたノードセット内の各ノードの値の合計を返します。 | ||
シーケンス生成関数 | fn:id((string,string,...),node) | ||
fn:idref((string,string,...),node) | |||
fn:data((item1,item2,...)) | item1、item2などの値で構成されるシーケンスを返します。 | ||
fn:doc(URI) | |||
fn:doc-available(URI) | doc() 関数がドキュメント ノードを返す場合は true を返し、それ以外の場合は false を返します。 | ||
fn:collection() fn:collection(string) |
明らかに、これらの組み込み関数をここに置く目的は、暗記を強制することではなく、単に必要なときに辞書で調べることです。 (XQuery 1.0 と XPath はこれらの組み込み関数を共有しています。何か用事がある場合はチェックしてみると良いでしょう。見覚えのあるものです)。