[英]relative path of an xpath expression inside a YANG list
我有以下YANG模型:
list machines {
key "name";
leaf "name" {
type string;
}
leaf link {
type leafref {
path "../name";
}
}
}
假设列表中包含三个元素:
"machines" : [
{ "name": "a" },
{ "name": "b" },
{ "name": "c" }
]
如果我要为元素b
设置"link"
,则"link"
的有效值为"a", "b", "c"
或仅仅是"b"
?
我在RFC7950中找不到答案。 在pyangbind中 ,只能设置"b"
。 但是我不确定这是正确的行为。
如果此处的../name
只能引用"b"
,那么引用"a", "b", "c"
的正确路径是什么,即列表元素的所有名称?
如果此处的../name
可以引用"a", "b", "c"
,那么仅引用"b"
的正确路径是什么?
谢谢
这是RFC7950对列表的说明:
“列表”语句用于在架构树中定义内部数据节点。 列表节点可能存在于数据树中的多个实例中。 每个这样的实例称为列表条目。
尽管您的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
,并且由实例化数据节点(数据树的子集)组成。 在6.4.1节中对此进行了描述。
除了可访问树之外,上下文节点也很重要(相对表达式隐式引用了它)。 这是RFC7950关于示例中上下文节点的内容。
上下文节点是数据树中为其定义“路径”语句的节点
在您的情况下,这将是link
实例,是值为b
的name
实例的同级对象。 这是一个快速的伪数据树:
machines[1]
+-name(a)
machines[2]
+-name(b)
+-link
machines[3]
+-name(c)
表达式首先继续选择link
的父级。 对于任何给定的数据节点实例,始终只有一个父对象,在您的情况下,该列表实例就是前面提到的两个同级都作为子对象的列表实例( machines[2]
)。 然后,表达式继续选择具有name
name的子代,该子代是具有值b
的name
的实例。
这意味着link
节点的唯一有效值为b
。 这仅适用于您的特定示例。
如果此处的../name只能引用“ b”,那么引用“ a”,“ b”,“ c”(即列表元素的所有名称)的正确路径是什么?
使用绝对表达式或进一步使父母双亲,然后再次返回:
//machines/name
(用machines
的绝对路径替换//
) ../../machines/name
然后,这两个都将首先选择所有实例化的machines
。
注意:这就是XPath的工作方式。 如果RFC7950文本说“只有一个具有多个条目的列表实例”或类似内容,则可以采用另一种选择。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.