6.4.1. XPath上下文

所有YANG XPath表达式共享以下XPath上下文定义:

  • 命名空间声明的集合是指定了XPath表达式的模块中的所有“import”语句的前缀和名称空间对的集合,以及“namespace”语句的URI的“prefix”语句的前缀。

  • 没有名称空间前缀的名称与当前节点的标识符属于同一个名称空间。在一个分组中,这个名字空间受到分组的使用位置的影响(见第7.13节)。在typedef中,该名称空间受到引用typedef的位置的影响。如果在分组中定义并引用typedef,则命名空间将受到分组使用位置的影响(请参见第7.13节)。

  • 函数库是[XPATH]中定义的核心函数库和第10节定义的函数。

  • 变量绑定的集合是空的。

XPath 2.0 [XPATH2.0]采用了处理前缀名的机制,有助于简化YANG中的XPath表达式。由于YANG节点标识符总是具有非空名称空间URI的限定名称,所以不会出现任何歧义。

  • 可访问树取决于具有XPath表达式的语句的定义位置:

  • 如果XPath表达式在子状态中定义为表示配置的数据节点,则可访问树是上下文节点所在数据存储区中的数据。根节点将所有模块中的所有顶级配置数据节点作为子节点。

  • 如果在子状态中将XPath表达式定义为表示状态数据的数据节点,则可访问树是服务器中的所有状态数据,以及正在运行的配置数据存储区。根节点将所有模块中的所有顶级数据节点都作为子节点。

  • 如果XPath表达式在子语句中定义为“notification”语句,则可访问树是通知实例,服务器中的所有状态数据以及正在运行的配置数据存储区。如果在模块顶层定义通知,则根节点将表示通知的节点定义为所有模块中的顶级数据节点,并将其作为子节点。否则,根节点将所有模块中的所有顶级数据节点都视为子节点。

  • 如果XPath表达式在子语句中定义为“rpc”或“action”语句中的“input”语句,则可访问的树是RPC或操作操作(action)实例,服务器中的所有状态数据以及正在运行的配置数据存储区。根节点在所有模块中都有作为子节点的顶级数据节点。此外,对于RPC,根节点也具有代表RPC操作的节点被定义为子节点。表示正在定义的操作的节点具有操作的输入参数作为子节点。

  • 如果XPath表达式在子语句中定义为“rpc”或“action”语句中的“output”语句,则可访问的树是RPC或操作(action)实例,服务器中的所有状态数据以及正在运行的配置数据存储区。根节点在所有模块中都有作为子节点的顶级数据节点。此外,对于RPC,根节点也具有代表RPC操作的节点被定义为子节点。表示正在定义的操作的节点具有操作的输出参数作为子节点。

在可访问的树中,存在所有使用默认值的叶子和叶子列表(参见7.6.17.7.2节)。

如果存在于可访问树中的节点具有不存在容器作为子节点,则不存在容器也存在于可访问树中。

上下文节点随着YANG XPath表达式而变化,并且在定义了具有XPath表达式的YANG语句的地方被指定。

6.4.1.1. 例子

鉴于以下模块:

  1. module example-a {
  2. yang-version 1.1;
  3. namespace urn:example:a;
  4. prefix a;
  5. container a {
  6. list b {
  7. key id;
  8. leaf id {
  9. type string;
  10. }
  11. notification down {
  12. leaf reason {
  13. type string;
  14. }
  15. }
  16. action reset {
  17. input {
  18. leaf delay {
  19. type uint32;
  20. }
  21. }
  22. output {
  23. leaf result {
  24. type string;
  25. }
  26. }
  27. }
  28. }
  29. }
  30. notification failure {
  31. leaf b-ref {
  32. type leafref {
  33. path "/a/b/id";
  34. }
  35. }
  36. }
  37. }

并给出了以XML格式指定的以下数据树:

  1. <a xmlns="urn:example:a">
  2. <b>
  3. <id>1</id>
  4. </b>
  5. <b>
  6. <id>2</id>
  7. </b>
  8. </a>

通知“down” 在 /a/b[id ="2"]的可访问树是:

  1. <a xmlns="urn:example:a">
  2. <b>
  3. <id>1</id>
  4. </b>
  5. <b>
  6. <id>2</id>
  7. <down>
  8. <reason>error</reason>
  9. </down>
  10. </b>
  11. </a>
  12. //可能还有其他顶级节点

在“when”参数设置为“10”时,对/a/b[id="1"]上的“reset”动作调用的可访问树将是:

  1. <a xmlns="urn:example:a">
  2. <b>
  3. <id>1</id>
  4. <reset>
  5. <delay>10</delay>
  6. </reset>
  7. </b>
  8. <b>
  9. <id>2</id>
  10. </b>
  11. </a>
  12. //可能还有其他顶级节点

这个动作输出的可访问树是:

  1. <a xmlns="urn:example:a">
  2. <b>
  3. <id>1</id>
  4. <reset>
  5. <result>ok</result>
  6. </reset>
  7. </b>
  8. <b>
  9. <id>2</id>
  10. </b>
  11. </a>
  12. //可能还有其他顶级节点

通知“failure”的可访问树可以是:

  1. <a xmlns="urn:example:a">
  2. <b>
  3. <id>1</id>
  4. </b>
  5. <b>
  6. <id>2</id>
  7. </b>
  8. </a>
  9. <failure>
  10. <b-ref>2</b-ref>
  11. </failure>
  12. //可能还有其他顶级节点