在 YANG 模型中只允许单独列表中的唯一键

问题描述

我的 yang 模型有两个相同级别的列表。我需要两个列表中的元素都是唯一的。在每个列表中不是唯一的,但在列表的联合中是唯一的。有没有办法用 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;
        }
    }
}

那么,我如何确保每个元素都有不同的名称

解决方法

假设您需要两个列表之间联合中某些元素的唯一,您确实可以使用 must 约束来实现这一点。

(另外)假设您需要 somethingsomething-else 的唯一 ,您可以使用如下条件在 list b 上设置 must 约束:

not(../a[something=current()/something-else])

因此,something 的值不需要在 list a 的所有实例中都是唯一的,something-else 的值不需要在 list b 的所有实例中都是唯一的,但是 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)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...