dポイントプレゼントキャンペーン実施中!

質問は、xsltでソート後に上位n件(例えばTOP10等)のみの要素を表示する事は可能でしょうか? 

邦楽各曲の月間売り上げをまとめた表があり、この中で曲の要素が100個あったとします。

要素の中に何枚売れたかを示すデータがあって、これごとにソートをしてランキング形式で全件表示する事はできると思うのですが、上位10件を表示する、というような方法が見つからず困っています。

java等を用いるのであれば簡単なのですが、極力xsltでの変換を行いたいのです。

このような方法をどなたかご存知の方がいらっしゃいましたら、私的な質問で大変恐れ入りますがご教授頂ければと思っております。
宜しくお願い致します。

A 回答 (1件)

================Q4352267A.xml===============


<?xml version="1.0" encoding="UTF-8"?>
<books>
<book>
<title>絶対儲かる ルピーの稼ぎ方</title>
<price>200</price>
</book>
<book>
<title>フックショットの使い方 入門編</title>
<price>50</price>
</book>
<book>
<title>ハイラル城 鳥瞰図</title>
<price>500</price>
</book>
<book>
<title>早く走れる靴ランキング </title>
<price>100</price>
</book>
<book>
<title>世界の泉探索 -秋は夕暮れ-</title>
<price>220</price>
</book>
<book>
<title>ハートを求めて</title>
<price>2000</price>
</book>
<book>
<title>妖精の生態</title>
<price>500</price>
</book>
<book>
<title>世界の物語 53 闇の世界へようこそ!</title>
<price>1500</price>
</book>
<book>
<title>オカリナさんは俺の嫁!</title>
<price>800</price>
</book>
<book>
<title>ペンダントに使う宝石</title>
<price>450</price>
</book>
</books>
================Q4352267B.xsl===============
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/books">
<books>
<xsl:for-each select="book">
<xsl:sort select="price" data-type="number"
/>
<xsl:if test="position() &lt;= 5 ">
<book>
<xsl:value-of select="position()" />:<xsl:value-of select="title" />:<xsl:value-of select="price" />
</book>
</xsl:if>
</xsl:for-each>

</books>
</xsl:template>

</xsl:stylesheet>
===============Q4352267C.xml(結果。10件中5件を抽出。本の題名に突っ込んではならない.
)============
<?xml version="1.0" encoding="utf-8"?>
<books>
<book>1:フックショットの使い方 入門編:50</book>
<book>2:早く走れる靴ランキング :100</book>
<book>3:絶対儲かる ルピーの稼ぎ方:200</book>
<book>4:世界の泉探索 -秋は夕暮れ-:220</book>
<book>5:ペンダントに使う宝石:450</book>
</books>
==============================
おまけ:猛烈な勘違いをしたようで,ソートルーチンを自作していた。

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/books">
<hoge>
<xsl:call-template name="minimum">
<xsl:with-param name="rank" select="1" />
<xsl:with-param name="all" select="book" />
<xsl:with-param name="min" select="book[1]" />
<xsl:with-param name="nodes" select="book[position() > 1]" />
</xsl:call-template>
</hoge>
</xsl:template>

<xsl:template name="minimum">
<xsl:param name="rank" />
<xsl:param name="all"/>
<xsl:param name="min" />
<xsl:param name="nodes" />
<xsl:if test="$rank &lt; 6">
<xsl:choose>
<xsl:when test="count($nodes) = 0">
<p><xsl:value-of select="$min/price" /></p>
<xsl:call-template name="minimum">
<xsl:with-param name="rank" select="$rank + 1" />
<xsl:with-param name="all" select="$all[ . != $min]" />
<xsl:with-param name="min" select="$all[ . != $min][position() = 1]" />
<xsl:with-param name="nodes" select="$all[ . != $min][position() &gt; 1]" />
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:choose>
<xsl:when test="$nodes[1]/price &lt; $min/price ">
<xsl:call-template name="minimum">
<xsl:with-param name="rank" select="$rank" />
<xsl:with-param name="all" select="$all" />
<xsl:with-param name="min" select="$nodes[1]" />
<xsl:with-param name="nodes" select="$nodes[position() &gt; 1]" />
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:call-template name="minimum">
<xsl:with-param name="rank" select="$rank" />
<xsl:with-param name="all" select="$all" />
<xsl:with-param name="min" select="$min" />
<xsl:with-param name="nodes" select="$nodes[position() &gt; 1]" />
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:otherwise>
</xsl:choose>
</xsl:if>
</xsl:template>



</xsl:stylesheet>

この回答への補足

出来ました! サンプルまで着けて頂いて感謝です。

ゼルダが好きなんですね。

補足日時:2008/10/01 23:13
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!