主页spacer>Mergemill 标签指南>spacer循环标籤

spacer

内容插入

算术表达式

循环

分支

系统值

统计函数

区段

范例

spacer

<?Loop: 停止数?>
<?Exit?>
<?EndLoop?>

循环标籤用于指定模板内一个重复生成输出的部分。Mergemill 单独管理每个循环的运行,并视所有循环外的模板文本同为一个特殊的循环体。

每项作业都有一个关联的模板,模板会按需要自动多次运行,直到用尽所有主要数据馈送。模板的实际运行次数取决于循环的使用。没有循环结构的模板,所有占位栏皆于「循环外」,模板会自动重复运行,直到用尽所有占位栏的数据馈送。如果模板包含循环,只有循环内的占位栏被视为主要,循环外的占位栏被认为是辅助性质,故其数据馈送不需被用尽。

space
没有循环结构的模板

一个无循环的模板经常被用来生成提供详细资料的网页,例如一个页面包括单一物品的全部信息。Mergemill 会重复运行模板,直到用尽所有的数据馈送。在这种情况下,整个模板是一种特殊的循环体,它与一个普通的循环有两个重要的分别。首先,模板每运行一次便生成一个页面。其次,如果你已经在作业定义内选择「循环外占位栏数据环回」,任何循环外占位栏若较其他占位栏早用尽其当前数据流的数据,便会于下次模板运行前环回至其当前数据流的开端。同样,循环外占位栏若较其他占位栏早用尽其数据流,便会于下次模板运行前环回至其首个数据流的开端。如「循环外占位栏数据环回」没有被选取,用尽数据的占位栏便会插入空白值。

下面的 HTML 代码是一个例子:

<p>销售年份:<?[年份]{4}?></p>
<table width="700" border="1" cellspacing="0" cellpadding="3">
<tr>
<td width="200" bgcolor="#<?[背景颜色1]?>"><p>第一季销售额</p></td>
<td width="500" bgcolor="#<?[背景颜色1]?>"><p><?[销售额]{1}@##,###,##0?></p></td>
</tr>
<tr>
<td width="200" bgcolor="#<?[背景颜色2]?>"><p>第二季销售额</p></td>
<td width="500" bgcolor="#<?[背景颜色2]?>"><p><?[销售额]{2}@##,###,##0?></p></td>
</tr>
<tr>
<td width="200" bgcolor="#<?[背景颜色1]?>"><p>第三季销售额</p></td>
<td width="500" bgcolor="#<?[背景颜色1]?>"><p><?[销售额]{3}@##,###,##0?></p></td>
</tr>
<tr>
<td width="200" bgcolor="#<?[背景颜色2]?>"><p>第四季销售额</p></td>
<td width="500" bgcolor="#<?[背景颜色2]?>"><p><?[销售额]{4}@##,###,##0?></p></td>
</tr>
</table>

年份与销售额的数据来自一个 CSV 文档,其部分内容如下:

space"年份","季度","销售额"
space2000,1,1186100
space2000,2,945300
space2000,3,1077200
space2000,4,1683300
space2001,1,1308200
space...

「背景颜色1」和「背景颜色2」的数据来自另一个文档,其内容只有:
space"eeeeff","ffeeee"

作业运行时,每个输出网页会列出一个年份内四个季度的销售额。「年份」的列号 (4) 会导致 Mergemill 在模板运行时跳过三个值,以保持「年份」和「销售额」同步。多次出现的「背景颜色1」和「背景颜色2」使用相同的数据值,即分别是 eeeeff 和 ffeeee。

假设「循环外占位栏数据环回」选项巳被选择,当模板第二次运行时「年份」和「销售额」会继续从其数据流提取内容,但「背景颜色1」和「背景颜色2」则会从其数据流重新开始,因该数据流巳于模板第一次运行时用尽。

space
包含循环结构的模板

模板中经常使用循环来生成「索引」网页,以方便导览由不使用循环的模板所生成的详细信息网页。这些网页通常都是以相同的数据馈送产生。

作业开始时,模板会被多次运行,用尽循环内所有占位栏的首个数据流来产生第一组网页。然后以下一组数据流重复运行模板,产生下一组网页,再继续重复直到循环内所有占位栏的所有数据流皆被用尽。如果你不设定任何循环的中断条件,Mergemill 便只会于数据流完结时跳出循环,于是每一组数据流只会产生一个索引网页。

