Help us improve your experience.

Let us know what you think.

Do you have time for a two-minute survey?

 
 

XSLT 参数概述

参数可以传递给命名或未命名的模板。在模板中,必须声明参数,然后可以通过在其名称前面加上美元符号 ($) 来引用参数。

声明参数

参数的作用域可以是全局的,也可以是局部的。必须将值由 Junos OS 在脚本初始化时设置的参数定义为全局参数。全局参数声明位于样式表声明之后。脚本可以为全局参数分配默认值,如果 Junos OS 未为参数指定值,将使用该值。

本地参数必须在块的开头声明,其范围仅限于声明它们的块。在模板中,您可以使用 <xsl:param> 标记和 name 属性声明参数。(可选)通过包含 select 属性来声明每个参数的默认值,该属性可以包含 XPath 表达式。如果在没有参数的情况下调用模板,则计算默认表达式,并将结果分配给该参数。如果未在模板中定义默认值,则参数默认为空字符串。

以下命名模板 print-host-name 声明参数 message 并定义默认值:

模板通过在参数名称前面加上美元符号 ($) 来访问参数的 message 值。

传递参数

调用模板时,使用<xsl:with-param>元素和name属性将参数传递到模板中。属性的<xsl:with-param>name值必须与实际模板中定义的参数的名称匹配;否则将忽略该参数。或者,对于传递给模板的每个参数,可以使用元素的属性或内容<xsl:with-param>定义值select

模板中使用的参数值取决于模板的调用方式。以下调用模板的三个示例 print-host-name 说明了可能的调用环境。

如果调用模板,但不包含特定参数的<xsl:with-param>元素,则计算模板中定义的默认表达式,并将结果分配给参数。如果模板中没有该参数的默认值,则该参数默认为空字符串。以下示例调用命名模板print-host-name,但在调用中不包含任何参数。在这种情况下,命名模板将使用模板中print-host-name定义的message参数的默认值,如果没有默认值,则使用空字符串。

如果调用模板并包含参数,但未在调用环境中为参数定义值,则脚本将传入参数的当前值(如果之前已初始化),则脚本将传入该参数的当前值,如果从未声明该参数,则将生成错误。下面的示例调用命名模板 print-host-name 并传入 message 参数,但不包含值。如果 message 在脚本中声明并初始化,并且范围对块可见,则使用当前值 。 message 如果 message 在脚本中声明但未初始化,则 的 message 值将为空字符串。如果 message 尚未声明,则脚本将生成错误。

如果调用模板,包含参数并为参数定义值,则模板将使用提供的值。下面的示例使用message参数和定义的值调用命名模板print-host-name,因此模板使用新值。

示例:参数和匹配模板

以下模板匹配 /,即 XML 文档的根目录。然后,它会生成一个名为 <outside>的元素,该元素将添加到输出文档中,并指示 Junos OS 管理进程 (mgd) 以递归方式将configuration/system模板应用于子树。该参数host用于处理任何匹配节点。参数的host值是位于配置层次结构的 [edit system] 级别的语句的值host-name

以下模板与元素匹配<system>,该元素是在上一示例中选择的子树的顶部。声明的host参数没有默认值。将生成一个<inside>元素,其中包含在上一示例中的标记中<xsl:with-param>定义的host参数的值。

示例:参数和命名模板

以下命名模板 report-changed 声明了两个参数: dot,默认为当前节点,以及 changed,默认为 changed 节点 dot的属性。

下一节调用 report-changed 模板,并为属性定义一个源,该源 changed 与模板中 report-changed 定义的默认源不同。 report-changed 调用模板时,它将使用属性的新定义源 changed 来代替默认源。

同样,模板调用可以包含 dot 参数并定义默认当前节点以外的源,如下所示: