YANG 模型中仅允许单独列表中的唯一键
Only allow unique keys in seperate lists in YANG Model
我的阳模型有两个同级列表。我需要两个列表中的元素都是唯一的。在每个列表中不是唯一的,但在列表的联合中是唯一的。有没有办法用 must 语句或其他东西来定义它?
container parent {
list a {
key "name";
leaf name {
type string;
}
leaf something {
type string;
}
}
list b {
key "name";
leaf name {
type string;
}
leaf something-else{
type string;
}
}
}
那么,我如何确保每个元素都有不同的名称?
假设您需要两个列表联合中某些元素的唯一 值,您确实可以使用必须约束来实现。
(另外)假设您需要 something
和 something-else
的唯一 值 ,您可以对 list b
设置必须约束像这样的条件:
not(../a[something=current()/something-else])
因此,something
的值不需要在 list a
的所有实例中都是唯一的,something-else
的值不需要在 [=16] 的所有实例中都是唯一的=],但是 something
的不同值和 something-else
的不同值的交集必须是空集。
module a {
yang-version 1.1;
namespace "a:uri";
prefix "a";
container parent {
list a {
key "name";
leaf name {
type string;
}
leaf something {
type string;
}
}
list b {
must "not(../a[something=current()/something-else])";
key "name";
leaf name {
type string;
}
leaf something-else{
type string;
}
}
}
}
无效文档示例:
<?xml version="1.0" encoding="utf-8"?>
<data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<a1:parent xmlns:a1="a:uri">
<a1:a>
<a1:name>a-1</a1:name>
<a1:something>foo</a1:something>
</a1:a>
<a1:a>
<a1:name>a-2</a1:name>
<a1:something>foo</a1:something>
</a1:a>
<a1:b>
<a1:name>b-1</a1:name>
<a1:something-else>bar</a1:something-else>
</a1:b>
<a1:b>
<a1:name>b-2</a1:name>
<a1:something-else>foo</a1:something-else>
</a1:b>
</a1:parent>
</data>
这会导致验证失败,例如:
Error at (16:5): failed assert at "/nc:data/a1:parent/a1:b": Condition "not(../a1:a[a1:something=current()/a1:something-else])" must be true
请注意,这只是您可以如何满足您的要求的一个示例。例如,您可以将我的条件移动到 something-else
叶子,然后它会变成这样(未测试):
not(.=../../a/something)
我的阳模型有两个同级列表。我需要两个列表中的元素都是唯一的。在每个列表中不是唯一的,但在列表的联合中是唯一的。有没有办法用 must 语句或其他东西来定义它?
container parent {
list a {
key "name";
leaf name {
type string;
}
leaf something {
type string;
}
}
list b {
key "name";
leaf name {
type string;
}
leaf something-else{
type string;
}
}
}
那么,我如何确保每个元素都有不同的名称?
假设您需要两个列表联合中某些元素的唯一 值,您确实可以使用必须约束来实现。
(另外)假设您需要 something
和 something-else
的唯一 值 ,您可以对 list b
设置必须约束像这样的条件:
not(../a[something=current()/something-else])
因此,something
的值不需要在 list a
的所有实例中都是唯一的,something-else
的值不需要在 [=16] 的所有实例中都是唯一的=],但是 something
的不同值和 something-else
的不同值的交集必须是空集。
module a {
yang-version 1.1;
namespace "a:uri";
prefix "a";
container parent {
list a {
key "name";
leaf name {
type string;
}
leaf something {
type string;
}
}
list b {
must "not(../a[something=current()/something-else])";
key "name";
leaf name {
type string;
}
leaf something-else{
type string;
}
}
}
}
无效文档示例:
<?xml version="1.0" encoding="utf-8"?>
<data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<a1:parent xmlns:a1="a:uri">
<a1:a>
<a1:name>a-1</a1:name>
<a1:something>foo</a1:something>
</a1:a>
<a1:a>
<a1:name>a-2</a1:name>
<a1:something>foo</a1:something>
</a1:a>
<a1:b>
<a1:name>b-1</a1:name>
<a1:something-else>bar</a1:something-else>
</a1:b>
<a1:b>
<a1:name>b-2</a1:name>
<a1:something-else>foo</a1:something-else>
</a1:b>
</a1:parent>
</data>
这会导致验证失败,例如:
Error at (16:5): failed assert at "/nc:data/a1:parent/a1:b": Condition "not(../a1:a[a1:something=current()/a1:something-else])" must be true
请注意,这只是您可以如何满足您的要求的一个示例。例如,您可以将我的条件移动到 something-else
叶子,然后它会变成这样(未测试):
not(.=../../a/something)