SLAX 语句概述
本节列出了一些常用的 SLAX 语句,以及简要示例和 XSLT 等效项。
for-each 语句
SLAX for-each
语句的功能与元素类似 <xsl:for-each>
。语句由 for-each
关键字、括号分隔的表达式和大括号分隔的块组成。该 for-each
语句告诉处理器将一组节点聚集在一起并逐个处理它们。节点由指定的 XPath 表达式选择。然后根据代码块中的 for-each
指令对每个节点进行处理。
for-each (xpath-expression) { ... }
对于与 XPath 表达式匹配的每个节点,对指令中的 for-each
代码进行递归计算。也就是说,当前上下文被移动到子句选择 for-each
的每个节点,并且处理是相对于该当前上下文进行的。
在以下示例中,该 inventory
变量存储库存层次结构。该 for-each
语句递归处理 chassis-sub-module
作为 chassis-module
节点子节点的每个节点,该节点是节点的 chassis
子节点。 chassis-sub-module
对于每个包含 part-number
值等于指定部件号的元素, message
将创建一个元素,其中包含机箱模块的名称以及机箱子模块的名称和说明。
for-each ($inventory/chassis/chassis-module/ chassis-sub-module[part-number == '750-000610']) { <message> "Down rev PIC in " _ ../name _ ", " _ name _ ": " _ description; }
XSLT 等效项为:
<xsl:for-each select="$inventory/chassis/chassis-module/ chassis-sub-module[part-number = '750-000610']"> <message> <xsl:value-of select="concat('Down rev PIC in ', ../name, ', ', name, ': ', description)"/> </message> </xsl:for-each>
if、else if 和 else 语句
SLAX 支持if
else if
、 和else
语句。该if
语句是一个条件结构,如果指定的 XPath 表达式的计算结果为 true,则将导致处理指令。该if
构造可以有一个或多个关联else if
的子句,每个子句都测试一个 XPath 表达式。如果语句中的if
表达式的计算结果为 false,则处理器将检查每个else if
表达式。如果语句的计算结果为 true,则脚本将执行关联块中的指令,并忽略所有后续else if
的 和 else
语句。可选else
语句是在所有关联if
的表达else-if
式的计算结果均为 false 时执行的默认代码。如果所有 和 if
else if
语句的计算结果均为 false,且该else
语句不存在,则不执行任何操作。
括号中显示的表达式是扩展的 XPath 表达式,它支持用双等号 (==
) 代替 XPath 的单等号 (=
)。
if (expression) { /* If block Statement */ } else if (expression) { /* else if block statement */ } else { /* else block statement */ }
在脚本处理过程中,if
没有关联else if
或else
语句的语句将转换为元素<xsl:if>
。else if
如果存在 或 else
子句,则语句和关联else if
的 if
和 else
块将转换为元素<xsl:choose>
。
if (starts-with(name, "fe-")) { if (mtu < 1500) { /* Select Fast Ethernet interfaces with low MTUs */ } } else { if (mtu > 8096) { /* Select non-Fast Ethernet interfaces with high MTUs */ } }
XSLT 等效项为:
<xsl:choose> <xsl:when test="starts-with(name, 'fe-')"> <xsl:if test="mtu < 1500"> <!-- Select Fast Ethernet interfaces with low MTUs --> </xsl:if> </xsl:when> <xsl:otherwise> <xsl:if test="mtu > 8096"> <!-- Select non-Fast Ethernet interfaces with high MTUs --> </xsl:if> </xsl:otherwise> </xsl:choose>
match 语句
您可以使用 match
语句指定基本匹配模板,后跟一个指定何时应允许使用模板的表达式,以及用一组大括号括起来的语句块。
match configuration { <xnm:error> { <message> "..."; } }
XSLT 等效项为:
<xsl:template match="configuration"> <xnm:error> <message> ...</message> </xnm:error> </xsl:template>
有关构造匹配模板的详细信息,请参阅 SLAX 模板概述。
ns 语句
使用 SLAX ns
语句指定命名空间定义。它由 ns
关键字、前缀字符串、等号和命名空间 统一资源标识符 (URI) 组成。要定义默认命名空间,请仅 ns
使用关键字和命名空间 URI。
ns junos = "https://www.juniper.net/junos/";
语 ns
句可以出现在语句之后 version
的样式表开头或任何块的开头。
ns a = "http://example.com/1"; ns "http://example.com/global"; ns b = "http://example.com/2"; match / { ns c = "http://example.com/3"; <top> { ns a = "http://example.com/4"; apply-templates commit-script-input/configuration; } }
当它出现在样式表的开头时, ns
语句可以包含 exclude
或 extension
关键字。关键字指示分析器将命名空间前缀添加到 exclude-result-prefixes
or extension-element-prefixes
属性。
ns exclude foo = "http://example.com/foo"; ns extension jcs = "http://xml.juniper.net/jcs";
XSLT 等效项为:
<xsl:stylesheet xmlns:foo="http://example.com/foo" xmlns:jcs="http://xml.juniper.net/jcs" exclude-result-prefixes="foo" extension-element-prefixes="jcs"> <!-- ... --> </xsl:stylesheet>
version 语句
所有 SLAX 样式表都必须以 version
语句开头,该语句指定 SLAX 语言的版本号。支持的版本包括 1.0、1.1 和 1.2。
version 1.2;