tdのrowspan=""を入力の有無で、追加/数変更する方法は?

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

tdのrowspan=""を入力の有無で、追加/数変更する方法は?

投稿記事 by okakensanta » 2007年5月26日(土) 16:33

いつもお世話になっております。
CMSDのおかげで、多くのお客様に満足頂いております。

この度、新たな案件にてやり方がわからない箇所が出てきました。
それは、tableによる表を作る場合です。

例えば下記のように、スキーマ定義をし・・・
<data name="chart" type="list" caption="表一覧入力">
<listitem caption="表入力">
<data name="kind" type="text" caption="種別入力" />
<data name="maker" type="text" caption="メーカー名入力" />
<data name="style" type="text" caption="型名入力" />
<data name="ability" type="text" caption="加工能力" />
</listitem>
</data>

これをテーブルを使って表現するときに下記のようになります。(デザイン定義)

<table>
<tr>
<th>種別</th>
<th>メーカー名</th>
<th>型名</th>
<th>加工能力</th>
</tr>
<xsl:for-each select="chart/listitem">
<tr>
<td><xsl:value-of select="kind" /></td>
<td><xsl:value-of select="maker" /></td>
<td><xsl:value-of select="style" /></td>
<td><xsl:value-of select="ability" /></td>
</tr>
</xsl:for-each>
</table>

ただ、kindの部分の<td></td>を縦につなげたい場合にはどうしたらいいのか。
要は、
<td rowspan="?"><xsl:value-of select="kind" /></td>にしたいのです。

もし、入力部kindに同じものが入力された場合に、
<td rowspan="2"><xsl:value-of select="kind" /></td>
としたり、
<td rowspan="3"><xsl:value-of select="kind" /></td>として、
出力したいということです。

わかりずらい質問ですみません。
ご返答頂けると幸いです。

よろしくお願い致します。

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

Re: tdのrowspan=""を入力の有無で、追加/数変更する方法は?

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

 okakensantaさん、いつもお世話になっております。
 上下の同一セルの結合、ということだと理解いたしました。
 そのご要望は、CMSDに限らず、プログラム上で実現するには多少面倒な部類の
処理になります。

 CMSD(XSLT)で実現する場合には、次のような感じになるかと思います。

コード: 全て選択

<xsl:for-each select="chart/listitem">
  <xsl:sort select="kind" /><!-- kindでソート -->
  <tr>
  <!-- 現在のkindの値 -->
  <xsl:variable name="kind" select="kind/text()" />
  <!-- 現在のリスト項目内での位置 -->
  <xsl:variable name="position" select="position()" />
  <!-- 一つ前のリスト項目のkindの値 -->
  <xsl:variable name="prekind" select="/entry/chart/listitem[position() = $position - 1]/kind/text()" />

  <!-- 1つ前のkindと同じか、又はリスト項目内の先頭か? -->
  <xsl:if test="$position=1 or $kind!=$prekind">
  	<!-- 同じkindがリスト項目内に何件あるか? -->
    <xsl:variable name="kindcount" select="count(/entry/chart/listitem[kind=$kind])" />
    <td rowspan="{$kindcount}"><xsl:value-of select="kind" /></td>
  </xsl:if>

  <td><xsl:value-of select="maker" /></td>
  <td><xsl:value-of select="style" /></td>
  <td><xsl:value-of select="ability" /></td>
  </tr> 

</xsl:for-each>
 実際に動作を確認していない為、入力間違いなどあるかもしれません。
 その場合にはご容赦下さい。

 また、このサンプルはかなり複雑な事をしています。
 個々のご質問にはお答えしたいと思っておりますが、全体の詳細な解説には
スペース等が足り無すぎる為、ご容赦下さい。m(__)m

 公式サイトの「取扱業者様一覧」にて、近い処理を行っておりますので、
よろしければ出力の参考にして下さい。
 http://cms.al-design.jp/partners.php
最後に編集したユーザー webmaster on 2007年6月02日(土) 19:27 [ 編集 1 回目 ]

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

Re: tdのrowspan=""を入力の有無で、追加/数変更する方法は?

投稿記事 by nagashima » 2007年6月02日(土) 18:48

お世話になります。nagashimaと申します。

CMSD初心者でまだまだ分からない事だらけですがよろしくお願いします。

okakensantaさんと同様のことがやりたくてこのトピックを参考にさせて頂きました。

ですが下記の部分がうまく処理できていないみたいです。

