7.13. “使用”声明
“uses
”语句用于引用“grouping
”定义。 它需要一个参数,这是分组的名称。
“uses
”引用对分组的作用是将分组定义的节点复制到当前模式树中,然后根据“精简(according
)”和“增加(augment
)”语句进行更新。
在分组中定义的标识符没有绑定到名称空间,直到分组的内容通过“uses
”语句添加到模式树中,该语句不出现在“grouping
”语句中,此时它们被绑定到名称空间的当前模块。
7.13.1. uses
子语句
+--------------+---------+-------------+
| substatement | section | cardinality |
+--------------+---------+-------------+
| augment | 7.17 | 0..n |
| description | 7.21.3 | 0..1 |
| if-feature | 7.20.2 | 0..n |
| reference | 7.21.4 | 0..1 |
| refine | 7.13.2 | 0..n |
| status | 7.21.2 | 0..1 |
| when | 7.21.5 | 0..1 |
+--------------+---------+-------------+
7.13.2. “refine
”声明
分组中每个节点的一些属性可以通过“refine
”语句来改进。参数是标识分组中的节点的字符串。这个节点被称为细化的目标节点。如果分组中的节点不存在作为“细化”语句的目标节点,则不会对其进行细化,因此可以完全按照在分组中定义的方式使用。
参数字符串是后代模式节点标识符(请参阅第6.5节)。
以下改进可以完成:
叶节点或选择节点可能会得到一个默认值,或者一个新的默认值,如果它已经有一个。
一个叶子列表节点可以获得一组默认值,或者一组新的默认值(如果它已经有了默认值)即精炼的默认值的集合取代了已经给出的默认值。
任何节点都可能获得专门的“
description
”字符串。任何节点都可能获得专门的“
reference
”字符串。任何节点可能会得到不同的“
config
”语句。leaf
,anydata
,anyxml
或choice
节点可能会得到不同的mandatory
”语句。一个容器节点可能会得到一个“
presence
”语句。叶,叶列表,列表,容器,
anydata
或anyxml
节点可能会获得额外的“must
”表达式。叶子列表或列表节点可能会得到不同的“最小元素(
min-elements
)”或“最大元素(max-elements
)”语句。叶,叶列表,列表,容器,选项,大小写,
anydata
或anyxml
节点可能会获得额外的“if-feature
”表达式。如果扩展允许细化,任何节点都可以得到细化的扩展。详情请参阅7.19节。
7.13.3. XML
编码规则
即使从另一个XML
名称空间导入另一个模块,分组中的每个节点都被编码,就好像它是内联定义的一样。
7.13.4. 使用示例
要使用7.12.2节中定义的“endpoint
”分组来定义某个其他模块中的HTTP
服务器,我们可以这样做:
import example-system {
prefix "sys";
}
container http-server {
leaf name {
type string;
}
uses sys:endpoint;
}
相应的XML
实例示例:
<http-server>
<name>extern-web</name>
<ip>192.0.2.1</ip>
<port>80</port>
</http-server>
如果端口80
应该是HTTP
服务器的默认端口,则可以添加一个默认值:
container http-server {
leaf name {
type string;
}
uses sys:endpoint {
refine port {
default 80;
}
}
}
如果我们要定义一个服务器列表,并且每个服务器都有“ip
”和“port
”作为键,我们可以这样做:
list server {
key "ip port";
leaf name {
type string;
}
uses sys:endpoint;
}
以下是一个错误:
container http-server {
uses sys:endpoint;
leaf ip { // 非法 - 相同的标识符“ip”
type string;
}
}