XPath(基礎編): ロケーションパス

2005年07月03日(日)更新


■XPath: ロケーションパス

さらら: ロケーションパス?

たけち: うん。これまでみてきたXSLスタイルシートのサンプルで使ってきたんだけどね。まだ説明が足りないのでここで説明しようかと思って・・・前回カレントノードの話をしたよね。

さらら: あっ、そうだったわね・・・

たけち: これまでのXSLスタイルシートのサンプルでは、カレントノードからみて、子供のテキストノードをとったり、属性の値をとったりしたよね。

さらら: えぇ。。

たけち: それだけでも十分なことも多いんだけどね。実際には、親のノードをみたり、前のノードを見たりすることも必要なことがあるんだ。たとえば、「自分(カレントノード)の親のノードの子の最初のノード」を見たりね。そういう風にノードをたどっていく道筋を示すものをロケーションパスって言うんだ。

さらら: じゃあ、これまでXSLサンプルで見てきたようなものなのね。

たけち: 実際にはそうなんだ。だから、あんまり難しく考えなくって良いよ。ロケーションパスは次のような指定になるんだ。

ロケーションパスの構成

さらら: あらら、これまでXSLサンプルで見てきたようなものとずい分イメージが違うわねぇ・・・ (^ ^; なんだか分かりにくそうね。。。。コンテキストノードってなぁに? カレントノードと違うの?

たけち: コンテキストノードはXPathで指定しているノードのことなんだ。カレントノードは、XSLのテンプレートで扱っているノードなんだよね。XSLスタイルシートの中では、カレントノードからの相対でノードを指定(Xpathによるコンテキストノード指定)するよね。たとえば、「子ノードのxxノード」とか「親ノードyyyの最初のノード」とかね。そのときは、コンテキストノードはカレントノードからは離れていっているけど、カレントノードは変わってはいないんだよ。

さらら: じゃあ、XPathで指定するノードをコンテキストノードって言って、XSLのテンプレートでその時々で扱っているノードをカレントノードって考えたらいいのかしら。でも、ごちゃごちゃしそう・・・ (^ ^;

たけち: そうだね。。。。実例をみると慣れるかもね。


■XPath: 軸(axis)

さらら: やっぱり分かりにくいわ・・・

たけち: そっか・・・・でも具体的な例を見てゆくと分かってくると思うよ。今回は軸(axis:アクシス)を中心に説明しようね。軸には次のようなものがあるんだ。

XPathのロケーションパス: 軸(axis)

さらら: 12個もあるのね。。。。でも、どれもいままで見たこと無いわ。どうして??

たけち: あっ、正式には軸(axis:アクシス)は上の図のように書くんだけど、省略形もあるんだ。

さらら: あっ、そうなんだ!!

たけち: 軸(axis:アクシス)の省略形をつぎに載せておくね。

child
なし <--- NULL、です(「なし」って書かないでね (^ ^; )
descendant
// <--- スラッシュがふたつ、です
self
. <--- ドット、です... (^ ^; 見えます?!
parent
.. <--- ドットがふたつ、です

さらら: あっ、childのスラッシュやdescendantのスラッシュふたつは見たことある!! なるほど、そういうことだったのね。わかったわ。

たけち: そうなんだよね。じゃあ、具体的な軸(axis)の指定の例を見てみようね。次のリストは今回のサンプルで使うXMLドキュメントだよ。


■XPath: ロケーションパスのサンプル

mayosyu XMLドキュメントのサンプル

<?xml version="1.0" encoding="Shift_JIS"?>
<?xml-stylesheet type="text/xsl" href="volume.xsl"?>

<manyosyu>
<volume no="1">
<overview>
  第一巻は雑歌として天皇の時代ごとに歌が整理されています。
</overview>

<body>
<poem pno="0008">
  <yomi>
    熟田津(にきたつ)に、船(ふな)乗りせむと、月待てば、潮もかなひぬ、今は漕(こ)ぎ出(い)でな
  </yomi>
</poem>

<poem pno="0028">
  <yomi>
    春過ぎて 夏来たるらし 白妙(しろたえ)の 衣干したり 天(あめ)の香具山(かぐやま)
  </yomi>
</poem>

</body>
</volume>

<volume no="2">
<overview>
  天皇の時代ごとに分類し、それぞれ年代順に載せています。柿本人麻呂のすぐれた挽歌(ばんか)があります。
</overview>
<body>
<poem pno="0090">
  <yomi>
    君が行き、日(け)長くなりぬ、山たづの、迎へを行かむ、待つには待たじ
  </yomi>
</poem>

<poem pno="0092">
  <yomi>
    秋山の、木の下隠(がく)り、行く水の、我れこそ益さめ、御(み)思ひよりは
  </yomi>
</poem>

<poem pno="0107">
  <yomi>
    あしひきの、山のしづくに、妹(いも)待つと、我れ立ち濡れぬ、山のしづくに
  </yomi>
</poem>
</body>

</volume>

</manyosyu>

さらら: ちょっと深いわね。。。。

たけち: 分かりやすいように図に構造を示しておくね。それから、今回のXPathでのロケーションパスのサンプルと示すコンテキストノードを示しておくね。

XMLドキュメントサンプルの構造とロケーションパスのサンプル

さらら: これならわかるわ。あっ、child::poem[last()]とかは、どういう意味なの??

たけち: あっ、そうだね。。。。一応、それぞれの意味を書いておくね。

parent::volume/@no
親のvoluemノードのno属性
preceding-sibling::overview
前方のoverviewノード
child::poem[last()]
子ノードpoemのうちの最後のpoemノード。。。。。最初のpoemノードだと、position()=1が使われます。

さらら: あぁ、そういう意味なのね。わかるわ。

たけち: これらの指定を含んだXSLサンプルのリストを次に載せるね。

XPathサンプル用xslスタイルシート

<?xml version="1.0" encoding="Shift_JIS"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
  <html>
    <head>
    <title>たのしいXML: XPathサンプル: 軸指定</title>
  <link rel="stylesheet" type="text/css" href="manyo.css" />
    </head>

    <body>
    <p align="center">万葉集サンプル: XPathの軸指定を使う</p>

    <xsl:apply-templates select="//body" />

    </body>
    </html>
</xsl:template>

<xsl:template match="//body">
<xsl:variable name="no_of_volume" select="@no" />
    <p>■カレントノードは、manyosyu/volume/body です。</p>

    <div>
    <p> - <xsl:value-of select="parent::volume/@no" />の内容は次のとおりです。</p>
    <p><xsl:value-of select="parent::volume/@no" /></p>

    <p> - <xsl:value-of select="preceding-sibling::overview" />の内容は次のとおりです。</p>
    <p><xsl:value-of select="preceding-sibling::overview" /></p>

    <p> - <xsl:value-of select="child::poem[last()]" />の内容は次のとおりです。</p>
    <p><xsl:value-of select="child::poem[last()]" /></p>

    </div>

</xsl:template>

</xsl:stylesheet>

たけち: じゃあ、このXMLテキストを"volume.xml"というファイル、XSLスタイルシートを"volume.xsl"というファイルにして、実際にどうなるか見てみようね。次のテキストをクリックしてみて。

XPathサンプルの表示結果

さらら: 少しだけど、またXPathについて学んだわ。

たけち: よかった・・・今度はロケーションパスの述部について説明しようかなぁ・・・

さらら: は〜い!! (^ ^* 楽しみにしてるわ!!

→次はXPath-述部です (^ ^;