カテゴリの○○件目以降を一覧表示

「まったく何も分からない・・・」そんなユーザーさんの為のフォーラムです。どんなご質問でもお気軽にどうぞ。
返信
nagashima
パワーユーザー
記事: 44
登録日時: 2007年5月26日(土) 15:52
お住まい: 東京

カテゴリの○○件目以降を一覧表示

投稿記事 by nagashima » 2007年8月08日(水) 17:33

お世話になります。

一覧表示時にカテゴリごとのポジションを取得、判断しての
表示ができるか質問です。

1つのエントリの中でカテゴリごとの11件目以降を
一覧表示させたい場合にはどのようにすればいいのでしょうか?


<data name="kind" type="menu" group="True" caption="種類">
<menuitem id="00">種類を選択してください</menuitem>
<menuitem id="01">A</menuitem>
<menuitem id="02">B</menuitem>
<menuitem id="03">C</menuitem>
<menuitem id="04">D</menuitem>
<menuitem id="05">E</menuitem>
</data>

とスキーマ定義し、
エントリデータに種類を持たせておき
一覧表示させるときに絞り込み機能を使用せずに
各種類の11件目から表示させたいです。

表示結果のイメージとしては

Aのデータ(Aの11件目データ)
Cのデータ(Cの11件目データ)
Cのデータ(Cの12件目データ)
Bのデータ(Bの11件目データ)
Dのデータ(Dの11件目データ)
Eのデータ(Eの11件目データ)
Dのデータ(Dの12件目データ)
Aのデータ(Aの12件目データ)
Aのデータ(Aの13件目データ)




このように表示させることは可能でしょうか?

複雑になるとは思いますが、よろしくお願い致します。

webmaster
Site Admin
記事: 1451
登録日時: 2004年12月10日(金) 10:09

Re: カテゴリの○○件目以降を一覧表示

投稿記事 by webmaster » 2007年8月09日(木) 17:54

 nagashimaさん、ご質問ありがとうございます。

 ご質問の件についてですが、通常の方法では、ご要望を実現することができません。
 カテゴリ単位での出力であれば、「11件目以降のみ出力」ということは可能
なのですが・・・。

コード: 全て選択

<xsl:for-each select="entry[position()&gt10]" >
 <!-- 出力内容を記述 -->
</xsl:for-each>
 書くことで、11件目以降のみが出力されるようになります。

 XSLTを駆使してご要望を実現する方法もあるのですが、あまりにも複雑な方法
の為、お勧めすることができません。また、サンプルを作って確認している時間が
取れず、サンプルの提示が難しい状況です。

 概念のみ説明すると、

・xsl:variable name="kind01" select="entry[kind='01'][position()<=10" />
 という記述を使って、kind01〜05のエントリの先頭10件分を変数に保存する。

・entryループ内では、xsl:ifを使って、$kindXXの中に現在のエントリが含まれて
 いるかをチェックする。含まれていれば、出力しないようにする。

 というものです。
 あまり効率の良い方法でもありませんし、よほどXSLTに慣れていないと難しいと
思います。m(__;)m

nagashima
パワーユーザー
記事: 44
登録日時: 2007年5月26日(土) 15:52
お住まい: 東京

Re: カテゴリの○○件目以降を一覧表示

投稿記事 by nagashima » 2007年8月09日(木) 20:21

webmasterさん

ご返信ありがとうございます。

やはり複雑になってしまいますか。

概念のご説明ありがとうございました。

他の対処法も考えてみますが、
これをもとに頑張ってチャレンジしてみます。

ありがとうございました。

nagashima
パワーユーザー
記事: 44
登録日時: 2007年5月26日(土) 15:52
お住まい: 東京

Re: カテゴリの○○件目以降を一覧表示

投稿記事 by nagashima » 2007年8月17日(金) 13:38

webmasterさん

お世話になります。

現在いろいろと試しており下記の部分でつまずいているのですが、
現在のエントリが含まれているかのチェックをidで行いたいのですが
どのように記述すればいいのでしょうか?

>・entryループ内では、xsl:ifを使って、$kindXXの中に現在のエントリが含まれて
> いるかをチェックする。含まれていれば、出力しないようにする。

<xsl:variable name="kind01" select="entry[kind='01'][position()<=10"] />

のようにまずは10件分のentryを取得しています。

$kind01のなかに現在のentryがあるかチェック。
※idが一意なのでidで比較したいのですがなかなかうまいこといきません。

現在のentryのid取得
<xsl:variable name="kindid" select="@id" />

現在のentryがあるかチェック
<xsl:variable name="kindcount" select="count(/$kind01[@id=$kindid])" />

よくわかっていないので、
上記のような感じでいろいろ試してみましたが、うまくいきません。

ここがクリアすればやりたいことができるかと思うのですが・・・

お手数おかけしますがよろしくお願い致します。

webmaster
Site Admin
記事: 1451
登録日時: 2004年12月10日(金) 10:09

Re: カテゴリの○○件目以降を一覧表示

投稿記事 by webmaster » 2007年8月17日(金) 19:06

