リストアイテム内の表示方法について

「まったく何も分からない・・・」そんなユーザーさんの為のフォーラムです。どんなご質問でもお気軽にどうぞ。
返信
mino
アクティブユーザー
記事: 18
登録日時: 2006年12月22日(金) 19:44

リストアイテム内の表示方法について

投稿記事 by mino » 2007年5月24日(木) 13:56

いつも拝見しております。

下記項目を同一ページに内表示させようとしています。
現在、[1]のようになっておりますが、どうしても[2]のようにできません。
良い方法がありましたら教えて下さい。
よろしくお願いします。
[1]
(エントリ)
●タイトル

(リストアイテム)
------------------------------------------
○2007-05-24[month] (A)
------------------------------------------
○2007-05-24[month] (B)
------------------------------------------
○2007-05-25[month] (C)
------------------------------------------
[2]
(エントリ)
●タイトル

(リストアイテム)
------------------------------------------
○2007-05-24[month] (A)(B)
------------------------------------------
○2007-05-25[month] (C)
------------------------------------------

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

Re: リストアイテム内の表示方法について

投稿記事 by webmaster » 2007年5月24日(木) 16:47

 minoさん、ご質問ありがとうございます。
 只今、詳細なサンプルを作っている時間がとれず、考え方のみのご紹介になり
ますがご容赦下さい。

 このような「同一項目でグルーピングする」という処理は、XSLTでは少し
苦手な部類に入ります。

 考え方としては、リスト項目のfor-eachループの中で、「一つ前の項目の
monthと同じmonthだった場合は年月を表示しない」という事をすれば良い
ことになります。

 ここで、「一つ前のmonth項目」を、xsl:variableという命令を使って変数
に保存しておくようにします。
 <xsl:variable name="month" select="mymonth" />
 とすれば、mymonth項目の内容を、"month"という名前の変数に一時的に
保存できます。

 この内容は、

コード: 全て選択

 <xsl:value-of select="$month" />
 のように変数名の前に"$"をつけて使用することができます。
 その上で、

コード: 全て選択

 <xsl:if test="mymonth!=$month">
 のようなif文を書き、「前の行のmonthと比較」を行えば、お望みのことが実現
できるかと思います。
 しかし、

コード: 全て選択

<tr><th>2007-05-24</th><td>(A)</td><td>(B)</td></tr>
<tr><th>2007-05-25</th><td>(C)</td></tr>
 のような出力は通常の方法ではできません。
 (HTMLタグを、XMLデータとしてではなく文字列として出力することで可能です)

 上記のようなものではなく、

コード: 全て選択

<div class="month">2007-05-24</div>
<div class="data">(A)</div>
<div class="data">(B)</div>
<div class="month">2007-05-25</div>
<div class="data">(C)</div>
 のような出力なら可能です。
 このような出力を行い、CSSを使ってお望みの表示を得る事は可能かと
思います。

 以上、具体的なサンプルを提示できず申し訳ありません。

mino
アクティブユーザー
記事: 18
登録日時: 2006年12月22日(金) 19:44

何度か試したのですがうまくいきません・・・

投稿記事 by mino » 2007年5月25日(金) 07:24

ご回答ありがとうございます。

下記のようにしてみたのですが、うまくいきません。
勉強不足ですみません・・・教えて下さい。

コード: 全て選択

<xsl:for-each select="entrylist/listitem">

<xsl:variable name="month" select="mymonth" />
<xsl:value-of select="$month" /> (<xsl:value-of select="user" />)

<xsl:if test="mymonth!=$month">
(<xsl:value-of select="user" />)
</xsl:if>

</xsl:for-each>

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

Re: 何度か試したのですがうまくいきません・・・

投稿記事 by webmaster » 2007年5月26日(土) 23:18

 minoさん、お手数をおかけして申し訳ありません。
 あの説明だけではなかなか難しいと思います。

コード: 全て選択

<data name="title" type="text" caption="タイトル" />
<data name="addrlist" type="menu" caption="住所一覧">
  <listitem>
    <data name="pref" type="text" caption="県" />
    <data name="desc" type="textarea" caption="説明" />
  </listitem>
</data>
 というリスト項目がスキーマにあるとして、

コード: 全て選択

titie: ’タイトル’
addrlist: [
  {pref : '東京都', desc : '説明1' },
  {pref : '東京都', desc : '説明2' },
  {pref : '東京都', desc : '説明3' },
  {pref : '神奈川県', desc : '説明4' },
  {pref : '神奈川県', desc : '説明5' }
]
 というデータの場合に、

エントリ一件分のデザインでは、

コード: 全て選択

<h1>タイトル</h1>
<div class="pref">東京都</div>
<div class="desc">説明1</div>
<div class="desc">説明2</div>
<div class="desc">説明3</div>
<div class="pref">神奈川県</div>
<div class="desc">説明4</div>
<div class="desc">説明5</div>
 :
という感じの出力を得たいとします。

デザイン定義では、

コード: 全て選択

<h1><xsl:value-of select="title" /></h1>
<xsl:for-each select="addrlist/listitem">
  <!-- 現在のprefの値 -->
  <xsl:variable name="pref" select="pref/text()" />
  <!-- 現在のリスト項目内での位置 -->
  <xsl:variable name="position" select="position()" />
  <!-- 一つ前のリスト項目のprefの値 -->
  <xsl:variable name="prepref" select="entry/addrlist/listitem[position() = $position - 1]/pref/text()" />

  <!-- 1つ前のprefと同じか、又はリスト項目内の先頭の場合にprefを出力 -->
  <xsl:if test="$position=1 or $pref!=$prepref">
    <div class="pref"><xsl:value-of select="pref" /></div>
  </xsl:if>
  <div class="desc"><xsl:value-of select="desc" /></div>

</xsl:for-each>
 こんな感じになると思います。
 動作させていないので、記述ミスなどあるかもしれませんが、ご了承下さい。

 内容はかなり高度というか、無理やり実現しているので分かり難いものになって
いるかと思います。

 ご質問にはお答えしたいと思っておりますが、このサンプルを見て「何を質問
していいかすら分からない」というような場合には、大変申し訳ありませんが
実現困難とご判断頂ければ幸いです。m(__;)m

mino
アクティブユーザー
記事: 18
登録日時: 2006年12月22日(金) 19:44

ありがとうございます

投稿記事 by mino » 2007年5月28日(月) 07:58

すみません。

いつもお手数おかけします。

上記にて試してみます。

返信