このページで
SLAXテンプレートの概要
SLAX スクリプトは 、テンプレートと呼ばれるルールの 1 つ以上のセットで構成されています。各テンプレートは、指定されたノードが一致したときに適用するルールを含むコードのセグメントです。
Junos OSリリース14.2以降のリリースでサポートされているSLAX言語のバージョン1.2は、テンプレートと機能の両方の引数としてSLAX要素をサポートしています。
次のセクションで説明する、名前付きテンプレートと名前なし(または一致)の2種類のテンプレートがあります。
名前なし(一致)テンプレート
一致テンプレートとも呼ばれる名前のないテンプレートには、テンプレートを呼び出すノードの基準を指定する XPath 式を持つステートメントが含matchまれています。次のコミット スクリプトのサンプルでは、テンプレートは設定階層の最上位要素と一致します。
match configuration {
/* ...body of the template goes here */
}
デフォルトでは、プロセッサはドキュメント階層全体を再帰的にトラバースし、各ノードを検査して、現在のノードに一致するテンプレートを探します。一致するテンプレートが見つかった場合、そのテンプレートの内容が評価されます。
ステートメントは apply-templates 、名前のないテンプレート内で使用して、ノードのデフォルトの階層トラバーサルを制限および制御できます。このステートメントは、要素内の属性に相当するオプションの select XPath 式を <xsl:apply-templates> 受け入れます。オプションの XPath 式が含まれている場合は、XPath 式に一致するノードのみがトラバースされます。それ以外の場合、 コンテキスト ノード のすべての子が通過します。XPath 式が含まれているがノードに一致しない場合、何も通過せず、何も起こりません。
次の例では、テンプレート ルールは XML 階層の要素に一致 <route> します。属性を changed 含むすべてのノードが処理されます。 route 属性を changed 含むすべての要素は、要素に new 置き換えられます。
match route {
<new> {
apply-templates *[@changed];
}
}
XSLT と同等の値:
<xsl:template match="route">
<new>
<xsl:apply-templates select="*[@changed]"/>
</new>
</xsl:template>
名前のないテンプレートを使用すると、スクリプトは XML 階層のタグの場所を無視できます。たとえば、すべての <author> タグをタグに変換する場合、テンプレートを使用すると、入力 XML ドキュメント内の場所に <div class="author"> 関係なく、すべての <author> タグを変換する単一のルールを作成できます。
名前付きテンプレート
名前付きテンプレートは、従来のプログラミング言語の関数と同様に動作します。スクリプトの複雑さが増したり、コード セグメントが複数の場所に表示された場合は、コードをモジュール化して名前付きテンプレートを作成できます。関数と同様に、名前付きテンプレートは引数を受け入れ、明示的に呼び出された場合にのみ実行されます。
SLAXでは、名前付きテンプレート定義は、キーワード、テンプレート名、パラメーターのセット、および中括弧で区切られたコードブロックで構成されています template 。パラメーター宣言はインラインで構成でき、パラメーター名、およびオプションでデフォルト値で構成されます。または、 ステートメントを使用して、テンプレートブロック内でパラメーターを param 宣言することもできます。既定値が定義されていない場合、パラメーターの既定値は空の文字列です。
次の例では、 という名前 my-template のテンプレートを作成し、3 つのパラメーターを定義します。そのうちの 1 つは文字列 falseにデフォルトで、そのうちの 1 つは、現在のコンテキスト ノードの子という名前 name の要素ノードのコンテンツにデフォルト設定されます。スクリプトがテンプレートを呼び出し、パラメーターを渡さない場合、デフォルト値が使用されます。
template my-template ($a, $b = "false", $c = name) {
/* ... body of the template ... */
}
別の方法は、 ステートメントを使用してテンプレート内でパラメーターを param 宣言することです。次のコードは、前の例と同じです。
template my-template {
param $a;
param $b = "false";
param $c = name;
/* ... body of the template ... */
}
SLAX では、 ステートメントを使用して名前付きテンプレートを call 呼び出します。ステートメントは、 キーワード名とテンプレート名で構成 call され、その後にパラメーター・バインディングのセットが続きます。これらのバインディングは、呼び出し元環境からテンプレートに渡されるパラメーター名のコンマ区切りのリストです。パラメーターの割り当ては、リスト内の位置ではなく名前によって行われます。または、 ステートメントを使用して、ブロック内で call パラメーターを with 宣言することもできます。テンプレートに渡されるパラメーターは、実際のテンプレートで定義されたパラメーターと一致する必要があります。それ以外の場合、パラメーターは無視されます。必要に応じて、各パラメーターの値を設定できます。呼び出し元環境でパラメーターの値を定義していない場合、スクリプトは以前に初期化されていた場合、パラメーターの現在の値を渡すか、パラメーターが宣言されていない場合にエラーが生成されます。パラメーターの受け渡しの詳細については、 SLAX パラメーターの概要を参照してください。
次の例では、現在のコンテキスト ノードの子という名前other-nameの要素ノードの内容を含むパラメーターcを使用してテンプレートmy-templateを呼び出します。
call my-template {
with $c = other-name;
}
次の例では、2 つのパラメーターをname-servers-template宣言します。sizename-serverssizeこのパラメータには、デフォルト値がゼロが与えられました。一致テンプレートを宣言して初期化name-serversすると、3 回が呼び出されますname-servers-template。
テンプレートの最初の呼び出しには、パラメーターは含まれていません。そのためname-servers、デフォルトは空の文字列でsize、デフォルトはテンプレートで定義されたゼロの値になります。2 番目の呼び出しには、 name-servers および size パラメーターが含まれていますが、 パラメーターのsize値のみを提供します。そのためname-servers、スクリプト内の初期化で定義された値は、設定階層内の要素のname-servers数とsize等しくなります。最後の呼び出しは 2 番目の呼び出しと同じですが、ステートメント構文を使用してパラメーターをwith提供します。
match configuration {
param $name-servers = name-servers/name;
call name-servers-template();
call name-servers-template($name-servers, $size = count($name-servers));
call name-servers-template() {
with $name-servers;
with $size = count($name-servers);
}
}
template name-servers-template($name-servers, $size = 0) {
<output> "template called with size " _ $size;
}
XSLT と同等の値は次のとおりです。
<xsl:template match="configuration">
<xsl:variable name="name-servers" select="name-servers/name"/>
<xsl:call-template name="name-servers-template"/>
<xsl:call-template name="name-servers-template">
<xsl:with-param name="name-servers" select="$name-servers"/>
<xsl:with-param name="size" select="count($name-servers)"/>
</xsl:call-template>
<xsl:call-template name="name-servers-template">
<xsl:with-param name="name-servers" select="$name-servers"/>
<xsl:with-param name="size" select="count($name-servers)"/>
</xsl:call-template>
</xsl:template>
<xsl:template name="name-servers-template">
<xsl:param name="name-servers"/>
<xsl:param name="size" select="0"/>
<output>
<xsl:value-of select="concat('template called with size ', $size)"/>
</output>
</xsl:template>