指定回数を繰り返したいのですが・・・

「まったく何も分からない・・・」そんなユーザーさんの為のフォーラムです。どんなご質問でもお気軽にどうぞ。
返信
もりや
記事: 3
登録日時: 2006年7月29日(土) 00:00

指定回数を繰り返したいのですが・・・

投稿記事 by もりや » 2006年7月29日(土) 01:32

初めまして。

とにもかくにも更新作業が楽になると、CMS Designer を導入することにしました!
CGIを組まなくても各パーツを有効活用できるので本当に助かっています!

とりあえず、少しずつ使い方がわかってきたところなのですが、
PGでよく使うfor文に相当する処理がなくて困っています。


小説Aは全15話、小説Bは全27話、小説Cは1話だけ・・・と話の数がわかっているので、

<?xml version="1.0" encoding="UTF-8"?>
<schema name="nov" caption="小説タイトルの登録" sortkey="number" sortorder="desc" >
<data name="nov_title" type="text" caption="小説タイトル" />
<data name="nov_title_sub" type="text" caption="小説タイトル(ソート用/半角英数字)" group="True" />
<data name="end_flg" type="menu" caption="完結した?" >
<menuitem id="0">完結</menuitem>
<menuitem id="1">連載中</menuitem>
<menuitem id="2">改訂中</menuitem>
<menuitem id="8">苦悩中</menuitem>
<menuitem id="9">執筆放棄</menuitem>
</data>
<data name="genkouyoushi" type="int" caption="400字詰原稿用紙換算" />
<data name="number" type="int" caption="掲載順" />
<data name="comment" type="textarea" output="html2" caption="コメント" rows="5" cols="70" />
<data name="directory" type="text" caption="ディレクトリ名" />
<data name="sub_directory" type="text" caption="サブディレクトリ名" />
<data name="stories" type="int" caption="話数(全×話)" />
</schema>

話数(stories)を設定しました。

小説のファイルは「directory/sub_directory/」に

 A-1.txt
 A-2.txt
 A-3.txt
  :
  :
 A-15.txt

とテキストで保存してあり、Aがタイトル、数字が話数です。
これらをPerlで呼び出し、縦書き(T)・横書き(Y)に振り分けています。
そのPerlを呼ぶと以下のようになります。

 縦:<A HREF="nvl.cgi?{directory}+{sub_directory}+$話数+T">[<xsl:value-of select="$話数" />]</A>
 横:<A HREF="nvl.cgi?{directory}+{sub_directory}+$話数+Y">[<xsl:value-of select="$話数" />]</A>

これを、小説Aの場合は1〜15まで表示したいので、$話数に1〜15を入れたいのです。

 <A HREF="nvl.cgi?dirA+sub_dirA+1+Y">[1]</A>
 <A HREF="nvl.cgi?dirA+sub_dirA+2+Y">[2]</A>
 <A HREF="nvl.cgi?dirA+sub_dirA+3+Y">[3]</A>
  :
  :
 <A HREF="nvl.cgi?dirA+sub_dirA+15+Y">[15]</A>

何か良い方法はありませんでしょうか???
よろしくお願いします。

もりや
記事: 3
登録日時: 2006年7月29日(土) 00:00

1件ずつ表示する前提で

投稿記事 by もりや » 2006年7月31日(月) 16:42

