SLAX 变量概述
SLAX 变量可以存储您可以计算或静态定义的任何值。这包括数据结构、XML 层次结构以及文本和参数的组合。例如,可以将 操作模式命令 的 XML 输出分配给变量,然后访问变量中的层次结构。
您可以定义局部变量和全局变量。如果变量在任何模板之外定义,则它们是全局变量。否则,它们是本地的。全局变量的值可在脚本中的任何位置访问。局部变量的作用域仅限于在其中定义它的模板或代码块。
SLAX 语言版本 1.0 支持使用该语句声明 var 的不可变变量。从 Junos OS 12.2 版开始受支持的 SLAX 语言 1.1 版引入了可变变量,这些变量是使用该 mvar 语句声明的。以下各节将讨论可变变量和不可变变量:
不可变变量
在 SLAX 语言的 1.0 版中,您可以使用语句 var 声明变量。使用该 var 语句声明的变量是不可变的。只有在声明不可变变量时,才能设置该变量的值,之后该值是固定的。
在声明中,变量名称以美元符号 ($) 为前缀,这与 XSLT 声明不同,XSLT 声明中的美元符号不作为元素属性<xsl:variable>值的name前缀。声明变量后,可以使用以美元符号 ($) 为前缀的变量名称在 XPath 表达式中引用该变量。通过在变量名称后面加上等号 (=) 和表达式来初始化变量。
下面的例子声明并初始化变量,然后用来初始化变量locationmessage:
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 中执行操作脚本会在日志文件中生成以下输出。 count 尽管变量必须保持固定, myparam 但每次调用模板都会更新。
1, 1 1, 2 1, 3 1, 4 1, 5
可变变量
Junos OS 12.2 版及更高版本中支持的 SLAX 语言 1.1 版引入了可变变量。与使用该 var 语句声明的变量不同,可变变量的值可以通过脚本修改。您可以在声明可变变量时或在脚本中的任何点设置可变变量的初始值。
您可以使用语句 mvar 声明可变变量。在声明中,变量名称以美元符号 ($) 为前缀。声明可变变量后,可以使用以美元符号 ($) 为前缀的变量名称在 XPath 表达式中引用该变量。通过在变量名称后面加上等号 (=) 和表达式来初始化变量。
下面的示例声明并初始化可变变量,然后用于初始化可变变量locationmessage:
mvar $location = $dot/@location; mvar $message = "We are in " _ $location _ " now.";
可变变量可以在声明后进行初始化或更新。要初始化或更新可变变量的值, set 请使用该语句。下面的示例声明变量 , block并使用元素 <block>对其进行初始化:
mvar $block; set $block = <block> "start here";
对于表示节点集的可变变量,请使用语句将 append 新节点追加到现有节点集。下面的示例创建可变变量,该变量 $mylist由一个 <item> 元素初始化。对于变量中的每个 $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>