10. XPath函数
本文档定义了两个通用的XPath函数和五个YANG类型特定的XPath函数。 函数签名用[XPATH]中使用的语法指定。
10.1. 节点集函数
10.1.1. current()
node-set current()
current()函数不接受任何输入参数,并返回以初始上下文节点为唯一成员的节点集。
10.1.2. 使用示例
现在有一个列表
list interface {
key "name";
...
leaf enabled {
type boolean;
}
...
}
以下叶定义了一个“must”表达式,确保引用的接口被启用:
leaf outgoing-interface {
type leafref {
path "/interface/name";
}
must '/interface[name=current()]/enabled = "true"';
}
10.2. 字符串函数
10.2.1. re-match()
boolean re-match(string subject, string pattern)
如果“subject”字符串匹配正则表达式“pattern”,则re-match()函数返回“true”。 否则,返回“false”。
re-match()函数检查字符串是否与给定的正则表达式匹配。 使用的正则表达式是XML模式正则表达式[XSD-TYPES]。 请注意,这包括正则表达式在头部和尾部的隐式锚定。
10.2.1.1. 使用示例
表达式如下:
re-match("1.22.333", "\d{1,3}\.\d{1,3}\.\d{1,3}")
返回“true”。
要计算所有名为eth0。<number>的逻辑接口,请执行以下操作:
count(/interface[re-match(name, "eth0\.\d+")])
10.3. YANG类型“leafref”和“instance-identifier"”的函数
10.3.1. deref()
node-set deref(node-set nodes)
deref()函数遵循第一个节点在参数“nodes”中以文档顺序定义的引用,并返回它引用的节点。
如果第一个参数节点的类型是“instance-identifier”,则该函数返回一个包含实例标识符引用的单个节点(如果存在)的节点集。 如果不存在这样的节点,则返回空的节点集合。
如果第一个参数节点的类型为“leafref”,则该函数将返回一个包含leafref引用的节点的节点集。 具体来说,这个集合包含由leafref的“path”语句(第9.9.2节)选择的节点,它们与第一个参数节点具有相同的值。
如果第一个参数节点是任何其他类型,则返回空节点集。
10.3.1.1. 使用示例
list interface {
key "name type";
leaf name { ... }
leaf type { ... }
leaf enabled {
type boolean;
}
...
}
container mgmt-interface {
leaf name {
type leafref {
path "/interface/name";
}
}
leaf type {
type leafref {
path "/interface[name=current()/../name]/type";
}
must 'deref(.)/../enabled = "true"' {
error-message
"The management interface cannot be disabled.";
}
}
}
10.4. YANG类型的“identityref”函数
10.4.1. derived-from()
boolean derived-from(node-set nodes, string identity)
如果参数“nodes”中的任何节点是“identityref”类型的节点,并且其值是从(参见第7.18.2节)派生的标识,则derived-from()函数返回“true”; 否则,返回“false”。
参数“identity”是与第14节中的“identifier-ref”规则相匹配的字符串。如果前缀存在于标识中,则它指的是在导入了该前缀的模块中定义的标识,如果前缀与本地模块的前缀匹配,那么该标识将在该模块中定义。 如果不存在前缀,则标识是指在当前模块或包含的子模块中定义的标识。
10.4.1.1. 使用示例
module example-interface {
yang-version 1.1;
...
identity interface-type;
identity ethernet {
base interface-type;
}
identity fast-ethernet {
base ethernet;
}
identity gigabit-ethernet {
base ethernet;
}
list interface {
key name;
...
leaf type {
type identityref {
base interface-type;
}
}
...
}
augment "/interface" {
when 'derived-from(type, "exif:ethernet")';
// generic Ethernet definitions here
}
...
}
10.4.2. derived-from-or-self()
boolean derived-from-or-self(node-set nodes, string identity)
如果参数“nodes”中的任何节点是“identityref”类型的节点,并且其值是等于或来源于其的标识,则derived-from-or-self()函数将返回“true”(请参阅第7.18.2节)身份“identity”; 否则,返回“false”。
参数“identity”是与第14节中的“identifier-ref”规则相匹配的字符串。如果前缀存在于标识中,则它指的是在导入了该前缀的模块中定义的标识,如果前缀与本地模块的前缀匹配,那么该标识将在该模块中定义。 如果不存在前缀,则标识是指在当前模块或包含的子模块中定义的标识。
使用示例
第10.4.1.1节定义的模块也可能有:
augment "/interface" {
when 'derived-from-or-self(type, "exif:fast-ethernet");
// Fast-Ethernet-specific definitions here
}
10.5. YANG类型“enumeration”函数
10.5.1. enum-value()
number enum-value(node-set nodes)
enum-value()函数检查参数“nodes”中文档顺序中的第一个节点是否为“enumeration”类型的节点,并返回枚举的整数值。 如果“nodes”节点集为空,或者“nodes”中的第一个节点不是“enumeration”类型,则返回NaN(不是数字)。
10.5.1.1. 使用示例
有了这个数据模型:
list alarm {
...
leaf severity {
type enumeration {
enum cleared {
value 1;
}
enum indeterminate {
value 2;
}
enum minor {
value 3;
}
enum warning {
value 4;
}
enum major {
value 5;
}
enum critical {
value 6;
}
}
}
}
以下XPath表达式仅选择严重性为“major”或更高的警报:
/alarm[enum-value(severity) >= 5]
10.6. YANG类型的“bits”函数
10.6.1. bit-is-set()
boolean bit-is-set(node-set nodes, string bit-name)
如果参数“nodes”中的文档顺序中的第一个节点是“bits”类型的节点,并且其值设置了“bit-name”位,则bit-is-set()函数返回“true” 否则,返回“false”。
10.6.1.1. 使用示例
如果一个接口有这个叶子:
leaf flags {
type bits {
bit UP;
bit PROMISCUOUS
bit DISABLED;
}
}
可以使用以下XPath表达式来选择带有UP标志的所有接口:
/interface[bit-is-set(flags, "UP")]