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

2003年12月21日(日)更新


【ノード集合関数】 position

たけち: 今回は、ノード集合関数のひとつ、position関数について学ぼうね。といっても、last関数の例で使ったんだけどね。

さらら: あっ、そうだったっけ・・・(^ ^;

たけち: position関数は、ノードリスト内のコンテキストノードの位置を数値で返してくれるんだ。

さらら: あっ、思い出したわ。last関数とposition関数を使って、一番最後のノードかどうかを調べたんだったわね。

たけち: そうだったね。じゃ、まず、position関数は、どう書くのかをつぎに載せておくね。

  • 書式: 数値 position()

さらら: 引数は無いのね。

たけち: そうだね。さっそく、いつものようにサンプルをみてみよう。ここでは、XMLデータ中の歌のリストを生成するのに使ってみようね。

さらら: はい。 (^ ^*

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

XMLデータ例: 万葉集第1巻・第2巻抜粋

<?xml version="1.0" encoding="Shift_JIS" ?>

<manyosyu>
<poem pno="8">
  <pno>8</pno>
  <poet>額田王(ぬかたのおおきみ)</poet>
  <yomi>熟田津(にきたつ)に船(ふな)乗りせむと月待てば潮もかなひぬ今は漕(こ)ぎ出(い)でな</yomi>
</poem>

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

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

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

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

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

</manyosyu>

さらら: これまでにサンプルとして使ったXMLデータと同じね。

たけち: このデータを元にして、表示する歌の順、つまりpoem要素ノードの順に、1から番号を付けてみよう。

さらら: ということは、position関数を使って、表示するpoem要素ノードが何番目なのかを知るのね。

たけち: そうだね。じゃあ、これを実現するXSLTスタイルシートの例をみてみよう。

さらら: はい。 (^ ^*

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

XSLTスタイルシート例: position関数を使って表示順に番号表示
<?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: XSLTスタイルシート例(position()で番号を表示)</title>
    <link rel="stylesheet" type="text/css" href="manyo.css" />
    </head>

    <body>
    <p align="center"><font color="navy">万葉集第1巻抜粋: position()で番号を表示</font></p>

    <table border="1" width="600" align="center">
        <tr>
            <th width="10%">No.</th>
            <th width="40%">歌人</th>
            <th>歌</th>
    </tr>

    <xsl:apply-templates />

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

<xsl:template match="poem">
        <tr>
            <td align="center"><xsl:value-of select="position()" /></td>
            <td><xsl:value-of select="poet" /></td>
            <td><xsl:value-of select="yomi" /></td>
        </tr>
</xsl:template>

</xsl:stylesheet>


■position()

さらら: <xsl:value-of select="position()" />の個所よね。これで、コンテキストノードpoem要素ノードが、ノードリストで何番目かを求めているのね。

たけち: そうだね。この場合のノードリストはmanyosyu要素の全ての子要素ノードpoemだね。

さらら: えぇ。

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

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

表示する歌の順に番号を表示

さらら: 分かったわ。

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

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

→つづきます (^ ^;