nagashimaさん、いろいろとお手数をおかけしているようで申し訳ありません。

ご質問の件なのですが、具体的な方法となるとこちらでも一度試してみる必要があり、
現在その時間を確保できません。m(__)m

<xsl:variable name="eid" select="@eid" />
<xsl:if test="$kind01/entry[@eid=$eid]" >

<xsl:if>

 といった感じでできないかと思っていますが、細かいところが間違っていたり、
そもそも方法論が間違っている可能性があるかと思います。

 完全な解決策を提示できず、申し訳ありません。

nagashima
パワーユーザー
記事: 44
登録日時: 2007年5月26日(土) 15:52
お住まい: 東京

Re: カテゴリの○○件目以降を一覧表示

投稿記事 by nagashima » 2007年8月17日(金) 20:47

webmasterさん

ご返信ありがとうございます。

お勧めしていない方法なのにあれこれやってすいません。

> <xsl:variable name="eid" select="@eid" />
> <xsl:if test="$kind01/entry[@eid=$eid]" >
> 〜
> <xsl:if>

if文のところがうまくとおりませんでした。

<xsl:if test="$kind01/entry[@id=$eid]" >

でやってもとおりませんでした。

<xsl:value-of select="$eid" />

<xsl:for-each select="$kind01">
<xsl:value-of select="title" disable-output-escaping="yes" /><xsl:value-of select="@id" />
</xsl:for-each>

と@id、$eidの中身を表示させ確認しましたが同一idが存在していました。

なのにif文がとおりません :cry:


<xsl:variable name="kindcount" select="count($kind01/entry[@id=$eid])" />
<xsl:if test="$kindcount = 0">

</xsl:if>

という方法も試したのですが、「=」になるidが存在するはずなのに
count()の結果で $kindcout に「0」が返されてしまいます。

なにか他のところに問題があるのでしょうか?

webmaster
Site Admin
記事: 1451
登録日時: 2004年12月10日(金) 10:09

Re: カテゴリの○○件目以降を一覧表示

投稿記事 by webmaster » 2007年8月17日(金) 21:20

 nagashimaさん、お返事ありがとうございます。

 既にお気づきかと思いますが、

<xsl:variable name="eid" select="@id" />
<xsl:if test="$kind01/entry[@id=$eid]" >

<xsl:if>

 が正しいコードでした。混乱させてしまってすいません。
 おそらく、このコードでもNGだったということだと思います。

 一度、下記コードを試して頂いて、$kind01に必要なデータがそもそも
入っているかを確認して頂くと、何か分かるかもしれません。

<xsl:value-of select="count($kind01/entry)" />

 こちらで試せれば手っ取り速いと思うのですが、時間が取れず申し訳
ありません。m(__)m

 XSLTでこの手の「プログラミング」的なことをやろうとするといろいろと
クセが強く、思い通りに行かない事がよくあるようです。

nagashima
パワーユーザー
記事: 44
登録日時: 2007年5月26日(土) 15:52
お住まい: 東京

Re: カテゴリの○○件目以降を一覧表示

投稿記事 by nagashima » 2007年8月17日(金) 21:26

webmasterさん

ご返信ありがとうございます。

> こちらで試せれば手っ取り速いと思うのですが、時間が取れず申し訳
> ありません。m(__)m

アドバイス頂けてもの凄い助かってます。

さっそく試してみます。

nagashima
パワーユーザー
記事: 44
登録日時: 2007年5月26日(土) 15:52
お住まい: 東京

Re: カテゴリの○○件目以降を一覧表示

投稿記事 by nagashima » 2007年8月17日(金) 22:41

webmasterさん

結果的に下記でやりたいことができるようになりそうです。

まず
<xsl:value-of select="count($kind01/entry)" />

を表示させたところ「0」が表示されました。

<xsl:value-of select="$kind01" />

を表示させるとエントリデータが表示されました。

<xsl:value-of select="count($kind01)" />

を試しに表示させるとちゃんと$kind01に入れたentryデータ数
が表示されました。

この結果から推測して、

<xsl:if test="$kind01[@id=$eid]" >

を試したところちゃんとif文の中に処理が入ってくれました。

変数にentryデータを代入すると<entry>じゃなくて<変数名>になるんですかね?
「/entry」の部分が不要みたいでした。

この方法でなんとかやりたいことが実現できそうなので
進めていきたいと思います。

本当に助かりました。

ありがとうございました。

今後ともよろしくお願い致します。

webmaster
Site Admin
記事: 1451
登録日時: 2004年12月10日(金) 10:09

Re: カテゴリの○○件目以降を一覧表示

投稿記事 by webmaster » 2007年8月17日(金) 22:54

 nagashimaさん、お返事ありがとうございます。

 なるほど、$kind01にはおそらく「entry」そのものが入っているようです。
 てっきり、$kind01がルート要素で、その下にentryが配置されるものと
思っておりました。

 この辺、いつもよくわからなくなってこんがらがってしまいます。
 混乱させてしまい、申し訳ありませんでした。

 また、問題が起きましたらご連絡いただければ幸いです。

返信