我有以下YANG模型:
list machines {
key "name";
leaf "name" {
type string;
}
leaf link {
type leafref {
path "../name";
}
}
}
假设列表中包含三个元素:
"machines" : [
{ "name": "a" },
{ "name": "b" },
{ "name": "c" }
]
如果我想为元素"link"
设置b
,则"link"
的有效值是"a", "b", "c"
还是仅仅是"b"
?
我在RFC7950中找不到答案。并且在pyangbind中,只能设置"b"
。但是我不确定这是正确的行为。
如果这里的../name
仅可以引用"b"
,那么引用"a", "b", "c"
的正确路径是什么,即列表元素的所有名称?
如果此处的../name
可以引用"a", "b", "c"
,那么仅引用"b"
的正确路径是什么?
谢谢
答案 0 :(得分:0)
这是RFC7950列出的内容:
“ list”语句用于定义内部数据节点 模式树。数据中的多个实例中可能存在一个列表节点 树。每个此类实例都称为列表条目。
尽管您的JSON编码实例文档似乎表明其中仅存在machines
列表的一个实例,但实际上有三个列表实例。您为列表选择的名称加深了这种混淆,因为列表定义的建议名称为“ machine”。信封将采用名称的复数形式。
在XML编码中,以上内容变得更加明显。
<machines>
<name>a</name>
</machines>
<machines>
<name>b</name>
</machines>
<machines>
<name>c</name>
</machines>
如果我想为元素b设置“链接”,则“链接”的有效值为“ a”,“ b”,“ c”或仅仅是“ b”?
leafref路径表达式是XPath的子集。遵循相同的规则,但您只能在表达式中进行选择,即只能选择一个或多个叶子实例。 XPath始终在对象树上工作,并且该树在RFC7950中(有点笨拙)定义-文档将此树称为accessible tree
,它由实例化的数据节点(数据树的子集)组成。这在Section 6.4.1中有描述。
除了可访问树之外,上下文节点也很重要(相对表达式隐式引用了它)。这是RFC7950关于示例中上下文节点的内容。
上下文节点是数据树中为其定义“ path”语句的节点
在您的情况下,这将是link
实例,是值为name
的{{1}}实例的同级对象。这是一个快速的伪数据树:
b
表达式首先继续选择machines[1]
+-name(a)
machines[2]
+-name(b)
+-link
machines[3]
+-name(c)
的父级。对于任何给定的数据节点实例,始终只有一个父级,在您的情况下,它将是之前提到的两个同级都作为孩子(link
)的列表实例。然后,表达式继续选择名称为machines[2]
的子级,该子级是值为name
的{{1}}的实例。
这意味着name
节点的唯一有效值为b
。这仅适用于您的特定示例。
如果此处的../name只能引用“ b”,那么引用“ a”,“ b”,“ c”(即列表元素的所有名称)的正确路径是什么?
使用绝对表达式或进一步让其父代,然后再次返回:
link
(用绝对路径替换b
//machines/name
)//
然后,这两个选项都将首先选择所有实例化的machines
。
注意:这就是XPath的工作方式。如果RFC7950文字说“只有一个具有多个条目的列表实例”或类似内容,则可以采用另一种选择。