You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何确保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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 08:32:33