SLAX 変数の概要
SLAX 変数は、計算または静的定義できる任意の値を格納できます。これには、データ構造、XML 階層、テキストとパラメーターの組み合わせが含まれます。例えば、 オペレーション・モード・コマンド の XML 出力を変数に割り当て、その変数内の階層にアクセスすることができます。
ローカル変数とグローバル変数の両方を定義できます。変数がテンプレートの外部で定義されている場合、変数はグローバルになります。それ以外の場合は、ローカルです。グローバル変数の値は、スクリプトの任意の場所からアクセスできます。ローカル変数のスコープは、定義されているテンプレートまたはコードブロックに限定されます。
SLAX言語のバージョン1.0は、 ステートメントを使用して宣言される不変な変数を var
サポートしています。Junos OSリリース12.2以降でサポートされているSLAX言語のバージョン1.1には、 ステートメントを mvar
使用して宣言された可変変数が導入されています。変更可能な変数と不変な変数については、以下のセクションで説明します。
不変な変数
SLAX 言語のバージョン 1.0 では、 ステートメントを使用して変数を var
宣言します。ステートメントを使用して var
宣言された変数は不変です。不変な変数の値は、宣言した場合にのみ設定でき、その後、値が固定されます。
宣言では、変数名の先頭にはドル記号 ($) が付けられます。XSLT 宣言とは異なり、ドル記号は要素の属性の値のname
<xsl:variable>
プレフィックスではありません。変数を宣言すると、ドル記号($)でプレフィックスが付いた変数名を使用して、XPath 式内で変数を参照できます。等号(=)と式で変数名に従って変数を初期化します。
次の例では、 変数を宣言して初期化します。この変数 location
は変数の初期化に message
使用されます。
var $location = $dot/@location; var $message = "We are in " _ $location _ " now.";
XSLT と同等の値は次のとおりです。
<xsl:variable name="location" select="$dot/@location"/> <xsl:variable name="message" select="concat('We are in ', $location, ' now.')"/>
ステートメントを使用して var
宣言された変数は不変です。そのため、宣言で初期化された後に変数の値を変更することはできません。変数の値を直接更新することはできませんが、関数を再帰的に呼び出し、変数の値をパラメーターとして渡すことで、エフェクトを模倣できます。例えば:
var $count = 1; match / { call update-count($myparam = $count); } template update-count($myparam) { expr $count _ ", " $myparam _"\n"; if ($myparam != 4) { call update-count($myparam = $myparam + 1) } }
CLI で op スクリプトを実行すると、ログ ファイルに以下の出力が生成されます。変数は count
固定のままである必要がありますが、 myparam
テンプレートへの呼び出しごとに更新されます。
1, 1 1, 2 1, 3 1, 4 1, 5
可変変数
Junos OS リリース 12.2 以降のリリースでサポートされている SLAX 言語のバージョン 1.1 には、可変変数が導入されています。ステートメントを var
使用して宣言された変数とは異なり、変更可能な変数の値はスクリプトによって変更できます。宣言時またはスクリプト内の任意の時点で、変更可能な変数の初期値を設定できます。
ステートメントを使用して、可変変数を mvar
宣言します。宣言では、変数名のプレフィックスはドル記号($)です。変更可能な変数を宣言すると、ドル記号($)でプレフィックスが付いた変数名を使用して、XPath 式内でそれを参照できます。等号(=)と式で変数名に従って変数を初期化します。
次の例では、可変変数を宣言して初期化します。この変数 location
は、変更可能変数 message
の初期化に使用されます。
mvar $location = $dot/@location; mvar $message = "We are in " _ $location _ " now.";
可変変数は、宣言後に初期化または更新できます。可変変数の値を初期化または更新するには、 ステートメントを set
使用します。次の例では、 変数 、 、 block
を宣言し、 要素 <block>
で初期化します。
mvar $block; set $block = <block> "start here";
ノード セットを表す可変変数の場合は、 ステートメントをappend
使用して新しいノードを既存のノード セットに追加します。次の例では、1 つの<item>
要素で初期化される変更可能な変数$mylist
を作成します。変数内の$list
食料品店のアイテムごとに、スクリプトは要素を<item>
ノードセットに$mylist
アイテムの名前とサイズで追加します。
version 1.1; var $list := { <list> { <grocery> { <name> "milk"; <type> "nonfat"; <brand> "any"; <size> "gallon"; } <grocery> { <name> "orange juice"; <type> "no pulp"; <brand> "any"; <size> "half gallon"; } <drugstore>{ <name> "aspirin"; <brand> "any"; <size> "50 tablets"; } } } match / { mvar $mylist; set $mylist = <item> { <name> "coffee"; <size> "1 lb"; } for $item ($list/list/grocery) { append $mylist += <item> { <name> $item/name; <size> $item/size; } } <grocery-short-list> { copy-of $mylist; } }
スクリプトからの出力は次のとおりです。
<?xml version="1.0"?> <grocery-short-list> <item> <name>coffee</name> <size>1 lb</size> </item> <item> <name>milk</name> <size>gallon</size> </item> <item> <name>orange juice</name> <size>half gallon</size> </item> </grocery-short-list>