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>