サンプルで覚えるXSLTプログラミング

2.XPathの基礎知識

 XSLTのスタイルシートの記述の中には、XML文書が持つツリー構造の表記法、すなわちXPath表現が出てきます。XPathはXMLツリーの場所を指定する言語(表記方法)です。ここでは、そのXPath表現の基本的な部分を紹介しましょう。ちなみに、XPathはXMLでは表記されていません。

XML文書をツリー構造で見る

 XPathについて説明する前に、実際にXPathの例をいくつか見ていただきましょう。サンプルとして、PCの情報を記述した以下のXML文書を使います。

<PC>
  <CPUS>
    <CPU>
      <MANUFACTURE>INTEL</MANUFACTURE>
      <MODEL>Pentium III</MODEL>
      <CLOCK UNIT="MHz">700</CLOCK>
    </CPU>
  </CPUS>
  <MEMORIES>
    <TYPE>SDRAM</TYPE>
    <MANUFACTURE>Micron</MANUFACTURE>
    <MEMORY UNIT="MB">256</MEMORY>
  </MEMORIES>
  <HDD>
    <MANUFACTURE>Quantum</MANUFACTURE>
    <CAPACITY UNIT="GB">20.4</CAPACITY>
  </HDD>
</PC>

 このXML文書をツリー構造で表示してみると次のようになります。

 この図の概要を説明しつつ、XPathについての説明を加えていきましょう。

 まず、このツリーの解説を行う前にいくつかの用語を紹介します。

 ノードはXML文書の最小構成単位だと考えてください。ノードの種類にはいくつかあります。おもなものは、タグを表すエレメントノード、タグの中の属性(Attribute)である属性ノードなどです。そのほかにもテキストノードコメントノードなどがあります。この解説ではノードを親子関係にして説明しています。

 次にツリーの構造を見ていきましょう。まず、どのXML文書にも必ず“root”(ルート)があります。 図ではその子エレメントノードとして“PC”があります。この場合の“PC”ノードを、ドキュメントエレメントと呼ぶことがあります。また、“PC”ノードには直接のテキスト値がありませんから、空を意味する“*”が記入されています。

 さらにツリーを下っていきます。“PC”の子エレメントノードは3つあります。年上順(記述されている順番)に“CPUS” “MEMORIES” “HDD”です。

 “CPUS”は“CPU”という子エレメントノードを持っています。このエレメントノード“CPU”にもテキスト値がないので、空を意味する“*”が記入されています。

 このエレメントノード“CPU”には3つの子エレメントノードがいます。年上順に“MANUFACTURE” “MODEL” “CLOCK”です。一番兄の“MANUFACTURE”は“INTEL”、2番目の“MODEL”は“Pentimum III”、一番下の“CLOCK”は“700”を、それぞれテキスト値として持っています。

 一番下のエレメントノード“CLOCK”は、属性ノード“UNIT”を持っています。 属性ノード “UNIT”は、テキスト値“MHz”を持っています。

 これが、XML文書をツリーで表現する基本的な方法です。

XPathの表記方法

 では。XPathでそれぞれのノード、もしくはノード群をどのように表記するのか、具体例を説明していきましょう。ただし、この連載で使用するのは、以降のXSLTでの解説に必要な省略系の表記だけにします。

 まず、“root”は“/”で表記されます。その下のエレメントノード“PC”は“/PC”、その子エレメントノード“CPUS”は“/PC/CPUS”と、絶対パスで表記されます。

 もし現在地がエレメントノード“PC”であった場合、子エレメントノード “CPUS”は“CPUS”と表記されます。

 ここまでくればXPathのElementの表記が、UNIXのファイルシステムのディレクトリによく似ていることがお分かりでしょう。

 次は属性ノードです。属性ノードはエレメントノードとは違う表記をする必要があります、例えば、 “/PC/CPU/CPUS/CLOCK”の属性ノード“UNIT”は、“/PC/CPUS/CPU/CLOCK/@UNIT”と、表記されます。

 XPathではUNIXのパス表記と同じようにワイルドカード“*”が使用できます。 例えば “/PC/*”とするとPCの子エレメントノード3つを同時に表し、“/PC/CPUS” “/PC/MEMORIES” “/PC/HDD”が該当します。

 また、UNIX同様に親ディレクトリを表す“..”もXPathで使用することが可能です。エレメントノード“CLOCK”の兄エレメントノードである“MODEL”は、“CLOCK”からは“../MODEL”と表記されます。

 さらに、このXML文書には3つの“MANUFACTURE”と呼ばれるエレメントノードが存在しています。このすべてを指す表現もあります。それは“//MANUFACTURE”と表記すればいいのです。“//”は必ずしも先頭にある必要はなく、“/PC//MANUFACTURE”でもかまいません。

 さて、これでXPathによる表記法の基本的な知識が身についたことになります。ここで説明しきれなかったものもありますが、それらついては、その場で必要に応じて説明していくことにしましょう。


Index
サンプルで覚えるXSLTプログラミング
  1. XMLからHTMLへの変換
スタイルシートはどのように解釈されるか
2. XPathの基礎知識
XML文書をツリー構造で見る
XPathの表記方法
  3. XSLTエレメントの概要
コラム XSLTプロセッサのインストール
  4. テンプレート系XSLTエレメント
テンプレートの定義
該当するテンプレートの適用
指定されたテンプレートの呼び出し
  5. 変数系XSLTエレメント
変数の定義1
変数の定義2
  6. 出力系XSLTエレメント
該当する表現の値を代入
エレメントノードの生成
属性ノードの生成
テキストノードの生成
コメントノードの生成
PI(processing-instruction)の生成
出力方法の指定
  7. フローコントロール系XSLTエレメント
ループ処理
条件分岐
IF文
  8. その他のXSLTエレメント
他のXSLファイルの読み込み
数の割り当て
  9.XSLT関数の概要
関数の主な分類
  10. 文字列系関数
文字列の連結
文字列の調査
数字のフォーマッティング
空白の除去
……
  11. 数値計算系関数
切り上げ
表現の数を数える
切り下げ
数値型への変換
四捨五入
加算
  12. ノードに関する関数
  13. bool代数系関数
  14. その他の関数
  15. JavaによるXSLTの拡張
Built-inクラスの呼び出し
カスタムメイドの関数を作る


XML & SOA フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

HTML5+UX 記事ランキング

本日月間