XPath(基礎編): ルートノード

2003年7月6日(日)更新


■XPathのノード

さらら: たけち、XPathってずいぶん久しぶりね。(^ ^* なんだかすっかり忘れちゃったわ。

たけち: そっ、そうだね。(^ ^; ここからはXPathについてもうすこし詳しく学んでいこうと思うんだ。場合によってはXSLTと行ったりきたりするかもしれないけどね。

さらら: あっ、XSLTではXPathを使っているのだったわね。

たけち: そうだったね。で、今回は、XPathのデータモデルのなかのルートノードについて少しみてみようね。

さらら: あっ、はい。

たけち: XPathのデータモデルでは次のようなノードがあらわれるんだよ。

XPathで扱われるノード

  1. ルートノード(root node)
  2. 要素ノード(element node)
  3. 属性ノード(attribute node)
  4. テキストノード(text node)
  5. ネームスペースノード(namespace node)
  6. プロセッシングインストラクションノード(processing instruction node)
  7. コメントノード(comment node)

さらら: あら、意外にあるのね。

たけち: うん。すこしずつやって行くから、今はあんまり気にしないで。

さらら: えぇ。。。。あっ、ルートノードって、XMLデータのルート要素ノードとは違ったのね。少し思い出したわ。でも、ルートノードってルート要素ノードくらいしか子ノードを持たないんじゃなかったかしら?

たけち: あっ、いいこと言ってくれるね。今回は、そのことについてお話ししようと思っていたんだ。


■XPath: ルートノードの特徴

たけち: ルートノードは、ツリーのルート、つまり一番おおもとの根っこのノードだね。で、ルートノードは他のノードと大きく違う点があるんだ。

さらら: 根っこのノードだから親ノードが無い、ってこと?

たけち: うん。それもそうだね。実は、ルートノードには名前が無いんだ。

さらら: あっ、そうなの。。。。そっか。そういわれればそれでもいいって感じがするわね。ルートノードってひとつしかないものね。

たけち: そうそう。それから、ルートノードは次のノードを持つんだ。

ルートノードが持つノード

  1. ルート要素ノード
  2. プロセッシングインストラクションノード
  3. コメントノード

さらら: ルート要素ノードはわかるけど、プロセッシングインストラクションノードとコメントノードはXMLデータのどこにでてくるの?

たけち: じゃあ、それを簡単なXMLデータでみてみようね。

さらら: えぇ。


■具体例でルートノードについて確認しましょう

たけち: 次の、簡単なXMLデータ【sarara.xml】を見て。

さらら: あら、私の歌・・・(^ ^;

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

<?xml version="1.0" encoding="Shift_JIS"?>
<!-- コメント(1): プロセシングインストラクション -->
<?xml-stylesheet type="text/xsl" href="routenode.xsl"?>

<!-- コメント(2): さららの歌 -->
<sarara>
<poem>春過ぎて夏来るらし白栲の衣干したり天の香具山</poem>
<!-- コメント(3): 春が過ぎて夏が来たわ。白妙(しろたえ)の衣が香久山(かぐやま)の方に見えてる。 -->
</sarara>

<!-- コメント(4): これで終わり -->

さらら: あっ、プロセシングインストラクションって・・・(^ ^;

たけち: 思い出した? 3行目の

<?xml-stylesheet type="text/xsl" href="routenode.xsl"?>

のところだよね。

さらら: えぇ。そうだったわ。。。。それから、コメントは分かるわ。

たけち: で、このXMLデータをXPathで眺めてみると次のようになるんだ。

【sarara.xml】をXPathで見ると。

たけち: ルート要素ノード sarara とその子ノード以外は、ルートノードの子ノードになるんだね。

さらら: そうなの。こうなっているのね。

たけち: じゃあ、具体的にちょっとみてみよう。この【sarara.xml】データに、【routenode.xsl】を実際に適用してルートノードの子ノードを見てみようね。次の【routenode.xsl】を見て。

XSLTスタイルシート【routenode.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>ルートノード</title></head>
<body>
<p><font color="maroon">■ルートノードのコメントノード : <br />
  <xsl:apply-templates select="child::comment()" />
</font></p>
<p><font color="green">■ルートノードのプロセシングインストラクションノード : <br />
  <xsl:value-of select="child::processing-instruction()" />
</font></p>
</body>
</html>
</xsl:template>

<xsl:template match="child::comment()">
<xsl:value-of select="." />
<xsl:if test="position()!=last()">
<xsl:text disable-output-escaping="no">, </xsl:text><br />  
</xsl:if>

</xsl:template>


</xsl:stylesheet>

たけち: ここでは【routenode.xsl】の細かいところの説明は省略するけど、コメントノードとプロセシングインストラクションノードの見方はそれぞれ次のようになっているね。

コメントノード
child::comment()
プロセシングインストラクションノード
child::processing-instruction()

さらら: そう書けばいいのね。。

たけち: じゃあ、実際にこの【sarara.xml】データに、【routenode.xsl】を実際に適用してInternet Explorerで見てみよう。次のように表示されるはずだよ。

【sarara.xml】表示結果


■プロセシングインストラクションの文字列

さらら: なるほど〜。あれ? プロセシングインストラクションノードのところって、
type="text/xsl" href="routenode.xsl"
って表示されているわ。

たけち: あっ、そうそう。この場合、全部文字列で表示されるんだ。というのは、プロセシングインストラクションには属性が無いんだよね。

さらら: えっ、そうなの?

たけち: XMLの仕様からすると、プロセシングインストラクションの
type="text/xsl" href="routenode.xsl"
などは、単なる文字列として扱われるんだよね。

さらら: ふぅ〜ん。でも、XSLTスタイルシートの適用ってできるようになっているのよね?

たけち: うん。で、実際には
Associating Style Sheets with XML documents Version 1.0
という仕様で、typeやhrefなどを属性のように扱いましょう(pseudo attributes)となっているんだよね。

さらら: あっ、じゃあ実質的には属性のように扱われるから心配しなくていいのね。

たけち: そうだね。じゃあ、今回はここまで。

さらら: は〜い!! (^ ^*

→次回をお楽しみに。 (^ ^;