SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

今からでも遅くない、JAXPを学ぼう!

今からでも遅くない JAXPを学ぼう!(後編)
XPathとXSLTを掘り下げる

XML文書を他のXML文書に変換する


ダウンロード サンプルコード (3.8 KB)

ロケーションパスを理解

 XPath式はノードセット以外にも、文字列、数値、真偽値を返すことができます。前編ではXPathは「特定の箇所を指定するためのものである」と説明しましたが、ノードの説明が終わったので、より正確な「XPathはノードセットを指定するためのもの」という表現に置き換えます。

 ノードセットを指定するために使うのがロケーションパスです。前編で作成したXSLTスタイルシートで/MEIGARAS/*[.=current()]というコードがありますが、これがロケーションパスです。/(または//)で区切られたものをステップと呼びます。この例ではMEIGARASと*[.=current()]がステップです。

  • ステップ=軸::ノードテスト[述語]
  • 絶対ロケーションパス=/ステップ/ステップ/・・・
    または
  • 相対ロケーションパス=ステップ/ステップ/・・・

 つまり、ルートノードから指定するものを絶対ロケーションパス、コンテキストノードから指定するものを相対ロケーションパスと呼びます。

 それでは、ステップを構成する軸、ノードテスト、述語について順に説明します。以下で説明するのは省略しない記法です。省略形についてはXML Path Language (XPath) Version 1.0で確認してください。

軸(Axis)

 軸とはコンテキストノードから見てどの方向を指すのかに使用されます。13の軸が存在し、そのすべてを次に示します。

child

 コンテキストノードの子(複数存在すればそれらすべて)を指します。

descendant

 コンテキストノードの子孫のノードを指します。子孫とは子、子の子、子の子の子という具合です。属性と名前空間は要素ノードの子ではないためdescendantには含まれません。

descendant

 コンテキストノードの親を指します。

ancestor

コンテキストノードの先祖を指します。先祖とは親、親の親、親の親の親という具合です。最終的にはルートノードも含まれます。ただし、ルートノードではancestor軸は意味を持ちません。

following-sibling

 コンテキストノードに続く兄弟ノードを指します。属性と名前空間には兄弟は存在しないため、属性と名前空間のfollowing-sibling軸は空です。

preceding-sibling

 コンテキストノードの前に存在する兄弟ノードを指します。属性と名前空間には兄弟は存在しないため、属性と名前空間のpreceding-sibling軸は空です。

following

 XML文書は上から下へと順序が存在します。ツリー構造で言えば上から下、左から右という順序が存在します。following軸はコンテキストノードの文書順に従ってそれより後に存在するすべてのノードを指します。ただし、属性と名前空間は含まれません。

preceding

 XML文書は上から下へと順序が存在します。ツリー構造で言えば上から下、左から右という順序が存在します。preceding軸はコンテキストノードの文書順に従ってそれより前に存在するすべてのノードを指します。ただし、属性と名前空間は含まれません。

attribute

 コンテキストノードのすべての属性を指します。従って、コンテキストノードが要素ノードでない場合、attribute軸は空です。

namespace

 コンテキストノードのすべての名前空間ノードを指します。従って、コンテキストノードが要素ノードでない場合、namespace軸は空です。

self

 コンテキストノード自身を指します。

descendant-or-self

 コンテキストノード自身とコンテキストノードの子孫を指します。

ancestor-or-self

 コンテキストノード自身をコンテキストノードの先祖を指します。ルートノードの場合、ルートノード自身を指します。

ノードテスト(Nodetest)

 軸の場合、どの方向を指すのかを示しているため分かりやすい概念です。ノードテストと言うと難しく聞こえますが、軸で示されたノードの中でどの要素を使用するのかを示すためのもので、次の4つの関数を指します。さらに、ノードの名前やワイルドカード(*)もノードテストとみなすことができます。

  • text():軸で示したノードの中からテキストノードを選択します
  • commnet():軸で示したノードの中ならコメントノードを選択します。
  • processing-instruction():軸で示したノードの中から処理命令ノードを選択します
  • node():軸で示したノードの中からノードであれば何でも選択します

述語(Predicate)

 述語とは軸とノードテストで指定されたノードセットをさらに絞り込む場合に使用します。ステップで示したように述語は[]の中にXPath式を記述し、真の場合に軸とノードテストで指定したノードをロケーションパスの指定対象とします。述語が記述されない場合、軸とノードテストで指定されたノードセットがロケーションパスとなります。述語が真となる条件はXPath式が返す型によって決まります。

  • ノードセット:空以外の場合は真、空の場合は偽
  • 数値:0以外は真、0は偽
  • 文字列:空文字("")以外は真、空文字は偽
  • ブール値:論理演算の結果が真であれば真、偽であれば偽(論理演算以外では常に真を返すtrue()関数と常に偽を返すfalse()関数があります)

次のページ
XSLTとXPathの関数の理解

この記事は参考になりましたか?

今からでも遅くない、JAXPを学ぼう!連載記事一覧
この記事の著者

川久保 智晴(カワクボ トモハル)

haruプログラミング教室(https://haru-idea.jp/)主宰。COBOL、FORTRANで13年、Javaを中心としたWeb開発で11年。3つしか言語知らないのかというとそうでもなく、sed/awk、Perl、Python, PHP,  C#, JavaScriptなども一時期は業...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/5155 2010/06/08 23:42

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー