本页内容
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 属性声明参数。(可选)通过包含 select 属性来声明每个参数的默认值,该属性可以包含 XPath 表达式。如果在没有参数的情况下调用模板,则计算默认表达式,并将结果分配给该参数。如果未在模板中定义默认值,则参数默认为空字符串。
以下命名模板 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 值。
传递参数
调用模板时,使用<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参数的默认值,如果没有默认值,则使用空字符串。
<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>
如果调用模板,包含参数并为参数定义值,则模板将使用提供的值。下面的示例使用message参数和定义的值调用命名模板print-host-name,因此模板使用新值。
<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>
下一节调用 report-changed 模板,并为属性定义一个源,该源 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>
其他示例
有关在自动化脚本中使用该 <xsl:param> 元素的完整示例,请参阅以下内容: