XTL 評估模型
本繁體中文版本僅供閱讀輔助。規格的正典為英文原版,若規範性解讀有差異,以英文為準。
本文件定義 XTL 實作如何讀取輸入並產生輸出。
輸入與輸出
一次 XTL 轉換接受:
template.xlsx
data.xlsx
並產生一個或多個 .xlsx 輸出檔案。
範本活頁簿定義輸出活頁簿的形狀、範本運算式、群組規則、指令以及組態。 來源活頁簿則提供表格化資料。
保留工作表
xl3 定義了四個保留的工作表名稱。任何名稱符合
以 dunder 包覆樣式 __<name>__ 的工作表均保留給引擎使用。
作者不得(MUST NOT)建立採用該樣式的工作表;其他皆視為
範本內容。
| 工作表 | 用途 |
|---|---|
__config__ | 單一組態物件——引擎中繼資料加上作者自訂值 |
__inputs__ | 執行階段輸入宣告(集合;見 Inputs) |
__sources__ | 命名的外部資料來源宣告(集合;見 External Data Sources,依 ADR-0012) |
__lists__ | 作者自訂的成員資格清單(集合;見 List Sheets) |
從儲存格運算式參考保留工作表內容時,使用 Excel
結構化參考形式 __sheet__[key]——這是未來 ADR 中
也會用於多來源欄位的相同形式。舊式 _<name> 參考
語法在本版本中已廢止。
範本組態
名為 __config__ 的隱藏工作表可以(MAY)提供中繼資料與
作者自訂值。A 欄為鍵,B 欄為值。
| 鍵 | 意義 | 範例 |
|---|---|---|
name | 範本顯示名稱 | Order summary |
description | 自由文字 | Monthly order summary |
source_sheet | 來源工作表名稱,或以 * 結尾的前綴樣式 | Orders、Data_* |
source_table | 來源資料表選擇器。第一個被選到的列包含欄名稱;下方各列為資料。 | 1、A1:D、B5:H200 |
output_file_pattern | 輸出檔名範本 | {{ __config__[customer] }}_report.xlsx |
match_pattern | 批次比對樣式 | Orders* |
| 任何其他鍵 | 作者自訂值 | title = Q2 Sales |
source_table 是唯一的來源資料表選擇器。
作者自訂值使用任何不在上述系統表中的鍵。它們從儲存格
透過 {{ __config__[key] }} 參考。例如,title = Q2 Sales
這一列可用 {{ __config__[title] }} 參考。作者不得
(MUST NOT)以系統鍵名稱重新使用於作者自訂值。
依 ADR-0056,__config__[key] 讀取形式會解析到該儲存格的
值,無論 key 是系統槽位還是作者自訂槽位。
{{ __config__[name] }}、{{ __config__[output_file_pattern] }}
等都是合法的讀取。寫入端的限制(作者不能以系統鍵名稱
宣告該列)維持不變。讀取未知鍵會引發
xl3/expression/unknown-name。
需要 每次執行 的值的範本,請改用 __inputs__ 工作表
(見 Inputs)。
外部資料來 源
範本可以(MAY)透過提供保留工作表 __sources__ 來宣告
預設來源以外的命名資料來源。第 1 列為標題;之後每一列
宣告一個來源。
| 欄 | 必填 | 意義 |
|---|---|---|
name | 是 | 來源名稱。僅可使用字母、數字與底線。不得以 __ 開頭,不得為 default(保留給隱含來源)。 |
sheet | 是 | 資料活頁簿中的來源工作表名稱,或以 * 結尾的前綴樣式。 |
table | 否 | 該工作表的來源資料表選擇器,預設為 1。語法同 __config__ 的 source_table。 |
description | 否 | 自由格式註記。 |
實作必須(MUST)依標題文字識別欄位,不分大小寫。
隱含的 default 來源——透過 __config__ 中的 source_sheet
與 source_table 列宣告——名稱永遠是 default。它不能在
__sources__ 中重新宣告。
儲存格參考
[Column] 仍代表「目前作用中來源在目前列的該欄」。
Source[Column] 是命名來源的結構化參考形式:
{{ [Account] }} 作用中來源在目前列的值
{{ Customers[Account] }} Customers 在目前列的值(僅在它為作用中來源時)
{{ SUM(Renewals[Amount]) }} 對 Renewals 全部列集合進行彙總
列層級的 Source[Column] 僅在 Source 為周圍資料區塊的作用中
來源時才有效。在彙總函式內部,Source[Column] 一律對 Source
的全部列集合進行運算,與作用中區塊無關。
@source 指令
資料區塊可以(MAY)將其迭代範圍鎖定到某個命名來源:
{{ @source Customers }}
{{ @filter [Region] = "Seoul" }}
{{ [Account] }}
{{ [Region] }}
上述資料區塊預設會垂直展開——每一來源列產生一個渲染列——
不需要顯式的 @repeat 指令(見 Directives)。
未指定 @source 時,作用中來源為 default。@source
必須(MUST)出現在同一區塊的 @filter/@sort/@top
指令之前(因為它決定這些指令要對哪個列集合運算)。
參考未宣告的來源——不論是透過 @source <Unknown> 還是
透過 Unknown[Column]——皆為錯誤。
@join 指令
資料區塊可以(MAY)在 @source 之後緊接著加上 一個
@join 指令,將主來源的每一列與第二個來源的某一列配對:
{{ @source Renewals }}
{{ @join Customers on Customers[Account] = Renewals[Account] }}
{{ [Account] }} | {{ Customers[Name] }} | {{ [Amount] }}
對每一主來源列,引擎會找出 第一個 比對成功的被連接列
(依 Comparison Algorithm)
並渲染這對列。「第一個」由被連接來源的自然列順序決定——
即在其 source_table 範圍內由上到下。這是規範性的:當多個
被連接列具有相同的連接鍵時,兩個實作必須(MUST)挑出
相同的配對列。
如果找不到比對,主來源列會被 丟棄(內連接語意)。
在區塊內,[Column] 與 <PrimarySource>[Column] 解析到
主來源列;<JoinedSource>[Column] 解析到配對的被連接列。
列層級對其他來源的參考仍為錯誤。
多個 @join 指令、左連接語意、多列比對皆不在 XTL 0.1 範圍內。
輸入
範本可以(MAY)透過提供保留工作表 __inputs__ 來宣告
執行階段輸入。第 1 列為標題;之後每一列宣告一個輸入。
| 欄 | 必填 | 意義 |
|---|---|---|
name | 是 | 輸入名稱。僅可使用字母、數字與底線。 |
type | 是 | text、number、date、select 其中之一。 |
default | 否 | 若非空,當宿主未提供該輸入時使用。預設值會依該輸入的 type 解析。 |
label | 否 | 給人看的提示文字。宿主應該(SHOULD)將其作為表單標籤。 |
description | 否 | 選填的較長說明。 |
options | 否 | 當 type = select 時為必填。以管線符號分隔的允許值,例如 Seoul|Busan|Daegu。 |
實作必須(MUST)依標題文字識別欄位,不分大小寫。 未列於上方的欄位為保留欄,必須(MUST)忽略。
當某輸入的列沒有 default 時,該輸入即為 必填。宿主
必須(MUST)提供每個必填輸入;遺漏任一個即為錯誤。
解析後的輸入值從儲存格透過 {{ __inputs__[name] }} 參考。
例如,宣告為 name = month 的輸入可用 {{ __inputs__[month] }}
參考。__inputs__[name] 解析到「解析後且強制轉型後」的值;
規格中沒有從範本內部讀取輸入的 label、default 或 type
的形式(宿主請使用 readTemplateInputs() API)。
輸入名稱不得(MUST NOT)與 __config__ 中宣告為非系統
列的作者自訂值名稱衝突;這在解析階段就是錯誤。
依 ADR-0062,當 default 儲存格於 經過 ADR-0050 評估後
產生的值依 ADR-0007 為空時,該輸入為 必填。包含
「空白儲存格」、default = ""、default = " "、
default = {{ "" }} 等形式,皆會塌縮為「必填」。
依 ADR-0063,options 儲存格在評估後以 | 分割;每個元素
會修剪 Unicode 空白,空元素會被丟棄。
options = "Seoul | Busan" 產生 ["Seoul", "Busan"]