YANG 列表中 xpath 表达式的相对路径
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. And in pyangbind没找到答案,只能设置"b"
。但我不确定这是正确的行为。
如果这里的../name
只能引用"b"
,引用"a", "b", "c"
的正确路径是什么,即列表元素的所有名称?
这里如果../name
可以引用"a", "b", "c"
,只引用"b"
的正确路径是什么?
谢谢
这是 RFC7950 对列表的描述:
The "list" statement is used to define an interior data node in the
schema tree. A list node may exist in multiple instances in the data
tree. Each such instance is known as a list entry.
尽管您的 JSON 编码实例文档看似表明其中仅存在 machines
列表的一个实例,但实际上存在三个列表实例。您为列表选择的名称加深了这种混淆,因为列表定义的推荐名称是“机器”。封装容器将采用名称的复数形式。
在XML编码中,以上变得更加明显。
<machines>
<name>a</name>
</machines>
<machines>
<name>b</name>
</machines>
<machines>
<name>c</name>
</machines>
If I want to set "link" for element b, the valid values for "link" are "a", "b", "c" or just "b"?
leafref 路径表达式是 XPath 的子集。同样的规则适用,你只是限制了你可以 select 表达 - 它旨在 select 一个或多个叶实例。 XPath 总是在对象树上工作,这棵树在 RFC7950 中定义(有点笨拙)——文档将这棵树称为 accessible tree
,它由实例化的数据节点(数据树的子集)组成。 Section 6.4.1.
中对此进行了描述
除了可访问的树,上下文节点也很重要(相对表达式隐含地引用它)。以下是 RFC7950 对示例中上下文节点的说明。
the context node is the node in the data tree for which the "path" statement is defined
在您的案例中,这将是 link
实例,它是 name
实例的同级实例,值为 b
。这是一个快速的伪数据树:
machines[1]
+-name(a)
machines[2]
+-name(b)
+-link
machines[3]
+-name(c)
表达式首先进入 select link
的父级。对于任何给定的数据节点实例,始终只有一个父节点,在您的情况下,这将是列表实例,其中包含前面提到的两个兄弟节点(machines[2]
)。然后表达式继续到具有 name
名称的 select 个子级,这是 name
的实例,值为 b
.
这意味着您的 link
节点的唯一有效值是 b
。这仅适用于您的特定示例。
If ../name here can only reference "b", what is the correct path to reference "a", "b", "c", that is, all names of list elements?
使用绝对表达式或将一个父级走得更远,然后再返回:
//machines/name
(将 //
替换为绝对路径
machines
)
../../machines/name
然后这两个将首先select全部实例化machines
。
注意:这就是 XPath 的工作原理。如果 RFC7950 文本会说“只有一个包含多个条目的列表实例”或类似的内容,则另一种选择将适用。
我有以下 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. And in pyangbind没找到答案,只能设置"b"
。但我不确定这是正确的行为。
如果这里的../name
只能引用"b"
,引用"a", "b", "c"
的正确路径是什么,即列表元素的所有名称?
这里如果../name
可以引用"a", "b", "c"
,只引用"b"
的正确路径是什么?
谢谢
这是 RFC7950 对列表的描述:
The "list" statement is used to define an interior data node in the schema tree. A list node may exist in multiple instances in the data tree. Each such instance is known as a list entry.
尽管您的 JSON 编码实例文档看似表明其中仅存在 machines
列表的一个实例,但实际上存在三个列表实例。您为列表选择的名称加深了这种混淆,因为列表定义的推荐名称是“机器”。封装容器将采用名称的复数形式。
在XML编码中,以上变得更加明显。
<machines>
<name>a</name>
</machines>
<machines>
<name>b</name>
</machines>
<machines>
<name>c</name>
</machines>
If I want to set "link" for element b, the valid values for "link" are "a", "b", "c" or just "b"?
leafref 路径表达式是 XPath 的子集。同样的规则适用,你只是限制了你可以 select 表达 - 它旨在 select 一个或多个叶实例。 XPath 总是在对象树上工作,这棵树在 RFC7950 中定义(有点笨拙)——文档将这棵树称为 accessible tree
,它由实例化的数据节点(数据树的子集)组成。 Section 6.4.1.
除了可访问的树,上下文节点也很重要(相对表达式隐含地引用它)。以下是 RFC7950 对示例中上下文节点的说明。
the context node is the node in the data tree for which the "path" statement is defined
在您的案例中,这将是 link
实例,它是 name
实例的同级实例,值为 b
。这是一个快速的伪数据树:
machines[1]
+-name(a)
machines[2]
+-name(b)
+-link
machines[3]
+-name(c)
表达式首先进入 select link
的父级。对于任何给定的数据节点实例,始终只有一个父节点,在您的情况下,这将是列表实例,其中包含前面提到的两个兄弟节点(machines[2]
)。然后表达式继续到具有 name
名称的 select 个子级,这是 name
的实例,值为 b
.
这意味着您的 link
节点的唯一有效值是 b
。这仅适用于您的特定示例。
If ../name here can only reference "b", what is the correct path to reference "a", "b", "c", that is, all names of list elements?
使用绝对表达式或将一个父级走得更远,然后再返回:
//machines/name
(将//
替换为绝对路径machines
)../../machines/name
然后这两个将首先select全部实例化machines
。
注意:这就是 XPath 的工作原理。如果 RFC7950 文本会说“只有一个包含多个条目的列表实例”或类似的内容,则另一种选择将适用。