XTL 評価モデル
この日本語訳は読みやすさのための補助資料です。仕様の正典は英語原文で、規範的な解釈の差異が生じた場合は英語版が優先します。
本ドキュメントは、XTL 実装が入力を読み取り、出力を生成する方法を定義します。
入力と出力
XTL 変換は次を入力にとります。
template.xlsx
data.xlsx
そして 1 つ以上の .xlsx 出力ファイルを生成します。
テンプレートワークブックは、出力ワークブックの形、テンプレート式、グループ化規則、ディレクティブ、および設定を定義します。ソースワークブックは表形式データを提供します。
予約シート
xl3 は 4 つの予約シート名を定義します。__<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 参照)。
外部データソース
テンプレートは、予約シート __sources__ を提供することで、デフォルト以外の名前付きデータソースを宣言できます(MAY)。行 1 がヘッダーで、それ以降の各行が 1 つのソースを宣言します。
| 列 | 必須 | 意味 |
|---|---|---|
name | はい | ソース名。英字、数字、アンダースコアのみ。__ で始まってはならず(MUST NOT)、default であってもなりません(MUST NOT。暗黙ソースに予約)。 |
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 ディレクティブなしでデフォルトで垂直に展開します — ソース行 1 行あたり 1 つのレンダー行(Directives 参照)。
@source がない場合、アクティブソースは default です。@source は、同じブロックの @filter / @sort / @top ディレクティブの前に現れる必要があります(MUST。これらが動作する行集合を決定するため)。
未宣言のソースを参照すること — @source <Unknown> 経由でも Unknown[Column] 経由でも — はエラーです。
@join ディレクティブ
データブロックは、@source の直後に 1 つの @join ディレクティブを追加して、各プライマリソース行を 2 番目のソースの行とペアにすることができます(MAY)。
{{ @source Renewals }}
{{ @join Customers on Customers[Account] = Renewals[Account] }}
{{ [Account] }} | {{ Customers[Name] }} | {{ [Amount] }}
プライマリ行ごとに、エンジンは(Comparison Algorithm に従って)最初に一致する結合行を見つけ、そのペアをレンダリングします。「最初」は結合ソースの自然な行順 — その source_table 範囲を上から下へ — で定義されます。これは規範的です:複数の結合行が等しい結合キーを持つとき、2 つの実装は同じペア行を選ぶ必要があります(MUST)。
一致が見つからない場合、プライマリ行はドロップされます(内部結合のセマンティクス)。
ブロック内では、[Column] と <PrimarySource>[Column] はプライマリ行に解決され、<JoinedSource>[Column] はペアの結合行に解決されます。行レベルでの他のソースへの参照は、引き続きエラーです。
複数の @join ディレクティブ、左外部結合のセマンティクス、複数行マッチは XTL 0.1 のスコープ外です。
Inputs
テンプレートは、予約シート __inputs__ を提供することで、実行時入力を宣言できます(MAY)。最初の行がヘッダーで、それ以降の各行が 1 つの入力を宣言します。
| 列 | 必須 | 意味 |
|---|---|---|
name | はい | 入力名。英字、数字、アンダースコアのみで構成されている必要があります。 |
type | はい | text、number、date、select のいずれか。 |
default | いいえ | 非空であれば、ホストがその入力を省略したときに使われます。デフォルト値は入力の type によってパースされます。 |
label | いいえ | ユーザ向けのプロンプトテキスト。ホストはこれをフォームラベルとして用いるべきです(SHOULD)。 |
description | いいえ | オプションの長めのヘルプ。 |
options | いいえ | type = select のときに必須。パイプ区切りの許容値、例:Seoul|Busan|Daegu。 |
実装は列をヘッダーテキストで(大文字小文字を区別せずに)識別する必要があります(MUST)。上記以外の列は予約されており、無視する必要があります(MUST)。
行に default がない入力は required(必須) です。ホストはすべての必須入力を供給する必要があり(MUST)、省略するとエラーです。
解決済みの入力値は、セルからは {{ __inputs__[name] }} で参照されます。例えば、name = month で宣言された入力は {{ __inputs__[month] }} として参照されます。__inputs__[name] は解決済み + 強制変換済みの値に解決されます。テンプレート内部から入力の label、default、type を読む仕様上の形式はありません(ホストは readTemplateInputs() API を使います)。
入力名は、__config__ の非システム行として宣言された作成者定義値と衝突してはなりません(MUST NOT)。これはパース時のエラーです。
ADR-0062 に従い、入力は default セルが ADR-0050 評価後に ADR-0007 の意味で空値を生成するときに required(必須) となります。「空セル」、default = ""、default = " "、default = {{ "" }} の各形は、すべて「required」に畳まれます。
ADR-0063 に従い、options セルは評価後に | で分割されます。各要素は Unicode 空白でトリムされ、空要素はドロップされます。options = "Seoul | Busan" は ["Seoul", "Busan"] を生成します。options = "a||b" は ["a", "b"] を生成します。options = "||" は xl3/inputs/missing-options を発生させます。重複オプションは保持されます。ホスト供給の select 値は、結果配列に対して大文字小文字を区別してマッチします。
入力はホスト供給値から強制変換されます。
text— ホスト文字列をそのまま透過します。非文字列のホスト値は正規文字列形式(Comparison and String Coercion 参照)でストリング化します。number— 「trim してからNaNを生まないNumber()」でパースします。失敗はエラーです。date— 日付フォーマットの単一式セルと同じ規則で強制変換します。失敗はエラーです。select— ホスト値は、正規文字列形式の正規化後に、宣言されたoptionsのいずれかと等しい必要があります(MUST)。失敗はエラーです。
強制変換された入力値は、他の値と同じく IF()、@filter、&、比較、TEXT() に参加します。
default / label / description / options におけるテンプレート評価
ADR-0050 に従い、default、label、description、options 列のセルは XTL テンプレート — 連続テキストと 0 個以上の {{ ... }} ブロック — であり、入力読み込み時(任意のソース行がロードされる前)に評価されます。評価コンテキストは意図的に制約されています。
利用可能なバインディング:
__config__[key]—__config__シート(__inputs__の前にパースされる)からの作成者定義値。- 純スカラー関数:
TODAY、DATE、IF、IFEMPTY、IFS、IFERROR、UPPER、LOWER、TRIM、TEXT、YEAR、MONTH、DAY、EOMONTH、EDATE、DATEDIF、ROUND、ABS。
禁止されたバインディング(安定エラーコードを発生させます):
- 裸の
[Column]またはSource[Column]参照 — 入力読み 込み時にはソース行コンテキストがまだありません。エラー:xl3/inputs/forward-reference。 __sources__[…]または__inputs__[name]— ソースはロードされていません。入力行は独立した宣言です。エラー:xl3/inputs/forward-reference。ROW()、SUM、COUNT、AVERAGE、MIN、MAX、XLOOKUP— レンダー時またはソースデータに依存します。エラー:xl3/inputs/runtime-only-fn。
評価後の正規文字列形式(ADR-0009 参照)が、ホスト UI へ InputSpec.default / InputSpec.label / InputSpec.description として戻されるものです。options については、評価された文字列がさらに | で分割されて配列を生成します。
default については、評価された文字列はその後、入力の宣言された type に従って上記の規則で強制変換されます。したがって type = date の default = {{ TODAY() }} は、強制変換後のデフォルトとしてレンダー時の ISO 日付を生成します。
ソースデータモデル
ソースデータモデルは行の順序付きリストです。各行は、ソース列名からセル値へのマッピングです。
source_sheet はワークシートを選択します。省略時は最初のワークシートが使われます。source_sheet が * で終わる場合、それは接 頭辞パターンです。実装は、ワークブック順で、* の前の接頭辞で始まる名前を持つ最初のワークシートを選択する必要があります(MUST)。一致するワークシートがない場合はエラーです。シート名の完全一致は接頭辞マッチングより優先します。
source_table は選択されたワークシート内で解釈されます。
| 形 | 意味 |
|---|---|
N | 行 N がソース列名を含みます。ソース列は、最初の非空セルから最後の非空セルまでの非空セルです。行 N の下からワークシートの使用済み行末までがデータ行です。 |
A1:D | セル A1:D1 がソース列名を含みます。その下からワークシートの使用済み行末までがデータ行です。 |
A1:D200 | セル A1:D1 がソース列名を含みます。列 A:D の行 2:200 がデータ行です。 |
source_table が省略された場合、デフォルトは 1 です。
N は 1 始まりの正の整数である必要があります(MUST)。範囲形式は、左列、最初の行、右列、およびオプションの終了行を持つ絶対 Excel A1 座標を使用する必要があります(MUST)。左列は右列の右にあってはなりません(MUST NOT)。オプションの終了行は最初の行の上にあってはなりません(MUST NOT)。
範囲形式が最初の行と等しい終了行を含む場合(例:A1:D1)、ソーステーブルには列名のみが含まれデータ行は 0 となります。これは正当です。