主页spacer>Mergemill 标签指南>spacer内容插入标签

spacer

内容插入

算术表达式

循环

分支

系统值

统计函数

区段

范例

内容数据spacer::spacer内容来源spacer::spacer处理顺序spacer::spacer动态数据值spacer::spacerXojoScriptspacer::spacer占位栏属性spacer::spacer结果数字格式spacer::spacer多列输出spacer::spacer查阅数据值

spacer

概览

Mergemill 将模板的静态内容与数据馈送合并生成你想要的输出。你在模板中嵌入特殊标签,指定如何从馈送中插入内容。

模板内类似 <?[占位栏名称]?> 的标签主要以插入内容为目的。所有放置于对应的 <?Loop?> 及 <?EndLoop?> 标签之间的占位栏属于「循环内占位栏」,其余的为「循环外占位栏」。数据馈送内容插入占位栏可直接插入提取之数据值,或插入动态生成的数据值。

当你在 Mergemill Pro 设定一个合并作业,你须指定一个相关的模板,并按下一个按钮来解析它。在模板中发现的每一个新的占位栏名称,Mergemill Pro 会自动为其尸在相关作业之下添加一个任务定义,让你设定该占位栏自数据馈送提取内容的数据列,或指定数据值是如何动态地生成。

当你运行一个作业,其相关模板会被重复执行,直到用尽所有主要的数据馈送。模板每次运行时,Mergemill Pro 将模板中的所有静态内容复制到输出,并从指定的数据源提取相应的数据值来取代每个占位栏,生成完整的输出。视乎你设定的作业输出选项,当 Mergemill Pro 达到模板的终结,便会生成下列一个输出:合并后的文本转换成语音、发送自定义的合并电邮、合并后的文本存储为文档、使用合并后的数据来更新 SQL 数据源、或导出数据到 CSV 或 XML 文档。

返回页首


内容数据

数据源提供数据馈送给模板内用以插入内容的占位栏。从同一数据馈送获取资料的占位栏数决定该数据馈送内包含的数据列数:一个数据列提供数据给一个占位栏。数据源中的其他数据列不会被读取。

一个数据馈送可能包含许多连续的数据流。它们可能来自一个文件夹中的文档,一个收件箱中的电邮,或一个网址列表的网页。例如,一个文件夹内的十个文档提供了十个数据流的数据馈送。如果你设定了任务从一个文件夹、电邮帐户、或一个网址列表作为单一的数据流获取数据,整个数据馈送便会被当作为一个数据流来处理。SQL 数据库于任何时候皆被视为单一数据流的数据馈送。

数据馈送内的所有数据流皆包含相同的数据列数,每列提供一系列的数据值给一个占位栏。短列后段会被空白值填充以匹配最长列的数据量,使数据流所有的数据列总是提供相同数量的数据值。

数据流的重要性有两方面。首先,数据排序的范围是当前的数据流。你可以设定任何数据馈送作多层级的排序,从相同数据馈送中获得数据的所有占位栏都会在每一数据流内以数据行排序。其次,Mergemill 总会于数据流完结时退出循环,因为 Mergemill 每次是从数据馈送提取一个流的数据,以产生一组输出。「循环标签说明」详细解释了这一进程。

当 Mergemill 解析模板时,它会为每个独特的占位栏名称创建一个任务定义,因此在不同循环内所有同名的占位栏皆会使用同一数据流相同数据列的数据值。然而,它们不需要同步使用相同数据列内的数据值,因为运行模板时 Mergemill 是独立管理每个循环内使用的数据。

不同的占位栏从相同数据源同一数据列中并不一定获取同一系列的数据值,因为在设定一个任务时,你可指定过滤器在数据值中提取的具体内容。你也可指定每个数据值被纳入必须满足的条件。

返回页首


内容来源

