9.10. Identityref内置类型

identityref内置类型用于引用现有标识(请参阅第7.18节)。

9.10.1. 限制

identityref不能被限制。

9.10.2. identityref的“base”声明

如果类型是“identityref”,则必须至少存在一次“base”语句,即“type”语句的子语句。 参数是由“identityref”声明定义的身份的名称。 如果标识名称上存在前缀,则它指的是使用该前缀导入的模块中定义的标识。 否则,必须在当前模块或包含的子模块中定义具有匹配名称的标识。

identityref的有效值是从所有identityref的基本身份派生的任何身份。 在特定的服务器上,有效值进一步限制在由服务器实现的模块中定义的一组身份。

9.10.3. 词汇表示

identityref在词法上表示为[XML-NAMES]中定义的被引用的标识的限定名称。如果前缀不存在,则identityref的名称空间是对包含identityref值的元素有效的默认名称空间。

当使用“default”语句给identityref赋予默认值时,默认值中的标识名可以有一个前缀。如果身份名称中存在前缀,则表示在该模块中使用该前缀导入的身份,或者在当前模块或其子模块中定义了身份的前提下,使用当前模块的前缀。否则,必须在当前模块或其子模块中定义具有匹配名称的标识。

must”或“whenXPath表达式中“identityref”类型的节点的字符串值是带有前缀的引用标识的限定名。如果引用的标识是在导入的模块中定义的,则字符串值中的前缀是在相应的“import”语句中定义的前缀。否则,字符串值中的前缀是当前模块的前缀。

9.10.4. 规范形式

由于词法形式依赖于值出现的XML上下文,所以这种类型不具有规范形式。

9.10.5. 使用示例

使用7.18.3节中的身份定义和以下模块:

  1. module example-my-crypto {
  2. yang-version 1.1;
  3. namespace "urn:example:my-crypto";
  4. prefix mc;
  5. import "example-crypto-base" {
  6. prefix "crypto";
  7. }
  8. identity aes {
  9. base "crypto:crypto-alg";
  10. }
  11. leaf crypto {
  12. type identityref {
  13. base "crypto:crypto-alg";
  14. }
  15. }
  16. container aes-parameters {
  17. when "../crypto = 'mc:aes'";
  18. ...
  19. }
  20. }

以下是如何将叶片“crypto”编码的例子,如果该值是在“des”模块中定义的“des3”身份:

  1. <crypto xmlns:des="urn:example:des">des:des3</crypto>

编码中使用的任何前缀对于每个实例编码都是本地的。 这意味着相同的identityref可以通过不同的实现进行不同的编码。 例如,下面的例子就像上面一样编码相同的叶子:

  1. <crypto xmlns:x="urn:example:des">x:des3</crypto>

如果在“example-my-crypto”模块中定义的“crypto”叶的值是“aes”,则它可以被编码为:

  1. <crypto xmlns:mc="urn:example:my-crypto">mc:aes</crypto>

或者,使用默认名称空间:

  1. <crypto>aes</crypto>