2

RFC 7950#7.9.4

[mandatory] ​​约束的行为取决于模式树中不是不存在的选择的最近祖先节点的类型(参见第 7.5.1 节):

  • 如果模式树中不存在这样的祖先,则强制执行约束。
  • 否则,如果此祖先是一个案例节点,则如果该案例中的任何其他节点存在,则强制执行约束。
  • 否则,如果祖先节点存在,则强制执行。

现在:第一点和最后一点似乎很简单,但我无法得到第二点。

是不是想说如果第一个non-presence container祖先是一个节点,那么如果有多个孩子case,则必须强制执行约束?case基本上,这意味着如果case包含uses?

4

1 回答 1

1

强制选择意味着只有一个案例分支(案例的数据节点后代)必须存在于有效的实例文档中- RFC 使用术语“有效数据”来引用它。第二个项目符号是一个例外。

第二个项目符号适用于嵌套选择 - 如果选择的祖先是案例节点,则您正在处理嵌套在另一个选择中的选择。

module choice-case {
    yang-version 1.1;
    namespace "org:example:choice-case";
    prefix "cc";

    container top {
        choice choice {
            case mandatory-choice { // <-- case mentioned in 2nd bullet
                choice choice {
                    mandatory true; // <-- constraint not enforced until f is instantiated
                    case a-b-c { 
                        leaf a {type string;}
                        leaf b {type string;}
                        leaf c {type string;}
                    }
                    case d-e { 
                        leaf d {type string;}
                        leaf e {type string;}
                    }
                }
                leaf f {
                    type string;
                }
            }
        }
    }
}

在上面的例子中,强制选择约束没有被强制执行,直到叶子f也出现在实例文档中。a-b-c如果实例化来自任一分支或分支的叶节点d-e,则也将强制执行约束,但始终满足条件。

是不是想说如果第一个不存在的容器祖先是一个案例节点,那么如果案例有多个孩子,则必须强制执行约束?

否。如果实例文档中存在此类子项的实例,则会强制执行该约束。

基本上,这意味着如果案例包含用途,我必须强制执行?

强制约束适用于实例文档,而不是模式 - 模式仅规定了约束。Auses永远不会存在于强制约束被强制执行的上下文中。只有由引用的分组定义的实例化数据节点可能存在于这样的上下文中,并且可以在执行约束时考虑。

于 2018-10-08T07:05:45.983 回答