Mergemill 接受多种数据源。作业中的某些占位栏可从一个 ODBC 兼容的 SQL 数据库获得数据,而同一作业的其他占位栏的数据可能来自本机的 SQLite 数据库、电邮、网页、网址列表内的网页、一个本机文档、通过 FTP 读取的远程文档、本机的文件夹内的文档、或一个通过 FTP 读取的远程文件夹内的文档。

一个数据源可提供结构化或非结构化的数据。提供结构化数据的来源是带分隔符的文档(通常以制表符分隔或逗号分隔)、XML 文档、SQL 数据库。非结构化的数据则来自电邮、纯文本文档及 HTML 文档。

一个纯文本文件或电邮可提供其整个文本内容为一个单一的数据值,或以「Mergemill 数据首尾标记」(如 [占位栏名称]...[/])提供非结构化数据。你可使用 Mergemill 的提取过滤器,轻易地略过数据标记外的文本,提取这些「包裹」数据值。

返回页首


从数据源到输出的处理顺序

:: 过滤器动作

Mergemill 的默认设定是没有过滤器动作,意即所有数据值皆会被完整纳入。如果指定了过滤器,数据值被读取时便会经过过滤器,以决定它们应否被纳入。如果一个值符合「纳入」过滤器的条件,数据值内满足「撷取」过滤器条件的字符串便会被撷取。

如果只有一个占位栏从某个来源获取数据,或该来源提供非结构性的数据,则纳入过滤器只影响提供给该占位栏的数据值。如果数据源提供结构化的数据给予数个占位栏,则这些占位栏使用的任何一个数据值被拒绝的话,整行的数据值皆会被排除。

如果撷取过滤器增加了一个结构化数据流的一些数据值数量,则你可选择于同一数据流的其他数据列内,设定复制数据值至相应添加的新位置或给它们赋空值。此动作完全不影响其他数据馈送。

如果撷取过滤器增加了一个非结构化数据流的一些数据值数量,其他所有数据列都不会受到影响。Mergemill 只给同一数据流最后较短数据列的末段赋空值,以使数据馈送内的所有数据列的数值量一致。

space
:: 其他数据处理工作

所有查找替换数据处理是在过滤动作之后及数据馈送后端处理之前进行的。下面是你可应用于数据值的十二项数据馈送后端处理功能。它们全于每个占位栏相关的任务定义内设定。

1.

「修剪空白字符」修剪掉数据值两端的空白字符。

2.

「转换成首字母大写格式」将数据值转换成首字母大写格式。

3.

「转换成大写格式」将数据值转换成大写格式。

4.

「转换成小写格式」将数据值转换成小写格式。

5.

「特殊字符转换成 HTML 编码」将数据值内的特殊字符转换成 HTML 编码,如 "©" 成为 "&copy;"。

6.

「于字符转换至编码时略过 <、>、" 及 &」于字符转换至 HTML 编码时略过 <、>、" 及 &。

7.

「还原 HTML 编码至特殊字符」还原 HTML 编码至特殊字符,如 "&copy;" 或 "&#169;" 转换成 "©"。

8.

「生成网页时保存文本换行」于生成网页时插入适当的 <br />,<p> 及 </p> 标签以保存数据馈送原内容的文本换行。

9.

「网址组件编码」将数据值转换为网址组件格式,例如 "www.bread&butter.com" 编码成 "www.bread%26butter.com"。

10.

「网址组件解码」将经过网址组件编码的数据值解码回其原来形式。

11.

「Base64 编码」将数据值转换为 Base64 格式。

12.

「Base64 解码」将 Base64 数据值解码回其原来形式。

处理馈送数据的最后一步是数据排序。如前所述,Mergemill 允许多层级排序,并将从当前数据馈送中获得数据的所有占位栏在当前数据流内以数据行排序。

space
:: 输出

当所有的数据巳被读取,过滤,处理和排序,Mergemill 便会运行模板来生成输出。每当 Mergemill 遇到一个占位栏标签,相应的数据值便会被提取。每个循环体每次被运行时,该循环体内的所有同名占位栏皆会被赋予同一数据值,循环外占位栏于每次模板被运行时亦以同一方式处理。插入取代每一个占位栏的实际文本取决于该标签内的属性。

