以下
module yy {
yang-version 1.1;
namespace "urn:example:yy";
prefix yyX;
container x4 {
leaf x5 {
type string;
}
}
grouping gx {
leaf l {
type leafref {
path "../x4/x5";
}
}
}
}
并且
module tt {
yang-version 1.1;
namespace "urn:example:tt";
prefix ttX;
import yy {
prefix zz;
}
container ty {
uses zz:gx;
}
}
yang -f yin tt.yang
。\ yy.yang:16:错误:yy:在tt.yang的路径中的x4:11(at。\ yy.yang:14)未找到
答案 0 :(得分:0)
这是一个很好的例子,说明为什么定义不可重用的分组是一个坏主意。这就是你的分组所代表的。它"参考"定义它的上下文中的定义(而不是在分组本身内),而不是它的使用位置。
分组中的节点在使用之前缺少上下文(名称空间等)。例如,在使用分组之前,您无法分辨哪个节点是叶l
的父节点 - 这是因为分组在使用之前不是模式树的一部分。使用后,分组中的节点将复制到出现用途的位置,从而替换它。
那么当您使用分组并且编译器命中你的leafref时会发生什么?好吧,它会尝试在使用分组的上下文中找到引用的节点,即tt
模块。您在ty
容器中使用了分组,因此架构树如下所示:
+--rw container ty
+--rw leaf l? leafref
您的表达式为../x4/x5
,其中较长的表示parent::*/child::x4/child::x5
。表达式的初始上下文是架构树中的l
叶。因此分为三个步骤,您的表达式评估为:
+-----------+----------------+----------------+--------------+
| Step | Context | Result | Final result |
+-----------+----------------+----------------+--------------+
| parent::* | leaf l | container ty | |
| child::x4 | container ty | empty node set | |
| child::x5 | empty node set | empty node set | <-- |
+-----------+----------------+----------------+--------------+
是的,注意到表达式匹配。
如果将容器移动到tt
模块,则会得到以下架构树:
+--rw container x4
+--rw leaf x5? string
+--rw container tt
+--rw leaf l? leafref
你现在应该能够告诉我,这也不会起作用。原因是 - 分组假设它将被使用的上下文,这是不好的做法。由于上下文与表达式不匹配,因此您会破坏YANG。
另一个重要概念是路径表达式的范围。表达式只能&#34;看到&#34;使用分组的模块可以访问的定义,而不是定义的位置。这就是为什么上面的两个示例模式树有意不同。