この演習では、JET 入力モデル、XPath 式を使用して JET 入力モデルを全探索する方法、および JET アクションと入力モデルを関連付ける方法について、さらに検討します。
このタスクについて
JET 入力モデル JET 変換をオーサリングして作成する入力モデルには、次のような特性があります。
- モデルは階層化されていて、単一の root 要素があります。
- モデルの各要素タイプには、ストリング値を持つ属性が含まれることがあります。
- 要素の包含は常にゼロ以上の基数を指定します。
モデルの機能は意図的に制限されていて、ユーザーがメタモデルの設計について深く理解していなくても、モデルからテキストへの変換を素早く簡単に作成できます。
JET 変換およびアクションの呼び出しによるモデル処理
JET 作成者エディターは、入力モデルを処理するためのコードを生成します。
このコードは main.jet テンプレートにあり、次のような特性があります。
- 生成されたコードは、深さ優先でモデルを全探索します。
- このコードはモデルを二度処理します。最初の反復では派生した属性式を評価します。
2 回目の反復では、プロジェクト、フォルダー、およびファイルを作成する JET アクションを呼び出します。
ファイルを作成する JET アクションは JET ファイル・アクションと呼ばれ、JET テンプレートを呼び出します。
- 処理中は、各モデル要素が XPath 変数に割り当てられます。
この変数の名前は、エディター・エリアで表示される要素タイプの「プロパティー」ビューで定義されます。デフォルトでは、変数の名前は、モデル要素の名前と同じです。XPath 式内で XPath 変数は常にドル記号 ($) の接頭部が付くため、変数と要素名を区別できます。
- 要素の処理中は、最初の反復で派生属性が計算され、2 番目の反復で JET アクションを実行してから、子のモデル要素が処理されます。
- 現行の要素とそのすべての親要素に関連する XPath 変数は、派生属性の計算中と
JET アクションの呼び出し中に使用可能です。したがって、派生属性の計算、JET アクション、または JET ファイル・アクションによって呼び出される JET テンプレートは、XPath 変数を使用することによって、現在処理されている要素や、その親要素のいずれかを参照することがあります。
例として、このモジュールのモデルについて考察します。次のイメージは、「入力スキーマと出力アクション (Input schema and output actions)」ペインの内容を示しています。
「Create File: letter.html」というアクションと、関連する JET テンプレート (templates/letter.html.jet) は、root 要素の下で mailing 要素が検出されるたびに呼び出されます。
アクションとテンプレートの両方が、2 つの XPath 変数 ($mailing と $root) にアクセスできます。アクション・パラメーターとテキストの置き換えでは、mailing と root という要素タイプに属する任意の属性を使用できます。
XPath 式と、モデル要素の名前変更
JET オーサリング機能によって作成される XPath 式は、常に $<変数名>/@<属性名> の書式になります。変数名または要素タイプが名前変更されると、JET オーサリング機能がこのような式をリファクタリングします。ただし、このリファクタリングは JET テンプレートには適用されません。そのため、JET 作成者エディターで変数、すなわち要素タイプを名前変更すると、古い変数名を使用する JET テンプレート内のすべての XPath 式が中断されます。