当 Mergemill 遇到的占位栏标签是被设定为数据以动态生成的,即「自动生成文字」或 XojoScript,要被插入每个占位栏位置的数据值便会被独立生成。你可于占位栏的相关任务定义内设定如何产生该「自动生成文字」或选择要运行的 XojoScript。应用于该占位栏的 XojoScript 只会被编译一次,以达最佳运行速度。

返回页首


输出路径和自动生成文字内使用动态数据值

:: 在输出路径和档名内插入占位栏数据

Mergemill 允许你设定作业建构输出路径和输出档名的方法,包括可插入占位栏自数据馈送提取的「起始数据值」。一个循环外占位栏的起始数据值是其当前数据流中的第一个。循环内占位栏的起始数据值是生成当前页面时所使用的第一个值。

space
:: 在输出路径、输出档名及自动生成文字内的源档名和副档名

输出路径、输出档名或自动生成文字的组成部分可包括数据源档名或副档名。Mergemill 会使用首个循环外占位栏的数据源来设定当前输出页面的「源档名」和「源副档名」。如你想指定的「源档名」和「源副档名」的相关占位栏并非首个循环外占位栏,你可将该占位栏于模板最前的适当位置插入在 <?HD?> 及 <?/HD?> 之间。

space
:: 在输出路径、输出档名及自动生成文字内的序列号

生成占位栏的「自动生成文字」的组件可包括序列号。在这情况下,你需要在该占位栏的相关任务设定内以「起始数;增量」的形式提供参数。例如,参数 "012;2" 会生成序列 012,014,016,依此类推,直到作业结束运行。

Mergemill 独立管理每个循环的序列号。如占位栏 <?[自动生成序列号]?> 在循环内外皆有被使用,Mergemill 于作业开始运行时赋予它们同一个起始数,随后数值增量按运行情况各自进行,并不会同步。

输出档名和输出路径的序列号组件亦以类似上述方式处理。数值在作业开始运行时被设定为起始数,并在每个后续的新页添加增量一次,直到作业结束。不过,这里有一个额外的选项:你可选择跳过起始数。方法是使用「起始数;增量;抑制首号」参数内为此应用而设的「抑制首号」开关(0 或 1)。例如,000;1;1 可被应用于输出档名时产生 output.htm,output001.htm,output002.htm 等,依此类推。

返回页首


XojoScript

XojoScript 动态数据源允许你于 Mergemill 内执行 Xojo 代码和将结果赋予占位栏标签。要使用它,请执行下列步骤:

1.

通过 Mergemill 文档的「数据源:XojoScripts」页面加入脚本。

 

*

使用下面的脚本范例作为你脚本的结构参考。

 

*

使用「测试编译」和「测试运行」按钮来检查你的脚本。你可能需要先「注释掉」参数输入块,再设定一些临时数据值以测试脚本,如
spacer// vPrincipal = Val(Input("Principal"))
spacervPrincipal = 100

 

*

一旦你的脚本通过测试,即可删除临时的参数设定块,并启用参数输入块。

2.

在模板内你打算插入 XojoScript 结果值的位置添加一个占位栏标签。

3.

添加一项作业定义使用上述模板,并在使用 XojoScript 的占位栏的相关任务设定内执行下列步骤:

 

*

指定 XojoScript 作为数据源。

 

*

从巳添加入 Mergemill 文档内的 XojoScript 脚本列表中选择要使用的脚本。

 

*

输入或选择作为 XojoScript 参数的数据值。

请注意,参数可以是一个静态值或占位栏获取的数据。如果你使用占位栏提取的数据值作为参数,只需将该占位栏名从模板占位栏列拖放到适当的参数单元格内。当脚本运行时,该占位栏当前的数据值(即 <?[占位栏]?> 或 <?[占位栏]{1}?>)将被传递给脚本。

