倭マン's BLOG

くだらない日々の日記書いてます。 たまにプログラミング関連の記事書いてます。 書いてます。

XPath 1.0 のコア関数 (1) : ノードセット関数 (Node Set Functions)

すでに「XPath 2.0」が存在している現在ですが、あえて XPath 1.0 に定義されているコア関数を見ていきます(記事一覧)。 XPath 1.0 仕様書「4.1 Node Set Functions」参照。

各関数を見ていく前に2つほど補足を。

  • 関数の引数と返り値で使用される変数の型については、たとえば拙者の以前の記事を参照。
  • 関数を評価するには通常、コンテキストを用います。 コンテキストとは次の4つ 5つからなります:
    • コンテキスト・ノード : 式を評価しているノード
    • コンテキスト位置とコンテキスト・サイズ : コンテキスト・ノードの位置と個数
    • 変数のセット
    • 関数ライブラリ
    • 名前空間宣言のセット

また、XPath 1.0 の関数は、大まかに分けて次の4つに分類できます:

  • ノードセット関数 (Node Set Functions)
  • ブール関数 (Boolean Functions)
  • 数値関数 (Number Functions)
  • 文字列関数 (String Functions)

これらを踏まえて、今回はノードセット関数を見ていきます。

関数のシグニチャ

関数名 シグネチャ 返り値の型 説明
last() last() number コンテキスト・ノードの個数を返す
position() position() number コンテキスト位置を返す
count() count(node-set) number 引数のノードセットの個数を返す
id() id(object) node-set id で指定されたノードを返す
local-name() local-name(node-set?) string 引数のノードのローカル名を返す
namespace-uri() namespace-uri(node-set?) string 引数のノードの名前空間 URI を返す
name() name(node-set?) string 引数のノードの展開名を返す

関数の説明とサンプル


以下では、ノードセット関数をほんのチョットだけ詳しく見ていきますが、その前にそれらの説明で用いるサンプルの XML 文書を載せておきます:

<?xml version="1.0"?>
<gr:Groovy-Projects xmlns:gr="groovy-world">
  <gr:Groovy latest-version="1.7.2">
    <url>http://groovy.codehaus.org/</url>
    <description>An agile dynamic language for the Java Platform</description>
  </gr:Groovy>

  <gr:Gant latest-version="1.9.2">
    <url>http://gant.codehaus.org/</url>
    <description>A Groovy-based build system that uses Ant tasks, but no XML.</description>
  </gr:Gant>

  <gr:GMaven latest-version="1.2">
    <url>http://docs.codehaus.org/display/GMAVEN/Home</url>
    <description>GMaven provides integration of Groovy into Maven.</description>
  </gr:GMaven>

  <gr:Griffon latest-version="0.3.1">
    <url>http://griffon.codehaus.org/</url>
    <description>A Grails-like Rich Internet Framework</description>
  </gr:Griffon>

  <gr:Grails latest-version="1.3.1">
    <url>http://grails.org/</url>
    <description>a Groovy-based web framework inspired by Ruby on Rails</description>
  </gr:Grails>
</gr:Groovy-Projects>

では、各関数の説明へ GO!

last() 関数


式を評価しているコンテキストでのコンテキスト・サイズを返す。
シグニチャ

last() : number

サンプルの XPath

//*[last() = 5]

サンプルの評価結果

[<Groovy>, <Gant>, <GMaven>, <Griffon>, <Grails>] (ノードセット)

position() 関数


式を評価しているコンテキストでのコンテキスト位置を返す。
シグニチャ

position() : number

サンプルの XPath

/Groovy-Projects/*[position() = 1]

サンプルの評価結果

"Groovy" (文字列)

count() 関数


引数のノードセットに含まれるノードの個数を返す。
シグニチャ

count(node-set) : number

サンプルの XPath

count(/Groovy-Projects/*)

サンプルの評価結果

5 (数値)

id() 関数


ID によって指定された要素を返す。

  • 引数がノードセット以外の場合

    1. string() 関数によって文字列に変換する

    2. その文字列を空白によってトークンに分割する

    3. これらのトークンのいずれかと同じ ID をもつノードを探す

    4. 見つかった全てのノード集めて、ノードセットとして返す


  • 引数がノードセットの場合、各ノードに対して

    1. string() 関数によって文字列に変換する

    2. この文字列に対して上記の「引数がノードセット以外の場合」を適用し、ノードセットを取得する


    という手順を適用し、得られた結果のノードセットの合併をノードセットとして返す。

シグニチャ

id(object) : node-set

local-name() 関数


引数のノードのローカル名を返す。 もう少し正確には

  • 引数のノードセットの(文書順での)最初のノードに対して、その展開名のローカル部分(ローカル名)を返す。

  • 「引数のノードセットが空」または「最初のノードが展開名を持たない」なら、空文字列を返す。

  • 引数が省略された場合は、コンテキスト・ノードのみを含むノードセットが引数として渡される。

シグニチャ

local-name(node-set?) : string

サンプルの XPath

local-name(/Groovy-Projects/*[position() = 2])

サンプルの評価結果

"Gant" (文字列)

namespace-uri() 関数


引数のノードの名前空間 URI を返す。 もう少し正確には

  • 引数のノードセットの(文書順での)最初のノードに対して、その展開名の名前空間 URI を返す。

  • 「引数のノードセットが空」、「最初のノードが展開名を持たない」、「展開名の名前空間 URI が null」なら、空文字列を返す。

  • 引数が省略された場合は、コンテキスト・ノードのみを含むノードセットが引数として渡される。

シグニチャ

namespace-uri(node-set?) : string

サンプルの XPath

namespace-uri(/Groovy-Projects/*[position() = 3])

サンプルの評価結果

"groovy-world" (文字列)

name() 関数


引数のノードの展開名 (expanded-name) を返す。 もう少し正確には

  • 引数のノードセットの(文書順で)最初のノードの展開名を表す文字列を返す。

  • 引数のノードセットが空か、もしくは最初のノードが展開名を持たないなら、空文字列 ("") を返す。

  • 引数が省略された場合、コンテキスト・ノード(を唯一含むノードセット)が引数として渡される。


要素と属性以外のノードに対して name() 関数を呼び出した結果は、local-name() 関数を呼び出した結果と同じになる。

シグニチャ

name(node-set?) : string

サンプルの XPath

name(/Groovy-Projects/*[position() = 4])

サンプルの評価結果

"gr:Griffon" (文字列)

入門XML

入門XML