XPathとXSLTの関数 【ノード集合関数】 count

2003年11月23日(日)更新


【ノード集合関数】 count

たけち: 今回は、ノード集合関数のひとつ、count関数について学ぼうね。

さらら: はい。 (^ ^*

たけち: countは、指定したノード集合内のノードの数を取得するのに使うんだ。

さらら: えっ。。。(? ?)

たけち: たとえばね、ある要素ノードの数を数えたりするのに使えるんだよ。

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

たけち: count関数は、どう書くのかをつぎに載せておくね。

  • 書式: 整数値 count(ノードセット)

さらら: これって、どういう意味なの?

たけち: count(ノードセット)と書いてcount関数を呼ぶと、リターン値として、ノードの数が整数値として返される、という意味なんだよ。

さらら: そうなんだ。。。

たけち: じつは、この書き方は、このページ(たのしいXML)での書き方なんだ。だから、標準的な書き方、という訳じゃないから、気をつけてね。


count関数の使用例

さらら: なんとなく分かったけど、やっぱりサンプルが無いとよく分からないわ。

たけち: そうだね。じゃあ、簡単なサンプルを見てみよう。

さらら: はい。 (^ ^*

たけち: 次の【poem.xml】を見て。

【poem.xml】

<?xml version="1.0" encoding="Shift_JIS" ?>
<?xml-stylesheet type="text/xsl" href="count.xsl"?>
<manyosyu>
<poem pno="8" poet="額田王">
熟田津(にきたつ)に船(ふな)乗りせむと月待てば潮もかなひぬ今は漕(こ)ぎ出(い)でな
</poem>

<poem pno="20" poet="額田王">
茜(あかね)さす 紫野行き標野(しめの)行き 野守(のもり)は見ずや 君が袖振る
</poem>

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

<poem pno="37" poet="柿本人麻呂">
見れど飽かぬ 吉野の川の 常滑(とこなめ)の 絶ゆることなく またかへり見む
</poem>

<poem pno="113" poet="額田王">
み吉野(よしの)の 玉(たま)松(まつ)が枝(え)は はしきかも 君が御言(みこと)を 持ちて通(かよ)はく
</poem>

<poem pno="137" poet="柿本人麻呂">
秋山に 落つる黄葉(もみちば) しましくは な散り乱ひそ 妹があたり見む
</poem>

</manyosyu>

さらら: 歌が6首載っているわ。pno属性が歌番号で、poet属性で歌人名を示しているのね。

たけち: そうだね。じゃあ、このxmlデータを元にして、

  • 載っているすべての歌の数
  • 歌人ごとの歌の数
を表示してみよう。歌の数を数えるのにcount関数を使うよ。

さらら: えぇ。

たけち: 次の【count.xsl】を見て。

XSLTスタイルシート: count関数の使用例

<?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>count関数の使用例: 歌人ごとの歌の数</title>
         <link rel="stylesheet" type="text/css" href="manyo.css" /></head>
      <body>

      <p>■count関数の使用例: 歌人ごとの歌の数</p>

      <xsl:apply-templates />

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

<xsl:template match="manyosyu">
      manyo.xml中の歌の数 : <xsl:value-of select="count(poem)" />首<br />

   <xsl:call-template name="count">
      <xsl:with-param name="person" select="'額田王'" />
   </xsl:call-template>

   <xsl:call-template name="count">
      <xsl:with-param name="person" select="'柿本人麻呂'" />
   </xsl:call-template>

   <xsl:call-template name="count">
      <xsl:with-param name="person" select="'持統天皇'" />
   </xsl:call-template>

</xsl:template>

<xsl:template name="count">
   <xsl:param name="person">dummy</xsl:param>
   <p>・<xsl:value-of select="$person" /> : 
         <xsl:value-of select="count(poem[@poet=$person])" />首</p>
      <xsl:for-each select="poem[@poet=$person]">
         - <xsl:value-of select="." /><br />
      </xsl:for-each>
</xsl:template>

</xsl:stylesheet>


■count(poem)

さらら: 二箇所でcount関数を使っているのね。。。。最初の
<xsl:value-of select="count(poem)" />
の、count(poem)って
poem要素ノードの数を数えているの?

たけち: そうなんだね。カレントノードがmanyosyu要素ノードだから、count(poem)poemで、manyosyu要素ノードのすべてのpoem子要素ノードを示しているんだね。

さらら: そっか〜。。。う〜ん、と。じゃあ、二つ目のは。。。

count関数の使用例(1)


■count(poem[@poet=$person])

たけち: 二つ目のcount関数は、"count"という名前のテンプレートで使われているね。この、テンプレートは、3個所で呼び出されているね。

さらら: あっ、額田王、持統天皇、そして柿本人麻呂の値を"person"という名前のパラメタにセットして呼び出しているのね。

たけち: そうそう。だから、
<xsl:value-of select="count(poem[@poet=$person])" />
は、
<xsl:value-of select="count(poem[@poet='額田王'])" />
<xsl:value-of select="count(poem[@poet='持統天皇'])" />
<xsl:value-of select="count(poem[@poet='柿本人麻呂'])" />
として働くんだね。

さらら: そうなんだ。。。じゃあ、たとえば、
<xsl:value-of select="count(poem[@poet='柿本人麻呂'])" />
とすると、poet属性が"柿本人麻呂"のpoem要素ノードの数、この場合は"2"という値が得られるのね。 。

count関数の使用例(2)

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

万葉集第1巻抜粋のXMLファイル poem.xml(上記説明のXML/XSL適用)

歌の数を表示

さらら: あっ、こんな風に表示されるのね。なるほど〜。

たけち: よかった。じゃあ、今回はこれでおしまい。

さらら: はい。ありがと。 (*^ ^*)

→次は、current関数です (^ ^;