space
:: 善用你的 BASIC 技术

Xojo 的 BASIC 语言与 Microsoft Visual Basic 非常相似。所以,你可使用自己喜欢的 BASIC 开发工具,来开发和测试你的脚本。Mergemill 不提供任何 IDE 或调试工具,只提供编辑栏位以助插入并存储脚本,及编译器将脚本翻译成快速机器代码。

如果你使用 Xojo 来开发 XojoScript,我们已经包含了一个简单的 Xojo 文件 "XojoScript" 在 Mergemill 软件包内。它的 App class 内的 Open event 包含了推荐的脚本结构。你可在那里开发你的脚本,然后在 Project 选单上选择 Run 来测试运行脚本。

space
:: 脚本范例

如果你熟识 BASIC 及所编写的代码简单,便可于 Mergemill 进行开发和测试。下面是一个简单的例子来计算「复合增长率」。它显示典型 XojoScript 的四个部分。

第 1 部分是变量声明:
spaceDim vFuture, vPrincipal, vRate, vPeriods as Double
第 2 部分是变量的参数赋值:
spacevPrincipal = Val(Input("Principal"))
spacevRate = Val(Input("Rate%"))
spacevPeriods = Val(Input("Periods"))
第 3 部分是算法:
spacevFuture = vPrincipal * ((100 + vRate) / 100) ^ vPeriods
第 4 部分传回结果,以便插入输出之中:
spacePrint Str(vFuture)

返回页首


占位栏属性

<?[占位栏名称]?>

下面列出了可包括在占位栏标签的属性。占位栏名称和属性由冒号分隔,各属性则由分号分隔。

 

OutLoop:指示 Mergemill 将实处循环内的当前占位栏视为一个「循环外」占位栏来处理

 

AWords,nn:传回当前占位栏文本数据前端的 nn 个字

 

ZWords,nn:传回当前占位栏文本数据后端的 nn 个字

 

Left,nn:传回当前占位栏文本数据前端的 nn 个字符

 

Right,nn:传回当前占位栏文本数据后端的 nn 个字符

 

Mid,ss,nn:传回当前占位栏文本数据中段的 nn 个字符,由 ss 位置开始

 

UCase:传回当前占位栏文本数据的大写

 

LCase:传回当前占位栏文本数据的小写

 

TCase:传回当前占位栏文本数据的首字母大写

 

Count:传回当前占位栏数据流中数据列的数据值总数

 

Position:传回当前占位栏数据值在数据列中的位置编号

 

 

范例:

 

<?[产品类别:OutLoop]?>

 

<?[产品资料:AWords,3;ZWords,1]?>

 

<?If([产品类别:OutLoop;Awords,1] = Automobile)?>

如果需要将一个循环外占位栏放置在一个循环体内,便需添加 OutLoop 属性。

属性的应用是顺序的。所以,AWords,3;ZWords,1 会于输出中插入数据文本内被英文空白字符分隔的第三个词。此外,Position;Count 效果上与 Count 一样。

如果属性参数 nn 被省略或小于 1,AWords, ZWords, Left, 及 Right 皆会传回整个数据文本,而 Mid 会传回包括从起始位置 ss 至数据文本末端的所有字符。如果属性参数 ss 于 Mid 内被省略或小于 1,Mid 会如 Left 一样传回当前占位栏文本数据前端的 nn 个字符。如果 Mid 的两个参数皆被省略或小于 1,Mid 会传回整个数据文本。

请注意:Position 及 Count 会勾销所有其他属性(OutLoop 除外)。

返回页首


结果数字格式

<?[占位栏名称]@结果数字格式?>

如果一个占位栏的值是数值,你可以「结果数字格式」控制其输出格式。它可最多有三个用英文分号分隔的部分:正数格式;负数格式;零格式。

