主頁spacer>spacerMergemill 標籤指南spacer>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 BASIC 代碼和將結果賦予佔位欄標籤。要使用它,請執行下列步驟:

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.