7.13. “使用”声明

uses”语句用于引用“grouping”定义。 它需要一个参数,这是分组的名称。

uses”引用对分组的作用是将分组定义的节点复制到当前模式树中,然后根据“精简(according)”和“增加(augment)”语句进行更新。

在分组中定义的标识符没有绑定到名称空间,直到分组的内容通过“uses”语句添加到模式树中,该语句不出现在“grouping”语句中,此时它们被绑定到名称空间的当前模块。

7.13.1. uses子语句

  1. +--------------+---------+-------------+
  2. | substatement | section | cardinality |
  3. +--------------+---------+-------------+
  4. | augment | 7.17 | 0..n |
  5. | description | 7.21.3 | 0..1 |
  6. | if-feature | 7.20.2 | 0..n |
  7. | reference | 7.21.4 | 0..1 |
  8. | refine | 7.13.2 | 0..n |
  9. | status | 7.21.2 | 0..1 |
  10. | when | 7.21.5 | 0..1 |
  11. +--------------+---------+-------------+

7.13.2. “refine”声明

分组中每个节点的一些属性可以通过“refine”语句来改进。参数是标识分组中的节点的字符串。这个节点被称为细化的目标节点。如果分组中的节点不存在作为“细化”语句的目标节点,则不会对其进行细化,因此可以完全按照在分组中定义的方式使用。

参数字符串是后代模式节点标识符(请参阅第6.5节)。

以下改进可以完成:

  • 叶节点或选择节点可能会得到一个默认值,或者一个新的默认值,如果它已经有一个。

  • 一个叶子列表节点可以获得一组默认值,或者一组新的默认值(如果它已经有了默认值)即精炼的默认值的集合取代了已经给出的默认值。

  • 任何节点都可能获得专门的“description”字符串。

  • 任何节点都可能获得专门的“reference”字符串。

  • 任何节点可能会得到不同的“config”语句。

  • leafanydataanyxmlchoice节点可能会得到不同的mandatory”语句。

  • 一个容器节点可能会得到一个“presence”语句。

  • 叶,叶列表,列表,容器,anydataanyxml节点可能会获得额外的“must”表达式。

  • 叶子列表或列表节点可能会得到不同的“最小元素(min-elements)”或“最大元素(max-elements)”语句。

  • 叶,叶列表,列表,容器,选项,大小写,anydataanyxml节点可能会获得额外的“if-feature”表达式。

  • 如果扩展允许细化,任何节点都可以得到细化的扩展。详情请参阅7.19节

7.13.3. XML编码规则

即使从另一个XML名称空间导入另一个模块,分组中的每个节点都被编码,就好像它是内联定义的一样。

7.13.4. 使用示例

要使用7.12.2节中定义的“endpoint”分组来定义某个其他模块中的HTTP服务器,我们可以这样做:

  1. import example-system {
  2. prefix "sys";
  3. }
  4. container http-server {
  5. leaf name {
  6. type string;
  7. }
  8. uses sys:endpoint;
  9. }

相应的XML实例示例:

  1. <http-server>
  2. <name>extern-web</name>
  3. <ip>192.0.2.1</ip>
  4. <port>80</port>
  5. </http-server>

如果端口80应该是HTTP服务器的默认端口,则可以添加一个默认值:

  1. container http-server {
  2. leaf name {
  3. type string;
  4. }
  5. uses sys:endpoint {
  6. refine port {
  7. default 80;
  8. }
  9. }
  10. }

如果我们要定义一个服务器列表,并且每个服务器都有“ip”和“port”作为键,我们可以这样做:

  1. list server {
  2. key "ip port";
  3. leaf name {
  4. type string;
  5. }
  6. uses sys:endpoint;
  7. }

以下是一个错误:

  1. container http-server {
  2. uses sys:endpoint;
  3. leaf ip { // 非法 - 相同的标识符“ip”
  4. type string;
  5. }
  6. }