ホームページ > ウェブフロントエンド > htmlチュートリアル > XML 学習ノート 6??XPath language_html/css_WEB-ITnose

XML 学習ノート 6??XPath language_html/css_WEB-ITnose

WBOY
リリース: 2016-06-24 12:33:49
オリジナル
1094 人が閲覧しました

前のメモの最後で、XML ドキュメント内の特定の範囲を選択するために使用される 2 つの要素 を見つけました。これらの 2 つの要素の値は両方とも XPath 式です。では、XPathとは何でしょうか?簡単に言えば、XPath は XML ドキュメント内の情報を検索するために使用される言語であり、XSLT、XQuery、XPointer などの多くの XML 関連テクノロジは XPath に基づいて構築されています。このノートでは、XPath 言語を学びましょう。

1. 関連用語

(1) ノード: 適切にフォーマットされた XML ドキュメントは、XPath のノードもこのツリー構造のノードです。要約すると、以下の 7 種類のノードがあります:

ノード タイプ 説明
XML ドキュメント ルート ノード XML ドキュメントのルートはドキュメント ノードまたはルート ノードと呼ばれます
要素ノード 開始タグ、終了タグ、およびその間のすべてのコンテンツは要素ノードと呼ばれます
属性ノード 要素の各属性は、属性名と属性値を含む属性ノードを構成します。要素ノードへ
名前空間ノード XML 文書の xmlns:prefix 属性は名前空間ノードと呼ばれます 属性ノード
テキスト ノード XML 要素の途中にある文字 データ (文字データを含む) CDATAセグメント内
コメントノード XML文書中のに含まれるコメント部分がコメントノードを構成します
処理命令ノード XML文書の処理命令部分処理命令ノードを構成します

(2) 基本値 (アトミック値、アトミック値とも呼ばれます): 整数値、文字列などの単純なリテラル値を表すために特に使用されます。基本値は、親ノードも子ノードも持たないノードとみなすことができる。

(3) アイテム: アイテムは基本値またはノードを表します。

(4) ノードセットとシーケンス (Sequence): XPath 式は複数のノードを表すことができます。XPath1.0 では、複数のノードの組み合わせをノードセットと呼び、XPath2.0 では「シーケンス」という用語が追加されました。 、通常のプロジェクトまたはノード セットを表すことができます。

(5) ノード関係:

Elementノードは 0 、 1 があります複数の子ノード兄弟ノード Sibling同じ親ノードを持つノードを兄弟ノードと呼びます先祖ノード Ancestorノードの親ノード、親ノードの親ノード、ずっとルートノードへDescendantノードの子ノード、子ノードの子ノード...

(6) 相対パスと絶対パス: オペレーティング システムのパスと同様に、XPath にも相対パスと絶対パスがあり、絶対パスはスラッシュ (/) で始まり、常にルート ノードから一致しますが、相対パスは一致します。 not スラッシュで始まり、現在のパスから照合を開始します。

2. XPath 構文

。 XPath では、ステップの構文形式は次のとおりです。

轴::节点测试[限定谓语]
ログイン後にコピー

つまり、各ステップは 3 つのスクリーニングを通過しており、1 回目は「axis」を使用してノードの方向を選択します。 「ノード テスト」を使用して、指定された軸方向の一部のノードを選択します。3 回目は、「修飾された述語」を使用して、選択したノードをさらにフィルタリングします。

(1) 軸: XPath では、次のリストにさまざまな軸があります:

ノード関係 説明
親ノード 各要素または属性には親ノードがあります
子ノード Children
軸の簡略化された記述手順
ancestor 現在のノードのすべての祖先 (親、祖父など) ノードを選択します。
ancestor-or-self 現在のノードのすべての祖先(親、祖父など)ノードと現在のノード自体を選択します
attribute @ 現在のノード、現在のノードが要素ノードでない場合、属性軸方向に設定されているノードは空です
child 省略して書かないでください 現在のノードの子ノードをすべて選択します
descendant // 現在のノードのすべての子孫ノード (子、孫など) を選択します
descendant-or-self 現在のノードのすべての子孫ノード (子、孫など) を選択しますノードと現在のノード自体
following ドキュメント内の現在のノードを選択します 終了タグの後のすべてのノードには、現在のノードの子孫ノードと属性ノードは含まれません
following-sibling ドキュメント内の現在のノードの終了タグの後にあるすべての兄弟ノードを選択します
namespace 現在のノードが要素ノードでない場合、ノードセットにあるすべての名前空間ノードを選択します。名前空間軸の方向が空です
parent .. 現在のノードの親ノードを選択します
preceding 子孫を除く、ドキュメント内の現在のノードの開始タグの前にあるすべてのノードを選択します現在のノードのノードと属性ノード
preceding-sibling ドキュメント内の現在のノードの開始タグの前にあるすべての兄弟を選択 Node
self . 現在のノードを選択

(2) ノード テスト: ノード テストは、指定された軸方向から特定の一致するノードを選択するために使用されます。XPath では、次の表に示すように、一般的に使用されるノード テスト構文が使用されます。

nodenameたとえば、child::book は現在のノードのすべての book 子ノードを選択しますtext()たとえば、child::text() は現在のノードのすべてのテキスト サブノードを選択しますprocessing-instruction 指定された軸に一致するすべての処理命令ノードを選択します * ノードテストワイルドカードの意味はすべて、つまりフィルタリングなし

(3) 修飾述語: 各ステップは、選択したノード セットをさらにフィルタリングするために使用される 0 個以上の修飾述語を受け入れることができます。修飾述語は通常、ブール値を返します。以下にいくつかの例を示します。

指定された軸方向からノード名のノードを選択します
子孫::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:normalize-space(string) fn:normalize-space() 指定された文字列の先頭と末尾の空白を削除しますを実行し、内部の連続空白を 1 つに圧縮して結果を返します。パラメータを指定しないと、現在のノードが処理されます。 fn:normalize-unicode() Unicode 正規化を実行します。 fn:upper-case(string) 文字列パラメータを大文字に変換します。 fn: lower-case(string) 文字列パラメータを小文字に変換します。 fn:translate(string1,string2,string3) fn:escape-uri(stringURI, esc-res) fn:contains(string1) ,string2) fn:starts-with(string1,string2) fn:ends-with(string1,string2) fn:substring-before(string1,string2) fn:substring-after(string1,string2) fn:matches(string,pattern) fn:replace(string,pattern,replace) fn:tokenize(string,pattern)例: tokenize("XPath is fun", "s+")ノード関数 fn:name() fn:name(nodeset) 現在のノードまたは指定されたノード セット内の最初のノードの名前を返します。
分类 函数 说明
存取函数 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,collat​​ion)

比較規則に従って、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() 指定された文字列の長さを返します。文字列パラメータがない場合は、現在のノードの文字列値の長さが返されます
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 パラメータで置換し、結果を返します。

結果: ("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: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-collat​​ion() デフォルトの照合順序の値を返します。
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,...),collat​​ion)

一意の個別の値を返します。

例: 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,collat​​ion) 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 はこれらの組み込み関数を共有しています。何か用事がある場合はチェックしてみると良いでしょう。見覚えのあるものです)。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート