CodeZine(コードジン)

特集ページ一覧

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

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

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2010/06/07 14:00

ダウンロード サンプルコード (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()関数があります)

  • LINEで送る
  • このエントリーをはてなブックマークに追加

バックナンバー

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

著者プロフィール

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

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

あなたにオススメ

All contents copyright © 2005-2021 Shoeisha Co., Ltd. All rights reserved. ver.1.5