我有这个杨模型:
container x {
list y{
key "a"
leaf a{
}
leaf b{
}
}
}
我将如何访问叶子,例如 b 叶子不是 x/y{value a}/b 吗?或 x/y/b 我尝试了很多 xpath 的组合,但没有一个有效,这只是我最聪明的 2 个组合。请帮助或指出一些例子。谢谢!
我有这个杨模型:
container x {
list y{
key "a"
leaf a{
}
leaf b{
}
}
}
我将如何访问叶子,例如 b 叶子不是 x/y{value a}/b 吗?或 x/y/b 我尝试了很多 xpath 的组合,但没有一个有效,这只是我最聪明的 2 个组合。请帮助或指出一些例子。谢谢!
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
are 。它们匹配节点名称。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 表达式选择模式节点 - 只能实例化数据节点!