10. XPath函数

本文档定义了两个通用的XPath函数和五个YANG类型特定的XPath函数。 函数签名用[XPATH]中使用的语法指定。

10.1. 节点集函数

10.1.1. current()

  1. node-set current()

current()函数不接受任何输入参数,并返回以初始上下文节点为唯一成员的节点集。

10.1.2. 使用示例

现在有一个列表

  1. list interface {
  2. key "name";
  3. ...
  4. leaf enabled {
  5. type boolean;
  6. }
  7. ...
  8. }

以下叶定义了一个“must”表达式,确保引用的接口被启用:

  1. leaf outgoing-interface {
  2. type leafref {
  3. path "/interface/name";
  4. }
  5. must '/interface[name=current()]/enabled = "true"';
  6. }

10.2. 字符串函数

10.2.1. re-match()

  1. boolean re-match(string subject, string pattern)

如果“subject”字符串匹配正则表达式“pattern”,则re-match()函数返回“true”。 否则,返回“false”。

re-match()函数检查字符串是否与给定的正则表达式匹配。 使用的正则表达式是XML模式正则表达式[XSD-TYPES]。 请注意,这包括正则表达式在头部和尾部的隐式锚定。

10.2.1.1. 使用示例

表达式如下:

  1. re-match("1.22.333", "\d{1,3}\.\d{1,3}\.\d{1,3}")

返回“true”。

要计算所有名为eth0<number>的逻辑接口,请执行以下操作:

  1. count(/interface[re-match(name, "eth0\.\d+")])

10.3. YANG类型“leafref”和“instance-identifier"”的函数

10.3.1. deref()

  1. node-set deref(node-set nodes)

deref()函数遵循第一个节点在参数“nodes”中以文档顺序定义的引用,并返回它引用的节点。

如果第一个参数节点的类型是“instance-identifier”,则该函数返回一个包含实例标识符引用的单个节点(如果存在)的节点集。 如果不存在这样的节点,则返回空的节点集合。

如果第一个参数节点的类型为“leafref”,则该函数将返回一个包含leafref引用的节点的节点集。 具体来说,这个集合包含由leafref的“path”语句(第9.9.2节)选择的节点,它们与第一个参数节点具有相同的值。

如果第一个参数节点是任何其他类型,则返回空节点集。

10.3.1.1. 使用示例

  1. list interface {
  2. key "name type";
  3. leaf name { ... }
  4. leaf type { ... }
  5. leaf enabled {
  6. type boolean;
  7. }
  8. ...
  9. }
  10. container mgmt-interface {
  11. leaf name {
  12. type leafref {
  13. path "/interface/name";
  14. }
  15. }
  16. leaf type {
  17. type leafref {
  18. path "/interface[name=current()/../name]/type";
  19. }
  20. must 'deref(.)/../enabled = "true"' {
  21. error-message
  22. "The management interface cannot be disabled.";
  23. }
  24. }
  25. }

10.4. YANG类型的“identityref”函数

10.4.1. derived-from()

  1. 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. 使用示例

  1. module example-interface {
  2. yang-version 1.1;
  3. ...
  4. identity interface-type;
  5. identity ethernet {
  6. base interface-type;
  7. }
  8. identity fast-ethernet {
  9. base ethernet;
  10. }
  11. identity gigabit-ethernet {
  12. base ethernet;
  13. }
  14. list interface {
  15. key name;
  16. ...
  17. leaf type {
  18. type identityref {
  19. base interface-type;
  20. }
  21. }
  22. ...
  23. }
  24. augment "/interface" {
  25. when 'derived-from(type, "exif:ethernet")';
  26. // generic Ethernet definitions here
  27. }
  28. ...
  29. }

10.4.2. derived-from-or-self()

  1. 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节定义的模块也可能有:

  1. augment "/interface" {
  2. when 'derived-from-or-self(type, "exif:fast-ethernet");
  3. // Fast-Ethernet-specific definitions here
  4. }

10.5. YANG类型“enumeration”函数

10.5.1. enum-value()

  1. number enum-value(node-set nodes)

enum-value()函数检查参数“nodes”中文档顺序中的第一个节点是否为“enumeration”类型的节点,并返回枚举的整数值。 如果“nodes”节点集为空,或者“nodes”中的第一个节点不是“enumeration”类型,则返回NaN(不是数字)。

10.5.1.1. 使用示例

有了这个数据模型:

  1. list alarm {
  2. ...
  3. leaf severity {
  4. type enumeration {
  5. enum cleared {
  6. value 1;
  7. }
  8. enum indeterminate {
  9. value 2;
  10. }
  11. enum minor {
  12. value 3;
  13. }
  14. enum warning {
  15. value 4;
  16. }
  17. enum major {
  18. value 5;
  19. }
  20. enum critical {
  21. value 6;
  22. }
  23. }
  24. }
  25. }

以下XPath表达式仅选择严重性为“major”或更高的警报:

  1. /alarm[enum-value(severity) >= 5]

10.6. YANG类型的“bits”函数

10.6.1. bit-is-set()

  1. boolean bit-is-set(node-set nodes, string bit-name)

如果参数“nodes”中的文档顺序中的第一个节点是“bits”类型的节点,并且其值设置了“bit-name”位,则bit-is-set()函数返回“true” 否则,返回“false”。

10.6.1.1. 使用示例

如果一个接口有这个叶子:

  1. leaf flags {
  2. type bits {
  3. bit UP;
  4. bit PROMISCUOUS
  5. bit DISABLED;
  6. }
  7. }

可以使用以下XPath表达式来选择带有UP标志的所有接口:

  1. /interface[bit-is-set(flags, "UP")]