<!-- 同じkindがリスト項目内に何件あるか? -->
<xsl:variable name="kindcount" select="count(entry/chart/listitem[kind=$kind])" />

count()関数で入力されたデータを比較して、同一のデータ数をGETするにはどのようにすればよろしいのでしょうか?

すいませんが、よろしくお願いいたします。

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

Re: tdのrowspan=""を入力の有無で、追加/数変更する方法は?

投稿記事 by webmaster » 2007年6月02日(土) 19:26

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

 うまく処理できていないというのは、具体的に何かエラーなどが出るような感じ
でしょうか。

 ちょっとサンプルを見直したのですが、下記の点で間違いがありました。

コード: 全て選択

<xsl:variable name="prekind" select="/entry/chart/listitem[position() = $position - 1]/kind/text()" />

コード: 全て選択

<xsl:variable name="kindcount" select="count(/entry/chart/listitem[kind=$kind])" />
 どちらも、"entry"のところを"/entry"に修正する必要があるかと思います。
 「うまく処理できていない」のはこのせいかもしれませんので、一度お試し
頂ければと思います。

 サンプルの記述ミスでご迷惑をおかけして申し訳ありませんでした。

※前回のサンプル内容はこちらで修正しておきました。

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

Re: tdのrowspan=""を入力の有無で、追加/数変更する方法は?

投稿記事 by nagashima » 2007年6月04日(月) 15:50

webmasterさん、返信ありがとうございます。

うまく処理できていないというのは、

スキーマ定義のkind部分の入力に同じ文言を入力し、
表示させてもrowspan="0"となってしまいます。

同じ入力内容のkindがあるが、
変数kindcountに0が入っています。

なので下記の部分で、kindcountの値が正しく
取得できていないのではないのかな?と思いました。

----------------------------------------------------------------------------------
<!-- 同じkindがリスト項目内に何件あるか? -->
<xsl:variable name="kindcount" select="count(entry/chart/listitem[kind=$kind])" />
----------------------------------------------------------------------------------

"entry"のところを"/entry"と修正してもkindcountに0が入ってます。

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

Re: tdのrowspan=""を入力の有無で、追加/数変更する方法は?

投稿記事 by webmaster » 2007年6月04日(月) 16:21

 nagashimaさん、詳細情報ありがとうございます。

 再度ソースを見直してみましたが、おかしいところが見当たらなかった為、
よろしければnagashimaさんのソースを拝見させて頂いてもよろしいでしょうか。

 スキーマ定義とデザイン定義ファイルの内容をここへ引用して頂くか、
もしくは cms(アットマーク)al-design.jpまで添付してお送り頂ければ、
内容を直接チェックさせて頂きます。

 大変お手数ですが、もし可能ならばお願い致します。m(__)m

 ちなみに、$kindcount以外、つまり$kindや$prekindなどの取得はうまく
いっていて、rowspanの出力内容だけが0でおかしい、というような状況
でしょうか。

 それとも、他もおかしいが、とりあえずrowspanだけは確実におかしい、
というような感じでしょうか。

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

Re: tdのrowspan=""を入力の有無で、追加/数変更する方法は?

投稿記事 by nagashima » 2007年6月04日(月) 17:55

webmasterさん、スキーマ定義とデザイン定義ファイルの内容は下記となります。

デバッグの仕方がよくわからず、他の変数になにが格納されているか
わかりませんでしたが、入力データを変えて表示内容をいろいろ試したところ
kindcount以外の変数は問題ないかと思います。

スキーマ定義
--------------------------------------------------------------------------------------
<?xml version="1.0" encoding="UTF-8"?>
<schema name="equipment" caption="設備案内" title="listitem">
<data name="equipmentlist" type="list" caption="設備案内表">
<listitem caption="設備詳細" title="kind,maker">
<data name="kind" type="text" caption="種別" />
<data name="maker" type="text" caption="メーカー名" />
<data name="model" type="text" caption="型名" />
<data name="machinephoto" type="img" caption="設備写真" />
<data name="ability" type="text" caption="加工能力" />
</listitem>
</data>
</schema>
--------------------------------------------------------------------------------------

デザイン定義
--------------------------------------------------------------------------------------
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="html" encoding="EUC-JP" omit-xml-declaration="yes" />
<xsl:template match="/entry">


