-1

我有这个杨模型:

container x {
  list y{
    key "a"
    leaf a{
    }
    leaf b{
    }
  }
}

我将如何访问叶子,例如 b 叶子不是 x/y{value a}/b 吗?或 x/y/b 我尝试了很多 xpath 的组合,但没有一个有效,这只是我最聪明的 2 个组合。请帮助或指出一些例子。谢谢!

4

1 回答 1

4

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. 所有路径表达式实际上都由部分组成(斜线之间的部分),称为“步骤”,所有步骤至少有两个组成部分:

  • 一个节点测试,分别是 what和xare 。它们匹配节点名称。yb
  • 一个轴,就是这样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 表达式选择模式节点 - 只能实例化数据节点!

于 2018-08-02T08:15:01.750 回答