XML:XSLT:xsortでソートされた結果をXPATHで指定した場合、ソート前の結果が返却される
XML (18 items)
2004年10月14日
XMLデータからデータ取得する場合、
基本的にノードを辿ってデータを検索することになる。
その際に、”このノードの、この値”というものを、
所謂UNIX等の、ディレクトリパス表記のような形で表現する。
<記述例>
・XMLデータ(data5.xml)
<?xml version="1.0" encoding="Shift_JIS" ?>
<?xml-stylesheet type="text/xsl" href="data6.xsl"?>
<test>
<count>3</count>
<count>5</count>
<count>1</count>
<count>4</count>
<count>2</count>
</test>
・XPATH表記(testノード配下のcountノードの総数を変数”total”に代入)
<xsl:variable name="total" select="count(test/count)"/>
※$totalの値は、”5”。
<記述例>
<xsl:value-of select="preceding::count[position()=1]" />
※現在のcountノードから見て、前のcountノードの値。
※例えばこれで、前のノードとの値の比較処理も実現できる。
このXPATHであるが、XSLTの”sort”(ソート機能)と絡ませて処理した場合、
期待した結果(ソート後のデータに対してXPATH指定の値が返却される)が返ってこない。
つまり、ソート前のデータに対してXPATH指定したような値が返却される。
※この辺りの仕様、対処方法などが詳しくわかれば追記予定。。。
<例>
・XMLデータ(上述のdata6.xml)を編集するXSLT(data6.xsl)
<?xml version="1.0" encoding="Shift_JIS" ?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://www.w3.org/1999/xhtml" version="1.0">
<xsl:output
method="html"
version="1.0"
encoding="Shift_JIS"
omit-xml-declaration="yes"
standalone="yes"
doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN"
doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
indent="yes"
media-type="text/html"/>
<xsl:template match="/">
<!-- HTML出力部 -->
<html>
<head>
<title>Result</title>
</head>
<body>
<xsl:apply-templates />
<!-- HTML出力部 -->
</body>
</html>
</xsl:template>
<xsl:template match="test">
<xsl:apply-templates select="count">
<xsl:sort select="." data-type="number" order="descending" />
</xsl:apply-templates>
</xsl:template>
<xsl:template match="count">
No.<xsl:number value="position()" format="1"/>=<xsl:value-of select="." />、
直前の値<xsl:value-of select="preceding::count[position()=1]" /><br />
</xsl:template>
</xsl:stylesheet>
・期待した結果のHTML
<html>
<head>
<title>Result</title>
</head>
<body>
No.1=5、直前の値 <br />
No.2=4、直前の値5<br />
No.3=3、直前の値4<br />
No.4=2、直前の値3<br />
No.5=1、直前の値2<br />
</body>
</html>
・実際の結果のHTML(ソート前のデータを参照している)
<html>
<head>
<title>Result</title>
</head>
<body>
No.1=5、直前の値3<br />
No.2=4、直前の値1<br />
No.3=3、直前の値 <br />
No.4=2、直前の値4<br />
No.5=1、直前の値5<br />
</body>
</html>
■使用例のダウンロード
ダウンロードし、data6.xmlをブラウザで見る事で確認できます。
>>ダウンロード
※XSLTの動くブラウザでお試し下さい。IEであればIE6以上です。