<xsl:for-each select="equipmentlist/listitem">
<xsl:sort select="kind" /><!-- kindでソート -->
<tr>
<!-- 現在のkindの値 -->
<xsl:variable name="kind" select="kind/text()" />
<!-- 現在のリスト項目内での位置 -->
<xsl:variable name="position" select="position()" />
<!-- 一つ前のリスト項目のkindの値 -->
<xsl:variable name="prekind" select="/entry/equipmentlist/listitem[position() = $position - 1]/kind/text()" />

<!-- 1つ前のkindと同じか、又はリスト項目内の先頭か? -->
<xsl:if test="$position=1 or $kind!=$prekind">
<!-- 同じkindがリスト項目内に何件あるか? -->
<xsl:variable name="kindcount" select="count(/entry/chart/listitem[kind=$kind])" />
<td rowspan="{$kindcount}" valign="top" bgcolor="#EBEBEB" class="style7"><xsl:value-of select="kind" /></td>
</xsl:if>
<td bgcolor="#EBEBEB" class="style7"><xsl:value-of select="maker" /></td>
<td bgcolor="#EBEBEB" class="style7"><xsl:value-of select="model" /></td>
<td bgcolor="#EBEBEB" class="style7"><xsl:value-of select="ability" /></td>
</tr>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
--------------------------------------------------------------------------------------

よろしくお願い致します。

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

Re: tdのrowspan=""を入力の有無で、追加/数変更する方法は?

投稿記事 by webmaster » 2007年6月05日(火) 00:24

 nagashimaさん、スキーマとデザインの引用、ありがとうございました。

 早速拝見させて頂いたところ、おそらく、デザイン定義の

<xsl:variable name="kindcount" select="count(/entry/chart/listitem[kind=$kind])" />

 の箇所を、

<xsl:variable name="kindcount" select="count(/entry/equipmentlist/listitem[kind=$kind])" />

 とすることでうまくいくかもしれません。
 「chart」は例として出した時のものなので、今回の場合はリスト項目のname
であるequipmentlistがここに入ることになります。

 ところで、話は変わるのですが、schemaのtitle属性に"listitem"とありますが、
おそらく内部でエラーが発生していると思うのですが、いかがでしょうか・・・
問題なく動いているでしょうか?

 title属性にはスキーマのトップ階層の項目名のみ指定可能ですが、この場合は
リスト項目equipmentlistしか存在しない為、特にtitle属性を指定する必要は
ございません。但し、リスト項目がタイトルに使われる場合、おそらく表示は
空白になるのではないかと思います。

 以上、また経過をご連絡頂ければ幸いです。

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

Re: tdのrowspan=""を入力の有無で、追加/数変更する方法は?

投稿記事 by nagashima » 2007年6月05日(火) 10:29

webmasterさん、ありがとうございます。

「chart」の部分を「equipmentlist」に修正したらうまくいきました。

お手数おかけしてすいません。
ただの記述ミスでした。
ありがとうございました。

shemaのtitle属性に関してですが、
現在は管理画面のエントリ見出しの欄には空白で表示されています。

ただtitle属性を指定しないと、入力データがずらっと表示されてしまい
見づらくなってしまいます。

なので空白のほうがいいと思いtitleを指定して空白にさせています。

titleを指定することによって表示が空白になる以外の問題も
発生するのでしょうか?

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

Re: tdのrowspan=""を入力の有無で、追加/数変更する方法は?

投稿記事 by webmaster » 2007年6月05日(火) 11:26

 nagashimaさん、ご報告ありがとうございます。

 title属性についてですが、了解致しました。
 title属性にリスト項目を指定すると、内容がズラリと出るのですね・・・私の
勘違いでした。m(__)m

 これが見づらい為、存在しない項目名を指定されているとのことですが、
恐らく内部的にPHPのエラーが発生していると思われます。
 PHPエラーの表示を抑制する設定になっている為、エラーが表示されない
だけだと思うので、可能ならばダミーのtext項目などを作ってそれをtitle指定
するなどして頂いた方が安定するかと思います。
 ダミーのtext項目には「管理画面用見出し」などとしておいて、サイト上
には表示されない事を説明するなど、ちょっと面倒かもしれませんが・・・。

 以上、何らかの参考になりましたら幸いです。

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

Re: tdのrowspan=""を入力の有無で、追加/数変更する方法は?

投稿記事 by nagashima » 2007年6月05日(火) 16:06

webmasterさん

titleの部分についてですが、ダミーでtext項目を作りました。
見た目もよくなりこっちのほうが良いですね!

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


