繁体   English   中英

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中找不到答案。 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实例,是值为bname实例的同级对象。 这是一个快速的伪数据树:

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

表达式首先继续选择link的父级。 对于任何给定的数据节点实例,始终只有一个父对象,在您的情况下,该列表实例就是前面提到的两个同级都作为子对象的列表实例( machines[2] )。 然后,表达式继续选择具有name name的子代,该子代是具有值bname的实例。

这意味着link节点的唯一有效值为b 这仅适用于您的特定示例。

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

使用绝对表达式或进一步使父母双亲,然后再次返回:

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

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

注意:这就是XPath的工作方式。 如果RFC7950文本说“只有一个具有多个条目的列表实例”或类似内容,则可以采用另一种选择。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM