SLAXパラメータの概要
パラメータは、名前付きテンプレートまたは名前なしテンプレート、または関数に渡すことができます。パラメーターを宣言した後、パラメーター名の前にドル記号 ($) を付けることで、パラメーターを参照できます。
パラメータの宣言
SLAX スクリプトでは、 param
ステートメントを使用してパラメーターを宣言します。必要に応じて、宣言内の各パラメーターの初期値を定義できます。例えば:
param $dot = .;
パラメーターのスコープは、ローカルまたはグローバルです。ローカル パラメーターはブロックの先頭で宣言する必要があり、そのスコープは宣言されているブロックに制限されます。スクリプトの初期化時にJunos OSで値が設定されるパラメータは、グローバルパラメータとして定義する必要があります。グローバルパラメータ宣言は、スタイルシート宣言の直後に配置されます。スクリプトは、グローバル パラメータにデフォルト値を割り当てることができます。これは、Junos OS がパラメータに値を与えない場合に使用されます。
version 1.2; ns junos = "http://xml.juniper.net/junos/*/junos"; ns xnm = "http://xml.juniper.net/xnm/1.1/xnm"; ns jcs = "http://xml.juniper.net/junos/commit-scripts/1.0"; ns ext = "http://xmlsoft.org/XSLT/namespace"; /* global parameter */ param $interface1 = "fxp0";
テンプレートでは、パラメーター リストでパラメーターを宣言するか、テンプレート ブロックで param
ステートメントを使用してパラメーターを宣言します。必要に応じて、各テンプレート パラメーターの既定値を宣言できます。パラメーターを指定せずにテンプレートを呼び出すと、パラメーターは既定値を使用します。テンプレートでデフォルト値を定義しない場合、パラメータはデフォルトで空の文字列になります。
次の名前付きテンプレート print-host-name
は、パラメーター message
を宣言し、既定値を定義します。
template print-host-name ($message = "host name: " _ system/host-name) { <xnm:warning> { <message> $message; } }
代替の、しかし同等の宣言は、次のとおりです。
template print-host-name () { param $message = "host name: " _ system/host-name; <xnm:warning> { <message> $message; } }
SLAX テンプレートでは、パラメーターを宣言するとき、およびパラメーターの値にアクセスするときに、パラメーターの前にドル記号 ($) を付けます。XSLT では、パラメーター名にアクセスするときにパラメーター名の前にドル記号を付けますが、宣言するときには付きません。
関数では、パラメーター リストでパラメーターを宣言するか、関数ブロックで param
ステートメントを使用してパラメーターを宣言します。必要に応じて、末尾パラメーターの既定値を宣言できます。その末尾パラメーターを指定せずに関数を呼び出すと、パラメーターは既定値を使用します。既定値を定義しない場合、パラメーター値は既定で空の文字列になります。
次の例では、width
、height
、scale
の 3 つのパラメーターを持つ size
という名前の関数を定義します。scale
のデフォルト値は 1 です。関数呼び出しの引数リストに scale
引数が含まれていない場合、計算ではその引数に既定値の 1 が使用されます。関数の戻り値は、<size>
要素で囲まれた width
、height
、および scale
変数の積です。
function my:size ($width, $height, $scale = 1) { result <size> { expr $width * $height * $scale; } }
param
ステートメントを使用する代替の同等の宣言は、次のとおりです。
function my:size () { param $width; param $height; param $scale = 1; result <size> { expr $width * $height * $scale; } }
テンプレートへのパラメータの受け渡し
テンプレートを呼び出すときは、引数リストで、または with
ステートメントを使用して、テンプレートに引数を渡します。呼び出し元の環境で指定されるパラメーターの名前は、実際のテンプレートで定義されているパラメーターの名前と一致する必要があります。それ以外の場合、パラメータは無視されます。必要に応じて、テンプレートに渡すパラメーターごとに、等号 (=) と値式を使用して値を定義できます。次の例では、名前付きテンプレート print-host-name
への 2 つの呼び出しは同一です。
match configuration { call print-host-name($message = "passing in host name: " _ system/host-name); } match configuration { call print-host-name() { with $message = "passing in host name: " _ system/host-name; } }
テンプレートで使用されるパラメーター値は、テンプレートの呼び出し方法によって異なります。 print-host-name
テンプレートを呼び出す次の 3 つの例は、考えられる呼び出し環境を示しています。
テンプレートを呼び出し、特定のパラメーターを含めない場合、パラメーターは、そのパラメーターのテンプレートで定義されている既定値を使用します。テンプレートにそのパラメーターの既定値がない場合、パラメーター値の既定値は空の文字列になります。次の例では、名前付きテンプレートprint-host-name
を呼び出しますが、呼び出しにはパラメーターを含めません。この場合、名前付きテンプレートは、print-host-name
テンプレートで定義された message
パラメーターの既定値を使用するか、既定値が存在しない場合は空の文字列を使用します。
match configuration { call print-host-name(); }
テンプレートを呼び出し、パラメーターを含めるが、呼び出し元の環境でパラメーターの値を定義しない場合、スクリプトはパラメーターの現在の値を渡します (パラメーターが以前に初期化されている場合)。パラメーターが宣言されていない場合、スクリプトはエラーを生成します。
次の例では、名前付きテンプレート print-host-name
を呼び出し、 message
パラメーターを渡しますが、値は含めません。スクリプトが message
を宣言して初期化し、スコープがブロックから見える場合、テンプレートは現在の値 message
を使用します。スクリプトで message
が宣言されているが、パラメーターが初期化されていない場合、 message
の値は空の文字列になります。スクリプトで message
が宣言されていない場合、呼び出しはエラーを生成します。
match configuration { call print-host-name($message); /* If $message was initialized previously, the current value is used; * If $message was declared but not initialized, an empty string is used; * If $message was never declared, the call generates an error. */ }
テンプレートを呼び出し、パラメーターを含め、パラメーターの値を定義すると、テンプレートは指定された値を使用します。次の例では、message
パラメーターと定義された値を使用して名前付きテンプレート print-host-name
を呼び出すため、テンプレートは新しい値を使用します。
match configuration { call print-host-name($message = "passing in host name: " _ system/host-name); }
例:パラメータと一致テンプレート
次の例では、最上位 configuration
階層要素を照合し、 system/host-name
サブツリーにテンプレートを再帰的に適用するようにJunos OS管理プロセス(mgd)に指示します。パラメーター message
と domain
は、一致するノードの処理に使用されます。
match configuration { var $domain = domain-name; apply-templates system/host-name { with $message = "Invalid host-name"; with $domain; } } match host-name { param $message = "Error"; param $domain; <hello> $message _ ":: " _ . _ " (" _ $domain _ ")"; }
これに相当する XSLT は、以下の通りです。
<xsl:template match="configuration"> <xsl:apply-templates select="system/host-name"> <xsl:with-param name="message" select="'Invalid host-name'"/> <xsl:with-param name="domain" select="$domain"/> </xsl:apply-templates> </xsl:template> <xsl:template match="host-name"> <xsl:param name="message" select="'Error'"/> <xsl:param name="domain"/> <hello> <xsl:value-of select="concat($message, ':: ', ., ' (', $domain, ')')"/> </hello> </xsl:template>
関数へのパラメーターの引き渡し
SLAX は、SLAX バージョン 1.1 以降の機能をサポートしています。 param
ステートメントを使用して関数パラメーターを定義することはできますが、 with
ステートメントを使用して呼び出し元の環境から関数にパラメーター値を渡すことはできません。関数を呼び出すときは、コンマ区切りのリストで関数に引数を渡します。関数の引数は、テンプレートのように名前ではなく、位置によって関数に渡されます。
関数宣言では、末尾の引数の既定値を定義できます。関数呼び出しの引数が定義の引数よりも少ない場合は、末尾の引数に既定値が使用されます。関数呼び出しに定義よりも多くの引数がある場合、関数呼び出しはエラーを生成します。
次の一致テンプレートでは、関数呼び出しで、ソース XML ファイルの各 graphic/dimension
要素から選択された幅と高さのデータを使用します。スクリプトは関数を評価し、 copy-of
ステートメントは戻り値を <out>
要素の内容として結果ツリーに出力します。関数呼び出しには、 width
と height
の引数が含まれますが、 scale
の引数は含まれません。デフォルト値の 1 は、機能ブロック内の scale
に使用されます。
version 1.2; ns my = "http://www.example.com/myfunctions"; function my:size () { param $width; param $height; param $scale = 1; result <size> { expr $width * $height * $scale; } } match / { for-each (graphic/dimension) { <out> { copy-of my:size((width/.), (height/.)); } } }