YANG列表内的xpath表达式的相对路径

时间:2018-11-07 10:34:44

标签: xml xslt xpath ietf-netmod-yang ietf-restconf

我有以下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"的正确路径是什么?

谢谢

1 个答案:

答案 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文字说“只有一个具有多个条目的列表实例”或类似内容,则可以采用另一种选择。