デザイン定義の部分ですが、データを多数いれたら表示が崩れてしまいました。

-------------------------------------------------------------------------------
<!-- 一つ前のリスト項目のkindの値 -->
<xsl:variable name="prekind" select="/entry/equipmentlist/listitem[position() = $position - 1]/kind/text()" />
-------------------------------------------------------------------------------

上記の部分が問題だと思われます。

<!-- 現在のリスト項目内での位置 -->
<xsl:variable name="position" select="position()" />
のpositionはkindでソートした後のリスト位置を取得してくれますが、

上記記述部の
listitem[position() = $position - 1]

では管理画面のエントリの並び順で該当するlistitemを示してしまいます。
kindでソートした後のlistitemを取得してくれません。


管理画面でエントリの並び順を変えれば正常に表示させることも可能ですが、
プログラムのほうで整合性を取れるようにすることは可能でしょうか?

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

Re: tdのrowspan=""を入力の有無で、追加/数変更する方法は?

投稿記事 by webmaster » 2007年6月05日(火) 18:36

 nagashimaさん、何度もお手間をかけさせてしまい、申し訳ありません。
 xsl:sortの件、仰る通りでした。m(__)m
 
 弊社のテストパターンでは、リスト項目ではなくエントリ一覧に対して同様の
事を行っていたのですが、もともと管理画面上で事前ソートされており、xsl:sortは
使っていなかった為、気づきませんでした。m(__)m

 これを回避する為には、kindの値のみを抽出してソートした「データの塊(変数)」を
別に用意してやる必要がありそうです。

 具体的には、for-eachが始まる前(for-eachの外)で、次のように「sortedkindlist」
変数を定義して下さい。

コード: 全て選択

<!-- equipmentlistのkindのみをソートしたデータ -->
<xsl:variable name="sortedkindlist">
  <xsl:for-each select="equipmentlist/listitem">
    <xsl:sort select="kind" />
    <kind><xsl:value-of select="kind" /></kind>
  </xsl:for-each>
</xsl:variable>
 これで、「sortedkindlist」という変数の中に、

コード: 全て選択

<$sortedkindlist>
  <kind>種別1</kind>
  <kind>種別1</kind>
  <kind>種別1</kind>
  <kind>種別2</kind>
  <kind>種別3</kind>
  <kind>種別3</kind>
</$sortedkindlist>
 というようなデータが格納されます。

 そして、

コード: 全て選択

<!-- 一つ前のリスト項目のkindの値 -->
<xsl:variable name="prekind" select="/entry/equipmentlist/listitem[position() = $position - 1]/kind/text()" />
 の部分を、

コード: 全て選択

<!-- 一つ前のリスト項目のkindの値 -->
<xsl:variable name="prekind" select="$sortedkindlist/kind[position() = $position - 1]/text()" />
 と変更して下さい。

 かなりマニアックなコードになってしまいましたが、弊社で同様のパターンを作って確認した所うまく動作しました。
 一度お試し頂ければ幸いです。

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

Re: tdのrowspan=""を入力の有無で、追加/数変更する方法は?

投稿記事 by nagashima » 2007年6月06日(水) 19:00

webmasterさん、ありがとうございます。

うまく動作しました!!

ちょっと気になったんですけど、リスト項目の表示はエントリ一覧の表示のように
データ数が増えるとページ数が複数になったりするのでしょうか?

今回ページ数を複数にしたいということはないのですが、
ページ数が複数になるとまた表示に影響がでたりするかな?と気になったので。

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

Re: tdのrowspan=""を入力の有無で、追加/数変更する方法は?

投稿記事 by webmaster » 2007年6月06日(水) 21:20

 うまく動いたとのことで胸をなでおろしております。
 ご報告ありがとうございました。m(__)m

 リスト項目は、データ数が増えても特に処理をしておりませんので、ページ切替
などのご心配は不要です。
 逆に、ページ切替をする為の機能は用意されていないので、それをやろうとすると
かなり難しそうです。

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

Re: tdのrowspan=""を入力の有無で、追加/数変更する方法は?

投稿記事 by nagashima » 2007年6月06日(水) 21:30

webmasterさん

やっぱりページ切替しないですよね。

確認できてよかったです。

今回何度もお手数おかけして申し訳ございませんでした。
とても助かりました。
また、参考にもなりました。

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

また分からない点があったら質問するかと思いますが、
返信いただければ幸いです。

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

返信