在此页面上
XSLT 参数概述
参数可传递至指定或未命名的模板。在模板内,必须声明参数,然后可以通过使用美元标志 ($) 预先配置其名称来引用参数。
声明参数
参数的范围可以是全局的,也可以是本地的。Junos OS 在脚本初始化时设置值的参数必须定义为全局参数。全局参数声明仅在样式表声明后进行。如果 Junos OS 未为该参数提供值,则脚本可为全局参数分配默认值。
<?xml version="1.0" standalone="yes"?> <xsl stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:junos="http://xml.juniper.net/junos/*/junos" xmlns:xnm="http://xml.juniper.net/xnm/1.1/xnm" xmlns:jcs="http://xml.juniper.net/junos/commit-scripts/1.0" xmlns:ext="http://xmlsoft.org/XSLT/namespace" version="1.0"> <!-- global parameter --> <xsl:param name="interface1"/>
必须在块开始时声明本地参数,其范围仅限于声明块的块。在模板中,您可使用<xsl:param>
标记和name
属性声明参数。或者,通过包含可包含 XPath 表达式的属性来声明每个参数的select
默认值。如果在未使用参数的情况下调用了模板,则评估默认表达式,并将结果分配给参数。如果不在模板中定义默认值,参数将默认为空字符串。
以下命名模 print-host-name
板将声明参数 message
并定义默认值:
<xsl:template name="print-host-name"> <xsl:param name="message" select="concat('host-name: ', system/host-name)"/> <xsl:value-of select="$message"/> </xsl:template>
该模板通过使用美元标志 ($) 前缀参数名称来访问参数值 message
。
传递参数
调用模板时,使用元素和name
属性将参数传递到模板中<xsl:with-param>
。属性的<xsl:with-param>
name
值必须与实际模板中定义的参数名称匹配;否则参数将忽略。或者,对于传递至模板的每一个参数,您可以使用select
属性或元素的内容<xsl:with-param>
来定义值。
在模板中使用的参数值取决于模板的调用方式。以下三个称为 print-host-name
模板的示例说明了可能的呼叫环境。
如果称为模板,但不包括<xsl:with-param>
特定参数的元素,则评估模板中定义的默认表达式,并将结果分配给参数。如果模板中没有该参数的默认值,参数将默认为空字符串。以下示例称为命名模板,print-host-name
但呼叫中不包含任何参数。在这种情况下,命名的模板将为模板中print-host-name
定义的message
参数使用默认值,或者在不存在默认情况下使用空字符串。
<xsl:template match="configuration"> <xsl:call-template name="print-host-name"/> </xsl:template>
如果调用模板并包含一个参数,但未定义呼叫环境中参数的值,则脚本将在之前初始化时在参数的当前值中传递,或者在参数从未被宣布时生成错误。以下示例调用指定模板 print-host-name
并在参数中 message
通过,但不包括值。如果 message
在脚本中声明并初始化,并且该块可看到范围,则使用当前的 message
值。如果 message
在脚本中声明但未初始化,则该值 message
将是一个空字符串。如果 message
尚未申报,则脚本将生成错误。
<xsl:template match="configuration"> <xsl:call-template name="print-host-name"> <xsl:with-param name="message"/> </xsl:call-template> </xsl:template>
如果称为模板,包括参数并定义参数值,则该模板将使用所提供的值。以下示例将命名模板print-host-name
message
称为参数和定义值,因此模板使用新值。
<xsl:template match="configuration"> <xsl:call-template name="print-host-name"> <xsl:with-param name="message" select=concat"('Host-name passed in: ', system/host-name)"/> </xsl:call-template> </xsl:template>
示例:参数和匹配模板
以下模板匹配/
,XML 文档的根部。然后生成一个名为 <outside>
的元素,该元素会添加到输出文档中,并指示 Junos OS 管理流程 (mgd) 递归地将模板应用到configuration/system
子树上。该参数host
用于处理任何匹配节点。参数的host
值是配置层次结构的 [edit system
] 级别上的语句值host-name
。
<xsl:template match="/"> <outside> <xsl:apply-templates select="configuration/system"> <xsl:with-param name="host" select="configuration/system/host-name"/> </xsl:apply-templates> </outside> </xsl:template>
以下模板与元素匹配<system>
,该元素是上一个示例中选择的子树的顶部。该host
参数在未默认值下申报。生成一个元素,其中包含在上一<inside>
个示例中的标记中<xsl:with-param>
定义的参数值host
。
<xsl:template match="system"> <xsl:param name="host"/> <inside> <xsl:value-of select="$host"/> </inside> </xsl:template>
示例:参数和命名模板
以下命名模 report-changed
板声明两个参数: dot
默认用于当前节点,且 changed
默认用于 changed
节点 dot
属性。
<xsl:template name="report-changed"> <xsl:param name="dot" select="."/> <xsl:param name="changed" select="$dot/@changed"/> <!-- ... --> </xsl:template>
下一changed
节称为模板,report-changed
并定义不同于模板中report-changed
定义的默认来源的属性源。report-changed
调用模板时,它将使用新定义的源来changed
代替默认源的属性。
<xsl:template match="system"> <xsl:call-template name="report-changed"> <xsl:with-param name="changed" select="../@changed"/> </xsl:call-template> </xsl:template>
同样,模板调用可以包括参数 dot
并定义默认电流节点以外的源,如这里所示:
<xsl:template match="system"> <xsl:call-template name="report-changed"> <xsl:with-param name="dot" select="../../> </xsl:call-template> </xsl:template>