指定回の繰り返し(http://qa.xml.gr.jp/data/xsl/files/0042.xml)を参考にやってみたところ、とりあえず1件ずつ表示することはできるようになりました。

 <cmsd:entry name="nov1" design="default" eid="00001" />
 <cmsd:entry name="nov1" design="default" eid="00002" />
 <cmsd:entry name="nov2" design="default" eid="00001" />
   :
   :
 <cmsd:entry name="nov9" design="default" eid="00099" />

とはいえ、このように小説タイトル1件毎では、HTMLを呼び出すときに現実的とは言えません :cry: リストにうまく組み込めればいいのですが・・・。

諦めずに勉強していきますが、解決のヒントなどいただけたらとても嬉しいです。よろしくお願いします。

----- ここから -----
<?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">
<H5><xsl:value-of select="nov_title" /></H5>
<DIV><xsl:value-of select="comment" /></DIV>
<DIV>横書き:
<xsl:call-template name="loop1">
<xsl:with-param name="cnt1">1</xsl:with-param>
</xsl:call-template>
</DIV>
<DIV>縦書き:
<xsl:call-template name="loop2">
<xsl:with-param name="cnt2">1</xsl:with-param>
</xsl:call-template>
</DIV>
</xsl:template>

<xsl:template name="loop1">
<xsl:param name="cnt1" select="0" />
<xsl:if test="$cnt1 > 0">
<A HREF="nvl.cgi?{directory}+{sub_directory}+{$cnt1}+Y">[<xsl:value-of select="$cnt1" />]</A> 
<xsl:call-template name="loop1">
<xsl:with-param name="cnt1">
<xsl:if test="$cnt1 < stories/text()">
<xsl:value-of select="$cnt1 +1" />
</xsl:if>
</xsl:with-param>
</xsl:call-template>
</xsl:if>
</xsl:template>

<xsl:template name="loop2">
<xsl:param name="cnt2" select="0" />
<xsl:if test="$cnt2 > 0">
<A HREF="nvl.cgi?{directory}+{sub_directory}+{$cnt2}+T">[<xsl:value-of select="$cnt2" />]</A> 
<xsl:call-template name="loop2">
<xsl:with-param name="cnt2">
<xsl:if test="$cnt2 < stories/text()">
<xsl:value-of select="$cnt2 +1" />
</xsl:if>
</xsl:with-param>
</xsl:call-template>
</xsl:if>
</xsl:template>

</xsl:stylesheet>
----- ここまで -----

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

Re: 1件ずつ表示する前提で

投稿記事 by webmaster » 2006年8月03日(木) 16:39

 webmasterです。もりやさん、お返事遅れましてすいません。
 ご指摘のとおり、xsltにて「特定回数の繰り返し処理」は苦手とする分野です。

 教えていただいた繰り返し処理のソースを参考に、サンプルを作ってみました。

呼び出し部分

コード: 全て選択

<xsl:call-template name="loop1">
	<xsl:with-param name="cnt"><xsl:value-of select="stories" /></xsl:with-param>
</xsl:call-template>
ループ処理部分

コード: 全て選択

<xsl:template name="loop1">
	<xsl:param name="cnt" select="0" />
	<xsl:param name="index" select="1" />
 	<xsl:if test="$index <= $cnt">
 		<!-- loop出力ここから	-->
		<a HREF="nvl.cgi?{$index}+Y">[<xsl:value-of select="$index" />話]</a>
		<!-- loop出力ここまで -->
		<xsl:call-template name="loop1">
			<xsl:with-param name="cnt">
				<xsl:value-of select="$cnt" />
			</xsl:with-param>
			<xsl:with-param name="index">
				<xsl:value-of select="$index +1" />
			</xsl:with-param>
		</xsl:call-template>
	</xsl:if>
</xsl:template>
 細かい説明は省略しますが、ご不明な点がありましたらまたご質問頂ければ
幸いです。

もりや
記事: 3
登録日時: 2006年7月29日(土) 00:00

変更箇所が減りました!

投稿記事 by もりや » 2006年8月07日(月) 17:59

きれいに直してくださってありがとうございました。XMLはまだまだ勉強し始めたばかりで、自分の頭ばかりがループしてしまって困っているところでした(自爆)。この方法なら、template name の値さえ正しく変更できれば、他の変数をいじらなくてもいいので安全ですね♪早速使わせていただきました!!

まだいくつか試してみたいことがありますので、今後ともよろしくお願いします!

返信