如何在YANG中对leaf节点分组,实现同选同弃的必选性?
实现“全填或全不填”的节点约束方案
你需要的是全有或全无的参数约束逻辑,单个设置mandatory true确实无法满足需求——它会强制节点必须存在,没法实现全跳过的场景。这里应该用YANG的must语句来做整体约束,而非依赖单个leaf的mandatory属性。
核心思路
通过must表达式检查四个leaf的存在状态:要么四个都不存在,要么四个都存在,不符合规则则触发错误提示。
代码示例
假设四个leaf节点a、b、c、d隶属于同一个container下,写法如下:
container params-group { leaf a { type string; } leaf b { type string; } leaf c { type string; } leaf d { type string; } // 约束:要么全不填,要么全填 must "(not(../a) and not(../b) and not(../c) and not(../d)) or (../a and ../b and ../c and ../d)" { error-message "Either provide all four parameters (a, b, c, d) or leave all empty."; } }
另一种简洁写法
可以用count()函数统计存在的节点数量,逻辑更直观:
must "count(./a | ./b | ./c | ./d) = 0 or count(./a | ./b | ./c | ./d) = 4" { error-message "All four parameters are required if any is provided, or leave all unset."; }
为什么不用when?
when语句的作用是控制节点是否可见或生效,无法直接约束多个节点的存在一致性。而must语句用于验证数据合法性,正好匹配你需要的“全有或全无”约束场景。
内容的提问来源于stack exchange,提问作者user19535511
相关产品推荐
相关产品推荐