每个格式是一串特殊字符以控制如何将数量格式化:
# 只显示一个非零的数字,零会变为空白
0 会显示一个非零数字,零会被显示为 0。
. 会显示小数点
, 会显示千位分隔符
% 会显示数字乘以100
( 会显示一个左括号
) 会显示一个右括号
+ 会于数字的左侧显示正负号
- 会于负数字的左侧显示负号
E 或 e 会以科学标记法显示数字
「\字符」会显示「\」后的字符

范例:

 

12345.6 配合 ###,##0.00 会输出 12,345.60

 

0.17 配合 #% 会输出 17%

 

12345.6 配合 #.##e+ 会输出 1.23e+4

 

0 配合 ###,##0.00;(###,##0.00);\z\e\r\o 会输出 zero

返回页首


多列输出

<?[占位栏名称]{列号}?>
<?[
占位栏名称]{列号}@结果数字格式?>

Mergemill 让你很容易在输出页面上产生多列名单。首先你可以循环标签标示模板内重复的部分,然后在循环内占位栏添加列数。当作业运行时,Mergemill 便会将适当数据值插入相应列号的占位栏位置。

如果没有指定,所有占位栏标签列号皆默认为 1。这是允许的最小值。在动态生成数据值的占位栏,列号(如有的话)将被忽略。

请注意:所有占位栏的首列(列号为 1)数据值在模板运行时总是被认为巳使用的。如列号大于 1,只有当 Mergemill 回应占位栏或表达式操作数要求数据时,提取的数据值才会被认为是使用了的。如占位栏标签是在隐藏区段之内,或在分支结构内被跳过,被提取的数据值便不会被视为巳使用的。如一个值被 <?IF(表达式...)?>, <?IF(SAME[...)?>, 或 <?CASE(表达式...)?> 提取为进行比较,则该值也不会被视为巳使用的。

在每一次模板或循环的后续运行,Mergemill 将于上次最后「使用」的数据值后继续。

下面的 HTML 代码段是一个范例:

<table width="700" border="0" cellspacing="0" cellpadding="0">
<tr align="left" valign="top">
<td width="100" align="center"><p>年度</p></td>
<td width="300" align="center"><p>第一季销售额</p></td>
<td width="300" align="center"><p>第二季销售额</p></td>
</tr>
<?LOOP?><tr align="left" valign="top">
<td width="100"><p><?[年度]{4}?></p></td>
<td width="300"><p><?[销售额]{1}@##,###,##0?></p></td>
<td width="300"><p><?[销售额]{2}@##,###,##0?></p></td>
<?VR:vDummy?><?[销售额]{4}?><?/VR?></tr>
<?ENDLOOP?>
</table>

以上模板段生成一个网页上的列表,以比较横跨数年的第一和第二季度销售数字。数据馈送来自 CSV 文档,下面显示其部分内容。

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

列号为 4 的年度占位栏标签指示 Mergemill 于每次运行循环体时跳过三个值。为保持表格中的列同步,我们需要添加第 4 列的销售额。由于这个值并不需要插入,但需要被视为巳使用的,我们将它放置于变量赋值块内。

要注意的是 Mergemill 视所有循环体外的模板部分一起为一个特殊的循环体,其中列号的处理与一般循环一致,惟於循环体外任何模板部分重复出现的占位栏会使用相同的数据值。

返回页首


查阅数据值

<?[查阅数据栏]([查阅索引栏]=[占位栏])?>
<?[
查阅数据栏]([查阅索引栏]=[占位栏])@结果数字格式?>
<?[
查阅数据栏]([查阅索引栏]=[占位栏]{列号})?>
<?[
查阅数据栏]([查阅索引栏]=[占位栏]{列号})@结果数字格式?>

占位栏标签的查阅扩展指示 Mergemill 提取占位栏的当前数据值,于「查阅索引栏」的数据列内查找相同的值,然后于「查阅数据栏」的相应位置提取其数据值,插入输出之内。「查阅索引栏」及「查阅数据栏」内的属性(如有的话)皆会被忽略。

要了解查阅扩展标签的应用,建议你细心理解一些巳包含于 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.