在一个内含循环结构的模板,循环内的占位栏是主导。纵使循环外的占位栏还有未用尽的数据或未被使用的数据流,当循环内占位栏的数据馈送尽用时作业便结束。由于所有占位栏皆会同步使用数据流,故当作业完成输出当前页面组后,所有占位栏的数据皆会于下一组数据流的前端开始,循环外占位栏当前还未用尽的数据流会被略过。

space
退出循环

所有循环皆会于当前数据流完结时自动退出,你亦可设定条件提早跳出循环,最简单的方法是使用循环的「停止数」属性。另一种提早跳出循环的方式不使用「停止数」属性,而是以 IF 结构来测试退出条件,同时于适当位置使用 Exit 标籤。例如:

space<?Loop?> ... <?If(Same[测试值占位栏]{2})?><?Else?><?Exit?><?EndIf?><?EndLoop?>

控制循环退出的顺序是这样的:Exit 标籤,循环「停止数」属性,及数据流终结。

space
循环的应用

假设模板有两个循环结构。循环 1 以「停止数」设定运行 20 次。循环 2 没有任何退出设定,所以会重复运行至数据流终结。循环外占位栏的数据馈送有 3 个数据流,循环 1 占位栏的数据馈送有 2 个数据流,循环 2 占位栏的数据馈送有 4 个数据流。循环 1 占位栏的首个数据流每列皆有 58 个数据值,第二个数据流则每列有 63 数据值。

space
:: 第一组页面

第一次运行模板时,Mergemill 提取循环外占位栏的首组数据流的第一组数据值以作输出之用。模板运行至循环 1 时,该循环体便会被重复运行 20 次,至其内的占位栏皆使用了首组数据流的首 20 个数据值,然后退出。模板运行至循环 2 时,该循环体会被重复运行直至其内的占位栏全用尽它们的首个数据流,然后退出,其间数据不足的数据流会使其相关的占位栏插入空白值直至最长的数据流被尽用为止。Mergemill 继续运行至模板结束。这将产生首组数据流的第一页。

由于循环 1 内占位栏的首组数据流尚未用尽,模板会被再次运行。如果有足够的数据,循环外的占位栏会使用它们首组数据流的第二组数据值以作输出。当 Mergemill 运行至循环 1 时,便会重复运行循环体,直到用尽首组数据流的第二组 20 个数据值,然后继续至循环 2。该循环会被略过,因其内的占位栏巳全用尽它们的当前数据流。Mergemill 会继续运行至模板结束来完成第一页组的第二页。

模板运行第三次,完成使用循环 1 内占位栏的首组数据流的最后 18 个数据值。Mergemill 然后继续运行至模板结束,其间再次跳过循环 2。这样就完成了第一页组的第三页(最后一页)。

space
:: 第二组页面

随后,模板会被运行 4 次,以第二组数据流产生第二页组的 4 个页面。如第一页组的情况一样,循环 2 会于第一页用尽其内所有占位栏的第二组数据流。如有足够数据值,所有循环外占位栏皆会使用它们第二个数据流的首 4 佪数据值来产生页组内的 4 页输出。没有足够数据值的循环外占位栏将按「循环外占位栏数据环回」选项适当处理。

space
:: 其余页面组

输出第三页组时,模板只运行一次,产生一个页面,因为循环 1 巳没有数据可用,故会被完全略过。循环 2 会被重复运行直至其内的占位栏全用尽它们的第三个数据流。

由于所有循环内占位栏必须用尽它们的数据流,模板会被运行第四次,去产生只有一页的第四个页组。此页组与前一组一样,循环 1 会被完全略过,而循环 2 会在一页内用尽其第四组数据流。同样,由于循环外占位栏没有第四组数据流,故它们将按「循环外占位栏数据环回」选项被适当处理。

要了解更多有关循环标籤的应用,建议你细心理解一些巳包含于 Mergemill Pro 软件包内的范例:Mergemill Pro > Mergemill Resources > Examples > 简体中文。

spacer

内容插入

算术表达式

循环

分支

系统值

统计函数

区段

范例

spacer

返回页首

软件功能spacer::spacer下载专区spacer::spacer购买spacer::spacer软件支援spacer::spacer视频教程spacer::spacer标籤指南spacer::spacer网站导览


版权所有 · 不得转载 © 2001-2017 Cross Culture Ltd.