position()関数

・コンテキストノードセット内のカレントノードの位置を1から始まる数値で返す。
・XML文書の記述順でなく、ソートやフィルタなどの処理結果に基づく位置によって順番が付く。
・position()=数値   ・・・数値の位置のノードを示す

[サンプルXML文書を表示](下のフレームに)

(例1)出来高の多いい順に並び替え、その結果を数値を付け、色を変えて表示。最後以外は"、"で区切る。コンテキストノード"kabu/name"のソート結果後の位置に基づき1〜の順番が付く。
(例2)コンテキストノードは、終値を条件に抽出された"kabu"だけ。position()関数は抽出された"kabu"だけに番号付けをする。

XMLソース

<?xml version="1.0" encoding="Shift_JIS" ?>
<?xml-stylesheet type="text/xsl" href="for_each01.xsl"?>
<root>
<title>2004年8月20日の東証株式第一部情報</title>
<info><name>銘柄</name><end>終値(円)</end><total>出来高(千株)</total></info>
<data>
<kabu><name code="6752">松下電器産業</name><end>1436</end><total>3362</total></kabu>
<kabu><name code="6753">シャープ</name><end>1516</end><total>9077</total></kabu>
<kabu><name code="6758">ソニー</name><end>3700</end><total>3840</total></kabu>
<kabu><name code="6764">三洋電機</name><end>386</end><total>9712</total></kabu>
<kabu><name code="6501">日立製作所</name><end>667</end><total>8939</total></kabu>
<kabu><name code="6502">東芝</name><end>406</end><total>16041</total></kabu>
<kabu><name code="6701">NEC</name><end>702</end><total>8493</total></kabu>
<kabu><name code="6702">富士通</name><end>671</end><total>3737</total></kabu>
</data>
<end>以上です(2004/9/2)</end>
</root>

XSLソース

<?xml version="1.0" encoding="Shift_Jis"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" encoding="Shift_JIS"/>
<xsl:template match="/">
<center>
<H3><xsl:value-of select="root/title"/></H3>
</center>
<xsl:apply-templates select="root/data"/>
</xsl:template>

<xsl:template match="data">
<H4>(出来高の多い順に表示)</H4>
<xsl:for-each select="kabu/name">
<xsl:sort select="../total" data-type="number" order="descending"/>
<xsl:value-of select="position()"/>:
<xsl:choose>
<xsl:when test="position()=1 or position()=4 or position()=7">
<span style="color:red"><xsl:value-of select="."/></span>
</xsl:when>
<xsl:when test="position()=2 or position()=5 or position()=8">
<span style="color:green"><xsl:value-of select="."/></span>
</xsl:when>
<xsl:otherwise>
<span><xsl:value-of select="."/></span>
</xsl:otherwise>
</xsl:choose>
<xsl:if test="position()!=last()">, </xsl:if>
</xsl:for-each> <hr/>
<H4>(例2:終値が2000以下700以上の銘柄だけを表示)</H4>
<xsl:for-each select="kabu[end &lt;= 2000 and end &gt;= 700]">
<b><xsl:value-of select="position()"/></b>:
<xsl:value-of select="name"/>(<xsl:value-of select="end"/>)、
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>

end(05/4/13)