変数でのソート ランキング表

「まったく何も分からない・・・」そんなユーザーさんの為のフォーラムです。どんなご質問でもお気軽にどうぞ。
返信
ohkai
記事: 4
登録日時: 2010年2月09日(火) 06:28

変数でのソート ランキング表

投稿記事 by ohkai » 2010年2月09日(火) 07:25

お世話になります。

はじめて質問させていただきます。

たくさんのお店の情報をまとめたサイトで、エントリ一覧で商品単価の安い順にソートしてランキング表を作りたいと思っています。
単純に金額でソートするのは簡単ですが、10個500円で販売しているお店もあれば、1個80円で販売しているお店もあるので、価格÷数量 で「単価」を出し、その単価によるソートで一覧を単価の安い順に並び替えたいのですが、この計算を自動でさせると

単価<xsl:value-of select="price div amount" />円

10個980円と入力すると単価9.80000000001円となってしまうので、変数にしてみたのですが

<xsl:variable name="unit_price" select="floor(price div amount)" />
単価<xsl:value-of select="$unit_price" />円


今度は単価9円になってしまいます。

理想は小数点第1位までを表示し、10個980円の場合は単価9.8円となり、仮に10個985円の場合も表示は単価9.8円となるが、ソートでは2番目に来るようにしたいと思っています。

例:
田中商店 単価9.8円  注文数10個 価格980円
佐藤商店 単価9.8円  注文数10個 価格985円
鈴木商店 単価10.5円 注文数20個 価格2100円


ただ、表示が解決したとして、スキーマにはない変数でのソートは可能なのでしょうか?
やはり単価も手入力しなければならないのでしょうか?

ohkai
記事: 4
登録日時: 2010年2月09日(火) 06:28

自己解決しました

投稿記事 by ohkai » 2010年2月10日(水) 11:31

<xsl:template match="/entrylist">
<xsl:for-each select="entry">
<xsl:sort select="price div amount" data-type="number" />

ろくに調べもせずお騒がせしました。
ソートに関しては単純に
<xsl:sort select="価格 div 数量" data-type="number" />
の1行を追加するだけでした。

また変数の表示が整数のみの表示になる件については、ソーと自体は

斉藤商店 単価9円  注文数10個 価格950円
田中商店 単価9円  注文数10個 価格980円
佐藤商店 単価9円  注文数10個 価格985円
鈴木商店 単価10円 注文数20個 価格2100円

と表示されるため、かえってスッキリしていいか!!と、言うことで「ヨシ」としてしまったので解決はしていません。

ohkai
記事: 4
登録日時: 2010年2月09日(火) 06:28

投稿記事 by ohkai » 2010年2月11日(木) 20:54

先日書いた”変数の表示”についても自己解決いたしました。
floor が端数切捨て
ceiling が繰り上げってことなのですね。




え〜、上の続きなんですが、もう一度整理して書きます。

エントリー一覧をxsl:sortを使った変数でソートしました。
例えば、りんごが3個で300円のお店と5個で400円のお店があったら
個数と価格を入力することで単価を自動計算し、割り出した単価を元に
単価の安い順にソートするようにしました。

田中商店 単価:80円 数量5個 価格400円
斉藤商店 単価:100円 数量3個 価格300円
鈴木商店 単価:150円 数量2個 価格300円

以下はそのスキーマとデザイン定義、埋め込みタグの例です。

スキーマ:shop
<data name="title" type="text" caption="店名" output="text2" />
<data name="apple" type="menu" caption="りんご" group="True">
 <menuitem id="n">無し</menuitem>
 <menuitem id="y">有り</menuitem>
</data>
<data name="a" type="int" caption="数量" output="text2" />
<data name="b" type="int" caption="価格" output="text2" />
<data name="comment" type="textarea" caption="備考" output="text2" />

<data name="orange" type="menu" caption="オレンジ" group="True">
 <menuitem id="n">無し</menuitem>
 <menuitem id="y">有り</menuitem>
</data>
<data name="a" type="int" caption="数量" output="text2" />
<data name="b" type="int" caption="価格" output="text2" />
<data name="comment" type="textarea" caption="備考" output="text2" />




デザイン定義:applelist
<xsl:template match="/entrylist">
<xsl:for-each select="entry">
<xsl:sort select="b div a" data-type="number" />
<tr>
  <td><xsl:value-of select="title" /></td>
<td>単価:
<xsl:variable name="x" select="ceiling(b div a)" />
<xsl:value-of select="$x" />円</td>
<td>数量:<xsl:value-of select="b" />個</td>
<td>価格:<xsl:value-of select="a" />円</td>
<td><xsl:value-of select="comment" /></td>
</tr>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>


埋め込み:りんご取扱店一覧
<table>
<tr>
<td>販売店</td>
<td>単価</td>
<td>販売個数</td>
<td>価格</td>
<td>備考</td>
</tr>
<cmsd:entrylist name="shoplist" design="fruit" rows="9999999" >
<cmsd:group key="apple" value="y" />
</cmsd:entrylist>
</table>


これでりんごの単価が安い順にソートされた一覧になります。



ココからが質問です。

次に”最安値一覧”を作りたいと思うのですがうまくいきません。

埋め込み:果物の最安値一覧
<table>
<tr>
<td>りんごの最安値</td>
<cmsd:entrylist name="shoplist" design="applelist" rows="1">
<cmsd:group key="apple" value="y" /></cmsd:entrylist>
</tr>
<tr>
<td>オレンジの最安値</td>
<cmsd:entrylist name="shoplist" design="orange" rows="1">
<cmsd:group key="orange" value="y" /></cmsd:entrylist>
</tr>
</table>


りんごの最安値  田中商店 単価:80円 数量5個 価格400円
オレンジの最安値 斉藤商店 単価:100円 数量3個 価格300円
柿の最安値    鈴木商店 単価:50円 数量2個 価格100円

と、いうように各商品の一番単価の安い金額だけを一覧にして表示したいのですか、
やり方が良くわかりません。

ちなみにrows="1"だとeid順になります。
rows="3"にすると出力されたeidの新しい3件の中でのみソートされますが、
一番安いところではありません。

どこかに書いてありましたが、任意の並び替えをするときはrows="9999999"としなければ
ならないとありました。
おそらくrows=で出力されたデータの中だけでソートされるのだと思いますが、
なにか良い方法は無いものでしょうか?

返信