我有这个杨模型:
container x {
list y{
key "a"
leaf a{
}
leaf b{
}
}
}
我该如何访问一个叶,例如b叶,它不是x/y{value a}/b吗?或者x/y/b我尝试了很多xpath组合,但都不起作用——这只是我最聪明的两个组合。请帮我举几个例子。谢谢
像x/y[a='value']/b
或x/y/b
这样的表达式不能在任何地方为示例模块定义并返回有意义的结果。它们表示相对表达式,并且这些表达式总是依赖于它们的初始上下文节点(为其定义它们的模式节点(。例如,如果您将must
(XPath(表达式定义为y
列表的子语句,则该列表是您的初始上下文节点,并且该表达式相对于它进行解析。
由于x
是顶级节点,因此不能用它来启动相对表达式——这意味着必须将表达式(must
、when
(定义为module
语句的子语句,这是不允许的。这就是为什么存在绝对路径:/x/y/b
。对于这样的表达式,初始上下文节点始终是文档根节点,因为第一个斜杠(/
(会选择它。文档根节点可能会将x
作为模块的子节点。
相对(或绝对(XPath表达式(如x/y/b
(实际上是以下表达式的缩写形式:child::x/child::y/child::b
。所有的路径表达式实际上都是由部分组成的(斜线之间的部分(,称为"步骤",所有步骤至少有两个组件:
- 节点测试,分别是
x
、y
和b
。它们匹配节点名称 - 一个轴,这就是
child::
。一个轴为选择哪些节点(子节点、兄弟节点、父节点等(提供了额外的指导。即使一个步骤没有明确定义轴,它也将默认为child::
,它在当前节点上下文中选择节点的子节点
步骤的全部目的是从当前节点上下文中选择/筛选节点。以下是x/y/b
用通俗英语所说的:首先,给我初始上下文节点的所有子节点,它们被命名为x
,并将它们放入当前节点上下文中。然后选择当前节点上下文中节点的所有子节点,命名为y
,并用它们替换当前节点上下文的所有节点。然后选择当前节点上下文中节点的所有子节点,命名为b
,并用它们替换当前节点上下文的所有节点。当前节点上下文中的节点是表达式的结果。
考虑到所有这些,这里有几个例子:
when "../a='value'";
,定义为leaf
b
的子级must "b > 25";
被定义为list
y
的子级must "y[a='key1']/b";
,定义为container
x
的子级
注意:YANG中的所有XPath表达式都是在服务器/客户端运行时计算的,并针对实例化的数据节点树(也称为可访问树(应用。不能使用XPath表达式选择架构节点,只能选择实例化的数据节点!