SLAXステートメントの概要
このセクションでは、一般的に使用されるいくつかの SLAX ステートメントを、簡単な例と XSLT の同等のステートメントと共にリストします。
for-eachステートメント
SLAX for-each ステートメントは、 <xsl:for-each> 要素と同様に機能します。ステートメントは、 for-each キーワード、括弧で区切られた式、および中括弧で区切られたブロックで構成されます。 for-each ステートメントは、一連のノードを集めて 1 つずつ処理するようにプロセッサに指示します。ノードは、指定された XPath 式により選択されます。その後、各ノードは、 for-each コードブロックに保持されている命令に従って処理されます。
for-each (xpath-expression) {
...
}
for-each 命令内のコードは、XPath 式に一致する各ノードに対して再帰的に評価されます。つまり、現在のコンテキストは for-each 句によって選択された各ノードに移動され、処理はその現在のコンテキストに対して相対的に行われます。
次の例では、inventory変数に在庫階層が格納されます。for-each ステートメントは、chassis ノードの子である chassis-module の子である各 chassis-sub-module ノードを再帰的に処理します。指定した部品番号と等しい値を持つpart-numberを含むchassis-sub-module要素ごとに、シャーシ モジュールの名前とシャーシ サブモジュールの名前と説明を含むmessage要素が作成されます。
for-each ($inventory/chassis/chassis-module/
chassis-sub-module[part-number == '750-000610']) {
<message> "Down rev PIC in " _ ../name _ ", " _ name _ ": " _ description;
}
これに相当する XSLT は、以下の通りです。
<xsl:for-each select="$inventory/chassis/chassis-module/
chassis-sub-module[part-number = '750-000610']">
<message>
<xsl:value-of select="concat('Down rev PIC in ', ../name, ', ', name, ': ',
description)"/>
</message>
</xsl:for-each>
if、else if、および else ステートメント
SLAX は、 if、 else if、 else ステートメントをサポートしています。 if ステートメントは、指定された XPath 式が true と評価された場合に命令が処理される条件構造です。 if コンストラクトには 1 つ以上の else if 句が関連付けられており、それぞれが XPath 式をテストします。 if ステートメントの式が false と評価された場合、プロセッサは各 else if 式をチェックします。ステートメントが true と評価された場合、スクリプトは関連するブロック内の命令を実行し、後続の else if ステートメントと else ステートメントをすべて無視します。オプションの else 句は、関連付けられているすべての if 式と else-if 式が false と評価された場合に実行される既定のコードです。すべての if ステートメントと else if ステートメントが false と評価され、 else ステートメントが存在しない場合、アクションは実行されません。
括弧内に表示される式は拡張 XPath 式であり、XPath の 1 つの等号 (=) の代わりに二重等号 (==) をサポートします。
if (expression) {
/* If block Statement */
}
else if (expression) {
/* else if block statement */
}
else {
/* else block statement */
}
スクリプト処理中に、else if または else ステートメントが関連付けられていない if ステートメントは、<xsl:if> 要素に変換されます。else if 句または else 句が存在する場合は、if ステートメントと関連する else if ブロックと else ブロックが <xsl:choose> 要素に変換されます。
if (starts-with(name, "fe-")) {
if (mtu < 1500) {
/* Select Fast Ethernet interfaces with low MTUs */
}
}
else {
if (mtu > 8096) {
/* Select non-Fast Ethernet interfaces with high MTUs */
}
}
これに相当する XSLT は、以下の通りです。
<xsl:choose> <xsl:when test="starts-with(name, 'fe-')"> <xsl:if test="mtu < 1500"> <!-- Select Fast Ethernet interfaces with low MTUs --> </xsl:if> </xsl:when> <xsl:otherwise> <xsl:if test="mtu > 8096"> <!-- Select non-Fast Ethernet interfaces with high MTUs --> </xsl:if> </xsl:otherwise> </xsl:choose>
match ステートメント
基本的な一致テンプレートを指定するには、 match ステートメントを使用し、その後にテンプレートを許可するタイミングを指定する式と、一組の中括弧で囲まれたステートメントのブロックが続きます。
match configuration {
<xnm:error> {
<message> "...";
}
}
これに相当する XSLT は、以下の通りです。
<xsl:template match="configuration"> <xnm:error> <message> ...</message> </xnm:error> </xsl:template>
一致テンプレートの構築の詳細については、「 SLAX テンプレートの概要」を参照してください。
nsステートメント
名前空間の定義は、SLAX ns ステートメントを使用して指定します。これは、 ns キーワード、プレフィックス文字列、等号、および名前空間の Uniform Resource Identifier (URI) で構成されます。既定の名前空間を定義するには、 ns キーワードと名前空間 URI のみを使用します。
ns junos = "https://www.juniper.net/junos/";
nsステートメントは、versionステートメントの後、スタイルシートの先頭または任意のブロックの先頭に記述できます。
ns a = "http://example.com/1";
ns "http://example.com/global";
ns b = "http://example.com/2";
match / {
ns c = "http://example.com/3";
<top> {
ns a = "http://example.com/4";
apply-templates commit-script-input/configuration;
}
}
スタイルシートの先頭に表示される場合、 ns ステートメントには exclude または extension キーワードを含めることができます。キーワードは、 exclude-result-prefixes 属性または extension-element-prefixes 属性に名前空間プレフィックスを追加するようにパーサーに指示します。
ns exclude foo = "http://example.com/foo"; ns extension jcs = "http://xml.juniper.net/jcs";
これに相当する XSLT は、以下の通りです。
<xsl:stylesheet xmlns:foo="http://example.com/foo" xmlns:jcs="http://xml.juniper.net/jcs" exclude-result-prefixes="foo" extension-element-prefixes="jcs"> <!-- ... --> </xsl:stylesheet>
version ステートメント
すべての SLAX スタイル シートは、SLAX 言語のバージョン番号を指定する version ステートメントで始まる必要があります。サポートされているバージョンは、1.0、1.1、1.2 です。
version 1.2;