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;