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 支持ifelse 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;