本页内容
SLAX 参数概述
参数可以传递给命名或未命名的模板或函数。声明参数后,可以通过在参数名称前面加上美元符号 ($) 来引用它。
声明参数
在 SLAX 脚本中,您可以使用 param
语句声明参数。或者,您可以在声明中为每个参数定义初始值。例如:
param $dot = .;
参数的作用域可以是局部的,也可以是全局的。本地参数必须在块的开头声明,其范围仅限于声明它们的块。必须将值由 Junos OS 在脚本初始化时设置的参数定义为全局参数。全局参数声明位于样式表声明之后。脚本可以为全局参数分配默认值,如果 Junos OS 未为参数指定值,将使用该值。
version 1.2; ns junos = "http://xml.juniper.net/junos/*/junos"; ns xnm = "http://xml.juniper.net/xnm/1.1/xnm"; ns jcs = "http://xml.juniper.net/junos/commit-scripts/1.0"; ns ext = "http://xmlsoft.org/XSLT/namespace"; /* global parameter */ param $interface1 = "fxp0";
在模板中,您可以在参数列表中或使用 param
模板块中的语句来声明参数。或者,您可以声明每个模板参数的默认值。如果在没有参数的情况下调用模板,则该参数使用默认值。如果未在模板中定义默认值,则参数默认为空字符串。
以下命名模板 print-host-name
声明参数 message
并定义默认值:
template print-host-name ($message = "host name: " _ system/host-name) { <xnm:warning> { <message> $message; } }
另一种但等效的声明是:
template print-host-name () { param $message = "host name: " _ system/host-name; <xnm:warning> { <message> $message; } }
在 SLAX 模板中,在声明参数和访问其值时,在参数前面加上美元符号 ($)。在 XSLT 中,在访问参数名称时在参数名称前面加上美元符号,但在声明参数名称时不添加美元符号。
在函数中,您可以在参数列表中或通过使用 param
函数块中的语句来声明参数。或者,您可以声明尾随参数的默认值。如果调用不带该尾随参数的函数,则该参数将使用默认值。如果未定义默认值,则参数值默认为空字符串。
下面的示例定义一个名为 size
的函数,该函数具有三个参数:、 width
height
和 scale
。的scale
默认值为 1。如果函数调用的参数列表不包含该scale
参数,则计算将使用该参数的默认值 1。该函数的返回值是包含在元素中的 <size>
、 height
和scale
变量的width
乘积。
function my:size ($width, $height, $scale = 1) { result <size> { expr $width * $height * $scale; } }
使用语 param
句的替代但等效的声明是:
function my:size () { param $width; param $height; param $scale = 1; result <size> { expr $width * $height * $scale; } }
将参数传递给模板
调用模板时,可以在参数列表中或使用 with
语句将参数传递到模板中。调用环境中提供的参数的名称必须与实际模板中定义的参数的名称匹配。否则,将忽略该参数。或者,对于传递给模板的每个参数,可以使用等号 (=) 和值表达式定义值。在以下示例中,对命名模板 print-host-name
的两次调用完全相同:
match configuration { call print-host-name($message = "passing in host name: " _ system/host-name); } match configuration { call print-host-name() { with $message = "passing in host name: " _ system/host-name; } }
模板中使用的参数值取决于模板的调用方式。以下调用模板的三个示例 print-host-name
说明了可能的调用环境。
如果调用模板但不包含特定参数,则该参数将使用模板中为该参数定义的默认值。如果模板中没有该参数的默认值,则参数值默认为空字符串。以下示例调用命名模板print-host-name
,但在调用中不包含任何参数。在这种情况下,命名模板将使用模板中print-host-name
定义的message
参数的默认值,如果没有默认值,则使用空字符串。
match configuration { call print-host-name(); }
如果调用模板并包含参数,但未在调用环境中为参数定义值,则脚本将传入该参数的当前值(如果该值之前已初始化)。如果从未声明过该参数,则脚本将生成错误。
下面的示例调用命名模板 print-host-name
并传入参数, message
但不包含值。如果脚本声明并初始化 message
,并且作用域对块可见,则模板将使用当前值 message
。如果脚本声明 message
但未初始化参数,则 的 message
值为空字符串。如果脚本未声明 message
,则调用将产生错误。
match configuration { call print-host-name($message); /* If $message was initialized previously, the current value is used; * If $message was declared but not initialized, an empty string is used; * If $message was never declared, the call generates an error. */ }
如果调用模板,包含参数并为参数定义值,则模板将使用提供的值。下面的示例使用message
参数和定义的值调用命名模板print-host-name
,因此模板使用新值:
match configuration { call print-host-name($message = "passing in host name: " _ system/host-name); }
示例:参数和匹配模板
下面的示例匹配顶级 configuration
层次结构元素,然后指示 Junos OS 管理进程 (mgd) 以递归方式将 system/host-name
模板应用于子树。参数 message
和 domain
用于处理任何匹配节点。
match configuration { var $domain = domain-name; apply-templates system/host-name { with $message = "Invalid host-name"; with $domain; } } match host-name { param $message = "Error"; param $domain; <hello> $message _ ":: " _ . _ " (" _ $domain _ ")"; }
XSLT 等效项为:
<xsl:template match="configuration"> <xsl:apply-templates select="system/host-name"> <xsl:with-param name="message" select="'Invalid host-name'"/> <xsl:with-param name="domain" select="$domain"/> </xsl:apply-templates> </xsl:template> <xsl:template match="host-name"> <xsl:param name="message" select="'Error'"/> <xsl:param name="domain"/> <hello> <xsl:value-of select="concat($message, ':: ', ., ' (', $domain, ')')"/> </hello> </xsl:template>
将参数传递给函数
SLAX 支持从 SLAX 版本 1.1 开始的功能。尽管可以使用 param
语句定义函数参数,但不能使用 with
语句将参数值从调用环境传递到函数中。调用函数时,将参数传递到逗号分隔列表中的函数中。函数参数按位置传递给函数,而不是像模板中那样按名称传递给函数。
函数声明可以定义尾随参数的默认值。如果函数调用中的参数少于定义中的参数,则默认值用于任何尾随参数。如果函数调用中的参数多于定义中的参数,则函数调用将生成错误。
在以下匹配模板中,函数调用使用从源 XML 文件中的每个 graphic/dimension
元素中选择的宽度和高度数据。脚本计算函数, copy-of
语句将返回值作为元素的内容 <out>
发出到结果树。函数调用包括 和 width
height
的参数,但不包括 scale
的参数。默认值 1 用于 scale
功能块内。
version 1.2; ns my = "http://www.example.com/myfunctions"; function my:size () { param $width; param $height; param $scale = 1; result <size> { expr $width * $height * $scale; } } match / { for-each (graphic/dimension) { <out> { copy-of my:size((width/.), (height/.)); } } }