このページで
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
宣言します。size
name-servers
size
このパラメータには、デフォルト値がゼロが与えられました。一致テンプレートを宣言して初期化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>