示例提交脚本的逐行说明
对 SONET/SDH 接口应用更改
以下 XSLT 提交脚本会对名称以 so-
开头的每个接口应用瞬时更改,将封装设置为 ppp
。有关瞬时更改的信息,请参阅 使用提交脚本生成持久或瞬时配置更改的概述。有关此示例的 SLAX 版本,请参阅 示例:生成瞬时更改。
1 <?xml version="1.0"?> 2 <xsl:stylesheet version="1.0" 3 xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 4 xmlns:junos="http://xml.juniper.net/junos/*/junos" 5 xmlns:xnm="http://xml.juniper.net/xnm/1.1/xnm" 6 xmlns:jcs="http://xml.juniper.net/junos/commit-scripts/1.0"> 7 <xsl:import href="../import/junos.xsl"/> 8 <xsl:template match="configuration"> 9 <xsl:for-each select="interfaces/interface[starts-with(name, 'so-') \ and unit/family/inet]"> 10 <transient-change> 11 <interfaces> 12 <interface> 13 <name><xsl:value-of select="name"/></name> 14 <encapsulation>ppp</encapsulation> 15 </interface> 16 </interfaces> 17 </transient-change> 18 </xsl:for-each> 19 </xsl:template> 20 </xsl:stylesheet>
第 1 行到 8 行是 提交脚本所需的样板 ,为简洁起因,此处省略了一些样板。
第 9 行是一个 <xsl:for-each>
编程指令,用于检查名称以“so-”开头且已在 family inet
任意逻辑单元上启用的每个接口节点。(此处显示两行,只是为了简洁性。)
9 <xsl:for-each select="interfaces/interface[starts-with(name, 'so-') \ and unit/family/inet]">
第 10 行是瞬时更改的开放式标记。该元素可能的内容<transient-change>
与 Junos XML 协议操作<load-configuration>
中标记元素的内容<configuration>
相同。
10 <transient-change>
第 11 行到 16 行表示瞬态更改的内容。封装设置为 ppp
。
11 <interfaces> 12 <interface> 13 <name><xsl:value-of select="name"/></name> 14 <encapsulation>ppp</encapsulation> 15 </interface> 16 </interfaces>
第 17 行到第 19 行关闭此模板中的所有打开标记。
17 </transient-change> 18 </xsl:for-each> 19 </xsl:template>
第 20 行关闭样式表和提交脚本。
20 </xsl:stylesheet>
对支持 ISO 的接口应用更改
以下示例 XSLT 脚本可确保为国际标准组织 (ISO) 协议启用的接口也已启用 MPLS,并且包含在 [edit protocols mpls interface]
层次结构级别。有关此示例的 SLAX 版本,请参阅 示例:控制 IS-IS 和 MPLS 接口。
1 <?xml version="1.0"?> 2 <xsl:stylesheet version="1.0" 3 xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 4 xmlns:junos="http://xml.juniper.net/junos/*/junos" 5 xmlns:xnm="http://xml.juniper.net/xnm/1.1/xnm" 6 xmlns:jcs="http://xml.juniper.net/junos/commit-scripts/1.0"> 7 <xsl:import href="../import/junos.xsl"/> 8 <xsl:template match="configuration"> 9 <xsl:variable name="mpls" select="protocols/mpls"/> 10 <xsl:for-each select="interfaces/interface/unit[family/iso]"> 11 <xsl:variable name="ifname" select="concat(../name, '.', name)"/> 12 <xsl:if test="not(family/mpls)"> 13 <xsl:call-template name="jcs:emit-change"> 14 <xsl:with-param name="message"> 15 <xsl:text> 16 Adding 'family mpls' to ISO-enabled interface 17 </xsl:text> 18 </xsl:with-param> 19 <xsl:with-param name="content"> 20 <family> 21 <mpls/> 22 </family> 23 </xsl:with-param> 24 </xsl:call-template> 25 </xsl:if> 26 <xsl:if test="$mpls and not($mpls/interface[name = $ifname])"> 27 <xsl:call-template name="jcs:emit-change"> 28 <xsl:with-param name="message"> 29 <xsl:text>Adding ISO-enabled interface </xsl:text> 30 <xsl:value-of select="$ifname"/> 31 <xsl:text> to [protocols mpls]</xsl:text> 32 </xsl:with-param> 33 <xsl:with-param name="dot" select="$mpls"/> 34 <xsl:with-param name="content"> 35 <interface> 36 <name> 37 <xsl:value-of select="$ifname"/> 38 </name> 39 </interface> 40 </xsl:with-param> 41 </xsl:call-template> 42 </xsl:if> 43 </xsl:for-each> 44 </xsl:template> 45 </xsl:stylesheet>
第 1 行到 8 行是 提交脚本所需的样板 ,为简洁起因,此处省略了一些样板。
第 9 行保存对 [edit protocols mpls]
层次结构级别的引用,以便在以下 for-each
循环中引用。
9 <xsl:variable name="mpls" select="protocols/mpls"/>
第 10 行检查启用了 ISO 的每个接口单元(逻辑接口)。停止select
在 ,unit
但谓词将选择限制为包含元素下嵌套元素的<family>
单元<iso>
。
10 <xsl:for-each select="interfaces/interface/unit[family/iso]">
第 11 行在变量中构建接口名称。首先,name
变量声明的属性设置为ifname
。在 Junos OS 中,接口名称是设备名称、句点和单元编号的串联。此时,脚本中的上下文节点是单元号,因为第 10 行将上下文更改为接口/接口/单元。<name>
指的是../name
上下文节点的父节点的元素,即设备名称 (type-fpc/pic/port)。XPath 表达式中的“name
”标记指的是<name>
上下文节点的元素,即单元号 (unit-number
)。执行串联后,第 11 行中的 XPath 表达式将解析为 type-fpc/pic/port.unit-number。当第 10 行中的<xsl:for-each>
指令遍历层次结构并找到支持 ISO 的接口时,接口名称将递归存储在变量中ifname
。
11 <xsl:variable name="ifname" select="concat(../name, '.', name)"/>
对于未启用 MPLS 的每个支持 ISO 的接口,第 12 行的评估为真。
12 <xsl:if test="not(family/mpls)">
第 13 行调用该 jcs:emit-change
模板,这是 junos.xsl 文件中的一个帮助或便利模板。发射 更改模板(SLAX 和 XSLT)和emit_change (Python) 中讨论了此模板。
13 <xsl:call-template name="jcs:emit-change">
第 14 行到 18 行使用 message
模板中的 jcs:emit-change
参数。消息参数是可以使用的快捷键,而不是显式包括 <warning>
、 <edit-path>
和 <statement>
元素。
14 <xsl:with-param name="message"> 15 <xsl:text> 16 Adding 'family mpls' to ISO-enabled interface 17 </xsl:text> 18 </xsl:with-param>
第 19 行到第 23 行使用 content
模板中的 jcs:emit-change
参数。参数 content
用于指定要对当前上下文节点的更改。
19 <xsl:with-param name="content"> 20 <family> 21 <mpls/> 22 </family> 23 </xsl:with-param>
第 24 行和第 25 行分别关闭在第 13 行和第 12 行中打开的标记。
24 </xsl:call-template> 25 </xsl:if>
Line 26 测试 MPLS 是否已启用以及是否未在 [edit protocols mpls interface]
层次结构级别上配置此接口。
26 <xsl:if test="$mpls and not($mpls/interface[name = $ifname])">
第 27 行到第 41 行包含该模板的另一个调用 jcs:emit-change
。在此调用中,接口添加在 [edit protocols mpls interface]
层次结构级别。
27 <xsl:call-template name="jcs:emit-change"> 28 <xsl:with-param name="message"> 29 <xsl:text>Adding ISO-enabled interface </xsl:text> 30 <xsl:value-of select="$ifname"/> 31 <xsl:text> to [edit protocols mpls]</xsl:text> 32 </xsl:with-param> 33 <xsl:with-param name="dot" select="$mpls"/> 34 <xsl:with-param name="content"> 35 <interface> 36 <name> 37 <xsl:value-of select="$ifname"/> 38 </name> 39 </interface> 40 </xsl:with-param> 41 </xsl:call-template>
42 至 45 行关闭所有开放元素。
42 </xsl:if> 43 </xsl:for-each> 44 </xsl:template> 45 </xsl:stylesheet>