如何确保YANG列表无索引间隙?通用分组实现问询
通用YANG分组实现连续无缺失索引约束
背景
我有如下YANG模型:
grouping index { leaf index { type uint16 { range '1..max'; } } must 'INSERT RESTRICTION HERE'; } list my-list-1 { key index; uses index; // ... 其他节点 } list my-list-2 { key index; uses index; // ... 其他节点 }
预期目标
需要确保目标列表的索引从1到列表最大索引无缺失,即列表行为类似数组索引(如3个项则索引为1、2、3),且该约束需封装为grouping以复用。
已尝试方案
将以下must约束放在my-list-1内部时有效:
must "current()/index = 1 or ../my-list-1/index[. = current()/index - 1]";
但该XPath依赖my-list-1列表名,无法通用。我在grouping中尝试了以下语句均无效:
must "current() = 1 or parent::*/index[. = current() - 1]"; must "current() = 1 or parent::*[index = current() - 1]"; must "current() = 1 or ../index[. = current() - 1]";
这些语句仅允许索引为1的项。我还尝试了following-sibling::*也未成功,请问是否有可行的通用实现方案?
解决方案
要在grouping里实现通用的连续索引约束,关键是正确定位当前列表项的兄弟节点。由于grouping被列表引用后,leaf index的父节点是列表的条目节点,可通过两种方式实现:
方案1:检查前驱兄弟节点
使用preceding-sibling::*查找当前条目之前的所有兄弟条目,验证是否存在索引为current() - 1的项:
grouping index { leaf index { type uint16 { range '1..max'; } } must "current() = 1 or ../preceding-sibling::*[index = current() - 1]"; }
说明:该约束要求每个非1的索引,其前面必须存在索引值减1的条目。如果需要严格按顺序添加条目(比如必须先加index=2才能加index=3),这个方案适用。
方案2:统计索引范围覆盖性
如果允许条目乱序添加,只需最终所有索引从1到最大值无缺失,可以用统计条目数量的方式:
grouping index { leaf index { type uint16 { range '1..max'; } } must "current() = 1 or count(../*[index < current()]) = current() - 1"; }
说明:该约束检查所有小于当前索引的正整数,都有对应的条目存在(数量等于当前索引减1),无论条目顺序如何,只要最终索引连续即可。
额外补充:强化约束(列表级别)
如果需要严格保证索引从1开始连续且数量完全匹配,可以在列表级别配合添加约束:
list my-list-1 { key index; uses index; must "max(index) = count(.)"; }
这个约束和grouping里的约束配合,能完全确保索引是1到N的连续值,没有缺失或超出范围的情况。
内容的提问来源于stack exchange,提问作者nullromo
相关产品推荐
相关产品推荐

