1

我有以下 YANG 模型:

list machines {
                key "name";
                leaf "name" {
                    type string;
                }
                leaf link {
                    type leafref {
                            path "../name";
                    }
                }
}

假设列表中有三个元素:

"machines" : [
    { "name": "a" },
    { "name": "b" },
    { "name": "c" }
]

如果我想"link"为 element设置b,有效值"link""a", "b", "c"还是只是"b"

我在RFC7950中没有找到答案。而在pyangbind中,只能"b"设置。但我不确定这是正确的行为。

如果../name这里只能引用"b",那么正确的引用路径是什么"a", "b", "c",即列表元素的所有名称?

如果../name这里可以参考"a", "b", "c",那么正确的参考路径是"b"什么?

谢谢

4

1 回答 1

0

这是 RFC7950 对列表所说的:

“list”语句用于定义模式树中的内部数据节点。一个列表节点可能存在于数据树的多个实例中。每个这样的实例都称为列表条目。

尽管您的 JSON 编码实例文档似乎暗示其中仅存在一个machines列表实例,但实际上存在三个列表实例。您为列表选择的名称加深了这种混淆,因为列表定义的推荐名称是“机器”。封装容器将采用名称的复数形式。

在 XML 编码中,上述情况变得更加明显。

<machines>
  <name>a</name>
</machines>
<machines>
  <name>b</name>
</machines>
<machines>
  <name>c</name>
</machines>

如果我想为元素 b 设置“链接”,“链接”的有效值是“a”、“b”、“c”还是只是“b”?

叶引用路径表达式是 XPath 的子集。相同的规则适用,您只限于可以使用表达式选择的内容 - 它旨在选择一个或多个叶实例。XPath 总是在对象树上工作,并且这棵树(有点尴尬)在 RFC7950 中定义——文档将这棵树称为accessible tree,它由实例化的数据节点(数据树的子集)组成。这在第 6.4.1 节中进行了描述。

除了可访问的树之外,上下文节点也很重要(相对表达式隐含地引用它)。这是 RFC7950 对您示例中的上下文节点的说明。

上下文节点是定义了“路径”语句的数据树中的节点

这将是您的实例,是具有 valuelink的实例的兄弟。这是一个快速的伪数据树:nameb

machines[1]
 +-name(a)
machines[2]
 +-name(b)
 +-link
machines[3]
 +-name(c)

表达式首先继续选择 的父级link。任何给定的数据节点实例总是只有一个父节点,在您的情况下,这将是前面提到的两个兄弟节点都作为子节点 ( machines[2]) 的列表实例。然后表达式继续选择具有name名称的子项,该名称是namewith value的实例b

link这意味着您的节点的唯一有效值是b. 这仅适用于您的具体示例。

如果这里的../name只能引用“b”,那么引用“a”、“b”、“c”的正确路径是什么,即所有列表元素的名称?

使用绝对表达式或更进一步,然后再返回:

  • //machines/name(用//绝对路径 替换machines
  • ../../machines/name

然后,这两个都将首先选择所有实例化machines的 .

注意:这正是 XPath 的工作原理。如果 RFC7950 文本会说“只有一个列表实例具有多个条目”或类似的内容,则另一种选择将适用。

于 2018-11-08T16:06:33.733 回答