diff options
Diffstat (limited to 'doc/rfc/rfc6110.txt')
| -rw-r--r-- | doc/rfc/rfc6110.txt | 5603 | 
1 files changed, 5603 insertions, 0 deletions
| diff --git a/doc/rfc/rfc6110.txt b/doc/rfc/rfc6110.txt new file mode 100644 index 0000000..cb8dbc6 --- /dev/null +++ b/doc/rfc/rfc6110.txt @@ -0,0 +1,5603 @@ + + + + + + +Internet Engineering Task Force (IETF)                    L. Lhotka, Ed. +Request for Comments: 6110                                        CESNET +Category: Standards Track                                  February 2011 +ISSN: 2070-1721 + + +          Mapping YANG to Document Schema Definition Languages +                     and Validating NETCONF Content + +Abstract + +   This document specifies the mapping rules for translating YANG data +   models into Document Schema Definition Languages (DSDL), a +   coordinated set of XML schema languages standardized as ISO/IEC +   19757.  The following DSDL schema languages are addressed by the +   mapping: Regular Language for XML Next Generation (RELAX NG), +   Schematron, and Schematron and Document Schema Renaming Language +   (DSRL).  The mapping takes one or more YANG modules and produces a +   set of DSDL schemas for a selected target document type -- datastore +   content, Network Configuration Protocol (NETCONF) messages, etc. +   Procedures for schema-based validation of such documents are also +   discussed. + +Status of This Memo + +   This is an Internet Standards Track document. + +   This document is a product of the Internet Engineering Task Force +   (IETF).  It represents the consensus of the IETF community.  It has +   received public review and has been approved for publication by the +   Internet Engineering Steering Group (IESG).  Further information on +   Internet Standards is available in Section 2 of RFC 5741. + +   Information about the current status of this document, any errata, +   and how to provide feedback on it may be obtained at +   http://www.rfc-editor.org/info/rfc6110. + + + + + + + + + + + + + + + +Lhotka                       Standards Track                    [Page 1] + +RFC 6110                  Mapping YANG to DSDL             February 2011 + + +Copyright Notice + +   Copyright (c) 2011 IETF Trust and the persons identified as the +   document authors.  All rights reserved. + +   This document is subject to BCP 78 and the IETF Trust's Legal +   Provisions Relating to IETF Documents +   (http://trustee.ietf.org/license-info) in effect on the date of +   publication of this document.  Please review these documents +   carefully, as they describe your rights and restrictions with respect +   to this document.  Code Components extracted from this document must +   include Simplified BSD License text as described in Section 4.e of +   the Trust Legal Provisions and are provided without warranty as +   described in the Simplified BSD License. + +Table of Contents + +   1. Introduction ....................................................5 +   2. Terminology and Notation ........................................6 +      2.1. Glossary of New Terms ......................................9 +   3. Objectives and Motivation ......................................10 +   4. DSDL Schema Languages ..........................................11 +      4.1. RELAX NG ..................................................11 +      4.2. Schematron ................................................12 +      4.3. Document Semantics Renaming Language (DSRL) ...............13 +   5. Additional Annotations .........................................14 +      5.1. Dublin Core Metadata Elements .............................14 +      5.2. RELAX NG DTD Compatibility Annotations ....................14 +      5.3. NETMOD-Specific Annotations ...............................15 +   6. Overview of the Mapping ........................................16 +   7. NETCONF Content Validation .....................................18 +   8. Design Considerations ..........................................19 +      8.1. Hybrid Schema .............................................19 +      8.2. Modularity ................................................22 +      8.3. Granularity ...............................................23 +      8.4. Handling of XML Namespaces ................................24 +   9. Mapping YANG Data Models to the Hybrid Schema ..................25 +      9.1. Occurrence Rules for Data Nodes ...........................25 +           9.1.1. Optional and Mandatory Nodes .......................26 +           9.1.2. Implicit Nodes .....................................27 +      9.2. Mapping YANG Groupings and Typedefs .......................28 +           9.2.1. YANG Refinements and Augments ......................29 +           9.2.2. Type Derivation Chains .............................32 +      9.3. Translation of XPath Expressions ..........................35 +      9.4. YANG Language Extensions ..................................36 +   10. Mapping YANG Statements to the Hybrid Schema ..................37 +      10.1. The 'anyxml' Statement ...................................37 +      10.2. The 'argument' Statement .................................38 + + + +Lhotka                       Standards Track                    [Page 2] + +RFC 6110                  Mapping YANG to DSDL             February 2011 + + +      10.3. The 'augment' Statement ..................................39 +      10.4. The 'base' Statement .....................................39 +      10.5. The 'belongs-to' Statement ...............................39 +      10.6. The 'bit' Statement ......................................39 +      10.7. The 'case' Statement .....................................39 +      10.8. The 'choice' Statement ...................................39 +      10.9. The 'config' Statement ...................................40 +      10.10. The 'contact' Statement .................................40 +      10.11. The 'container' Statement ...............................40 +      10.12. The 'default' Statement .................................40 +      10.13. The 'description' Statement .............................42 +      10.14. The 'deviation' Statement ...............................42 +      10.15. The 'enum' Statement ....................................42 +      10.16. The 'error-app-tag' Statement ...........................42 +      10.17. The 'error-message' Statement ...........................42 +      10.18. The 'extension' Statement ...............................43 +      10.19. The 'feature' Statement .................................43 +      10.20. The 'grouping' Statement ................................43 +      10.21. The 'identity' Statement ................................43 +      10.22. The 'if-feature' Statement ..............................45 +      10.23. The 'import' Statement ..................................45 +      10.24. The 'include' Statement .................................45 +      10.25. The 'input' Statement ...................................46 +      10.26. The 'key' Statement .....................................46 +      10.27. The 'leaf' Statement ....................................46 +      10.28. The 'leaf-list' Statement ...............................46 +      10.29. The 'length' Statement ..................................47 +      10.30. The 'list' Statement ....................................47 +      10.31. The 'mandatory' Statement ...............................48 +      10.32. The 'max-elements' Statement ............................49 +      10.33. The 'min-elements' Statement ............................49 +      10.34. The 'module' Statement ..................................49 +      10.35. The 'must' Statement ....................................49 +      10.36. The 'namespace' Statement ...............................50 +      10.37. The 'notification' Statement ............................50 +      10.38. The 'ordered-by' Statement ..............................50 +      10.39. The 'organization' Statement ............................50 +      10.40. The 'output' Statement ..................................51 +      10.41. The 'path' Statement ....................................51 +      10.42. The 'pattern' Statement .................................51 +      10.43. The 'position' Statement ................................51 +      10.44. The 'prefix' Statement ..................................51 +      10.45. The 'presence' Statement ................................51 +      10.46. The 'range' Statement ...................................51 +      10.47. The 'reference' Statement ...............................51 +      10.48. The 'require-instance' Statement ........................51 +      10.49. The 'revision' Statement ................................52 +      10.50. The 'rpc' Statement .....................................52 + + + +Lhotka                       Standards Track                    [Page 3] + +RFC 6110                  Mapping YANG to DSDL             February 2011 + + +      10.51. The 'status' Statement ..................................52 +      10.52. The 'submodule' Statement ...............................52 +      10.53. The 'type' Statement ....................................53 +           10.53.1. The "empty" Type .................................54 +           10.53.2. The "boolean" Type ...............................54 +           10.53.3. The "binary" Type ................................54 +           10.53.4. The "bits" Type ..................................54 +           10.53.5. The "enumeration" and "union" Types ..............54 +           10.53.6. The "identityref" Type ...........................54 +           10.53.7. The "instance-identifier" Type ...................55 +           10.53.8. The "leafref" Type ...............................55 +           10.53.9. The Numeric Types ................................55 +           10.53.10. The "string" Type ...............................57 +           10.53.11. Derived Types ...................................58 +      10.54. The 'typedef' Statement .................................59 +      10.55. The 'unique' Statement ..................................59 +      10.56. The 'units' Statement ...................................60 +      10.57. The 'uses' Statement ....................................60 +      10.58. The 'value' Statement ...................................60 +      10.59. The 'when' Statement ....................................60 +      10.60. The 'yang-version' Statement ............................60 +      10.61. The 'yin-element' Statement .............................61 +   11. Mapping the Hybrid Schema to DSDL .............................61 +      11.1. Generating RELAX NG Schemas for Various Document Types ...61 +      11.2. Mapping Semantic Constraints to Schematron ...............62 +           11.2.1. Constraints on Mandatory Choice ...................65 +      11.3. Mapping Default Values to DSRL ...........................67 +   12. Mapping NETMOD-Specific Annotations to DSDL Schema Languages ..71 +      12.1. The @nma:config Annotation ...............................71 +      12.2. The @nma:default Annotation ..............................71 +      12.3. The <nma:error-app-tag> Annotation .......................71 +      12.4. The <nma:error-message> Annotation .......................71 +      12.5. The @if-feature Annotation ...............................71 +      12.6. The @nma:implicit Annotation .............................72 +      12.7. The <nma:instance-identifier> Annotation .................72 +      12.8. The @nma:key Annotation ..................................72 +      12.9. The @nma:leaf-list Annotation ............................72 +      12.10. The @nma:leafref Annotation .............................73 +      12.11. The @nma:min-elements Annotation ........................73 +      12.12. The @nma:max-elements Annotation ........................73 +      12.13. The <nma:must> Annotation ...............................73 +      12.14. The <nma:ordered-by> Annotation .........................74 +      12.15. The <nma:status> Annotation .............................74 +      12.16. The @nma:unique Annotation ..............................74 +      12.17. The @nma:when Annotation ................................74 +   13. IANA Considerations ...........................................75 +   14. Security Considerations .......................................75 +   15. Contributors ..................................................75 + + + +Lhotka                       Standards Track                    [Page 4] + +RFC 6110                  Mapping YANG to DSDL             February 2011 + + +   16. Acknowledgments ...............................................76 +   17. References ....................................................76 +      17.1. Normative References .....................................76 +      17.2. Informative References ...................................77 +   Appendix A. RELAX NG Schema for NETMOD-Specific Annotations .......79 +   Appendix B. Schema-Independent Library ............................84 +   Appendix C. Mapping DHCP Data Model - A Complete Example ..........85 +      C.1. Input YANG Module .........................................85 +      C.2. Hybrid Schema .............................................88 +      C.3. Final DSDL Schemas  .......................................93 +           C.3.1. Main RELAX NG Schema for <nc:get> Reply ............93 +           C.3.2. RELAX NG Schema - Global Named Pattern +                  Definitions ........................................95 +           C.3.3. Schematron Schema for <nc:get> Reply ...............98 +           C.3.4. DSRL Schema for <nc:get> Reply .....................99 + +1.  Introduction + +   The NETCONF Working Group has completed a base protocol used for +   configuration management [RFC4741].  This base specification defines +   protocol bindings and an XML container syntax for configuration and +   management operations, but does not include a data modeling language +   or accompanying rules for how to model configuration and state +   information carried by NETCONF.  The IETF Operations Area has a long +   tradition of defining data for Simple Network Management Protocol +   (SNMP) Management Information Bases (MIB) modules [RFC1157] using the +   Structure of Management Information (SMI) language [RFC2578] to model +   its data.  While this specific modeling approach has a number of +   well-understood problems, most of the data modeling features provided +   by SMI are still considered extremely important.  Simply modeling the +   valid syntax without the additional semantic relationships has caused +   significant interoperability problems in the past. + +   The NETCONF community concluded that a data modeling framework is +   needed to support ongoing development of IETF and vendor-defined +   management information modules.  The NETMOD Working Group was +   chartered to design a modeling language defining the semantics of +   operational data, configuration data, event notifications, and +   operations, with focus on "human-friendliness", i.e., readability and +   ease of use.  The result is the YANG data modeling language +   [RFC6020], which now serves for the normative description of NETCONF +   data models. + +   Since NETCONF uses XML for encoding its messages, it is natural to +   express the constraints on NETCONF content using standard XML schema +   languages.  For this purpose, the NETMOD WG selected the Document +   Schema Definition Languages (DSDL) that is being standardized as +   ISO/IEC 19757 [DSDL].  The DSDL framework comprises a set of XML + + + +Lhotka                       Standards Track                    [Page 5] + +RFC 6110                  Mapping YANG to DSDL             February 2011 + + +   schema languages that address grammar rules, semantic constraints, +   and other data modeling aspects, but also, and more importantly, do +   it in a coordinated and consistent way.  While it is true that some +   DSDL parts have not been standardized yet and are still work in +   progress, the three parts that the YANG-to-DSDL mapping relies upon +   -- Regular Language for XML Next Generation (RELAX NG), Schematron +   and Document Schema Renaming Language (DSRL) -- already have the +   status of an ISO/ IEC International Standard and are supported in a +   number of software tools. + +   This document contains a specification of a mapping that translates +   YANG data models to XML schemas utilizing a subset of the DSDL schema +   languages.  The mapping procedure is divided into two steps: In the +   first step, the structure of the data tree, signatures of remote +   procedure call (RPC) operations, and notifications are expressed as +   the so-called "hybrid schema" -- a single RELAX NG schema with +   annotations representing additional data model information (metadata, +   documentation, semantic constraints, default values, etc.).  The +   second step then generates a coordinated set of DSDL schemas that can +   be used for validating specific XML documents such as client +   requests, server responses or notifications, perhaps also taking into +   account additional context such as active capabilities or features. + +2.  Terminology and Notation + +   The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", +   "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this +   document are to be interpreted as described in [RFC2119]. + +   The following terms are defined in [RFC4741]: + +   o  client + +   o  datastore + +   o  message + +   o  operation + +   o  server + +   The following terms are defined in [RFC6020]: + +   o  augment + +   o  base type + +   o  built-in type + + + +Lhotka                       Standards Track                    [Page 6] + +RFC 6110                  Mapping YANG to DSDL             February 2011 + + +   o  configuration data + +   o  container + +   o  data model + +   o  data node + +   o  data tree + +   o  derived type + +   o  device deviation + +   o  extension + +   o  feature + +   o  grouping + +   o  instance identifier + +   o  leaf-list + +   o  list + +   o  mandatory node + +   o  module + +   o  RPC + +   o  RPC operation + +   o  schema node + +   o  schema tree + +   o  state data + +   o  submodule + +   o  top-level data node + +   o  uses + + + + + + +Lhotka                       Standards Track                    [Page 7] + +RFC 6110                  Mapping YANG to DSDL             February 2011 + + +   The following terms are defined in [XML-INFOSET]: + +   o  attribute + +   o  document + +   o  document element + +   o  document type declaration (DTD) + +   o  element + +   o  information set + +   o  namespace + +   In the text, the following typographic conventions are used: + +   o  YANG statement keywords are delimited by single quotes. + +   o  XML element names are delimited by "<" and ">" characters. + +   o  Names of XML attributes are prefixed by the "@" character. + +   o  Other literal values are delimited by double quotes. + +   XML element names are always written with explicit namespace prefixes +   corresponding to the following XML vocabularies: + +   "a"  DTD compatibility annotations [RNG-DTD]; + +   "dc"  Dublin Core metadata elements [RFC5013]; + +   "dsrl"  Document Semantics Renaming Language [DSRL]; + +   "en"  NETCONF event notifications [RFC5277]; + +   "nc"  NETCONF protocol [RFC4741]; + +   "nma"  NETMOD-specific schema annotations (see Section 5.3); + +   "nmf"  NETMOD-specific XML Path Language (XPath) extension functions +      (see Section 12.7); + +   "rng"  RELAX NG [RNG]; + +   "sch"  ISO Schematron [Schematron]; + + + + +Lhotka                       Standards Track                    [Page 8] + +RFC 6110                  Mapping YANG to DSDL             February 2011 + + +   "xsd"  W3C XML Schema [XSD]. + +   The following table shows the mapping of these prefixes to namespace +   URIs. + +     +--------+-----------------------------------------------------+ +     | Prefix | Namespace URI                                       | +     +--------+-----------------------------------------------------+ +     | a      | http://relaxng.org/ns/compatibility/annotations/1.0 | +     |        |                                                     | +     | dc     | http://purl.org/dc/terms                            | +     |        |                                                     | +     | dsrl   | http://purl.oclc.org/dsdl/dsrl                      | +     |        |                                                     | +     | en     | urn:ietf:params:xml:ns:netconf:notification:1.0     | +     |        |                                                     | +     | nc     | urn:ietf:params:xml:ns:netconf:base:1.0             | +     |        |                                                     | +     | nma    | urn:ietf:params:xml:ns:netmod:dsdl-annotations:1    | +     |        |                                                     | +     | nmf    | urn:ietf:params:xml:ns:netmod:xpath-extensions:1    | +     |        |                                                     | +     | rng    | http://relaxng.org/ns/structure/1.0                 | +     |        |                                                     | +     | sch    | http://purl.oclc.org/dsdl/schematron                | +     |        |                                                     | +     | xsd    | http://www.w3.org/2001/XMLSchema                    | +     +--------+-----------------------------------------------------+ + +          Table 1: Used namespace prefixes and corresponding URIs + +2.1.  Glossary of New Terms + +   o  ancestor data type: Any data type from which a given data type is +      (transitively) derived. + +   o  ancestor built-in data type: The built-in data type that is at the +      start of the type derivation chain for a given data type. + +   o  hybrid schema: A RELAX NG schema with annotations, which embodies +      the same information as the source YANG module(s).  See +      Section 8.1 for details. + +   o  implicit node: A data node that, if it is not instantiated in a +      data tree, may be added to the information set of that data tree +      (configuration, RPC input or output, notification) without +      changing the semantics of the data tree. + + + + +Lhotka                       Standards Track                    [Page 9] + +RFC 6110                  Mapping YANG to DSDL             February 2011 + + +3.  Objectives and Motivation + +   The main objective of this work is to complement YANG as a data +   modeling language with validation capabilities of DSDL schema +   languages, namely RELAX NG, Schematron, and DSRL.  This document +   describes the correspondence between grammatical, semantic, and data +   type constraints expressed in YANG and equivalent DSDL patterns and +   rules.  The ultimate goal is to be able to capture all substantial +   information contained in YANG modules and express it in DSDL schemas. +   While the mapping from YANG to DSDL described in this document may in +   principle be invertible, the inverse mapping from DSDL to YANG is +   beyond the scope of this document. + +   XML-based information models and XML-encoded data appear in several +   different forms in various phases of YANG data modeling and NETCONF +   workflow -- configuration datastore contents, RPC requests and +   replies, and notifications.  Moreover, RPC operations are +   characterized by an inherent diversity resulting from selective +   availability of capabilities and features.  YANG modules can also +   define new RPC operations.  The mapping should be able to accommodate +   this variability and generate schemas that are specifically tailored +   to a particular situation and thus considerably more effective for +   validation than generic all-encompassing schemas. + +   In order to cope with this variability, we assume that the DSDL +   schemas will be generated on demand for a particular purpose from the +   available collection of YANG modules and their lifetime will be +   relatively short.  In other words, we don't envision that any +   collection of DSDL schemas will be created and maintained over an +   extended period of time in parallel to YANG modules. + +   The generated schemas are primarily intended as input to existing XML +   schema validators and other off-the-shelf tools.  However, the +   schemas may also be perused by developers and users as a formal +   representation of constraints on a particular XML-encoded data +   object.  Consequently, our secondary goal is to keep the schemas as +   readable as possible.  To this end, the complexity of the mapping is +   distributed into two steps: + +   1.  The first step maps one or more YANG modules to the so-called +       hybrid schema, which is a single RELAX NG schema that describes +       grammatical constraints for the main data tree as well as for RPC +       operations and notifications.  Semantic constraints and other +       information appearing in the input YANG modules is recorded in +       the hybrid schema in the form of foreign namespace annotations. +       The output of the first step can thus be considered a virtually +       complete equivalent of the input YANG modules.  It cannot, +       however, be directly used for any validation. + + + +Lhotka                       Standards Track                   [Page 10] + +RFC 6110                  Mapping YANG to DSDL             February 2011 + + +   2.  In the second step, the hybrid schema from step 1 is transformed +       further to a coordinated set of fully conformant DSDL schemas +       containing constraints for a particular data object and a +       specific situation.  The DSDL schemas are intended mainly for +       machine validation using off-the-shelf tools. + +4.  DSDL Schema Languages + +   Document Schema Definition Languages (DSDL) is a framework of schema +   languages that is being developed as the International Standard ISO/ +   IEC 19757 [DSDL].  Unlike other approaches to XML document +   validation, most notably W3C XML Schema Definition (XSD) [XSD], the +   DSDL framework adheres to the principle of "small languages": each of +   the DSDL constituents is a stand-alone schema language with a +   relatively narrow purpose and focus.  Together, these schema +   languages may be used in a coordinated way to accomplish various +   validation tasks. + +   The mapping described in this document uses three of the DSDL schema +   languages, namely RELAX NG [RNG], Schematron [Schematron], and DSRL +   [DSRL]. + +4.1.  RELAX NG + +   RELAX NG (pronounced "relaxing") is an XML schema language for +   grammar-based validation and Part 2 of the ISO/IEC DSDL family of +   standards [RNG].  Like XSD, it is able to describe constraints on the +   structure and contents of XML documents.  However, unlike the DTD +   [XML] and XSD schema languages, RELAX NG intentionally avoids any +   infoset augmentation such as defining default values.  In the DSDL +   architecture, the particular task of defining and applying default +   values is delegated to another schema language, DSRL (see +   Section 4.3). + +   As its base data type library, RELAX NG uses the W3C XML Schema +   Datatypes [XSD-D]; but unlike XSD, other data type libraries may be +   used along with it or even replace it if necessary. + +   RELAX NG is very liberal in accepting annotations from other +   namespaces.  With a few exceptions, such annotations may be placed +   anywhere in the schema and need no encapsulating elements such as +   <xsd:annotation> in XSD. + + + + + + + + + +Lhotka                       Standards Track                   [Page 11] + +RFC 6110                  Mapping YANG to DSDL             February 2011 + + +   RELAX NG schemas can be represented in two equivalent syntaxes: XML +   and compact.  The compact syntax is described in Annex C of the RELAX +   NG specification [RNG-CS], which was added to the standard in 2006 +   (Amendment 1).  Automatic bidirectional conversions between the two +   syntaxes can be accomplished using several tools, for example, Trang +   [Trang]. + +   For its terseness and readability, the compact syntax is often the +   preferred form for publishing RELAX NG schemas, whereas validators +   and other software tools usually work with the XML syntax.  However, +   the compact syntax has two drawbacks: + +   o  External annotations make the compact syntax schema considerably +      less readable.  While in the XML syntax the annotating elements +      and attributes are represented in a simple and uniform way (XML +      elements and attributes from foreign namespaces), the compact +      syntax uses as many as four different syntactic constructs: +      documentation, grammar, initial, and following annotations. +      Therefore, the impact of annotations on readability is often much +      stronger for the compact syntax than it is for the XML syntax. + +   o  In a computer program, it is more difficult to generate the +      compact syntax than the XML syntax.  While a number of software +      libraries exist that make it easy to create an XML tree in the +      memory and then serialize it, no such aid is available for the +      compact syntax. + +   For these reasons, the mapping specification in this document uses +   exclusively the XML syntax.  Where appropriate, though, the schemas +   resulting from the translation MAY be presented in the equivalent +   compact syntax. + +   RELAX NG elements are qualified with the namespace URI +   "http://relaxng.org/ns/structure/1.0".  The namespace of the XSD data +   type library is "http://www.w3.org/2001/XMLSchema-datatypes". + +4.2.  Schematron + +   Schematron is Part 3 of DSDL that reached the status of a full ISO/ +   IEC standard in 2006 [Schematron].  In contrast to the traditional +   schema languages such as DTD, XSD, or RELAX NG, which are based on +   the concept of a formal grammar, Schematron utilizes a rule-based +   approach.  Its rules may specify arbitrary conditions involving data +   from different parts of an XML document.  Each rule consists of three +   essential components: + +   o  context - an XPath expression that defines the set of locations +      where the rule is to be applied; + + + +Lhotka                       Standards Track                   [Page 12] + +RFC 6110                  Mapping YANG to DSDL             February 2011 + + +   o  assert or report condition - another XPath expression that is +      evaluated relative to the location matched by the context +      expression; + +   o  human-readable message that is displayed when the assert condition +      is false or report condition is true. + +   The difference between the assert and report condition is that the +   former is positive in that it states a condition that a valid +   document has to satisfy, whereas the latter specifies an error +   condition. + +   Schematron draws most of its expressive power from XPath [XPath] and +   Extensible Stylesheet Language Transformations (XSLT) [XSLT].  ISO +   Schematron allows for dynamic query language binding so that the +   following XML query languages can be used: STX, XSLT 1.0, XSLT 1.1, +   EXSLT, XSLT 2.0, XPath 1.0, XPath 2.0, and XQuery 1.0 (this list may +   be extended in the future). + +   Human-readable error messages are another feature that sets +   Schematron apart from other common schema languages.  The messages +   may even contain XPath expressions that are evaluated in the actual +   context and thus refer to information items in the XML document being +   validated. + +   Another feature of Schematron that is used by the mapping are +   abstract patterns.  These work essentially as macros and may also +   contain parameters which are supplied when the abstract pattern is +   used. + +   Schematron elements are qualified with namespace URI +   "http://purl.oclc.org/dsdl/schematron". + +4.3.  Document Semantics Renaming Language (DSRL) + +   DSRL (pronounced "disrule") is Part 8 of DSDL that reached the status +   of a full ISO/IEC standard in 2008 [DSRL].  Unlike RELAX NG and +   Schematron, DSRL is allowed to modify XML information set of the +   validated document.  While DSRL is primarily intended for renaming +   XML elements and attributes, it can also define default values for +   XML attributes and default contents for XML elements or subtrees so +   that the default contents are inserted if they are missing in the +   validated documents.  The latter feature is used by the YANG-to-DSDL +   mapping for representing YANG default contents consisting of leaf +   nodes with default values and their ancestor non-presence containers. + +   DSRL elements are qualified with namespace URI +   "http://purl.oclc.org/dsdl/dsrl". + + + +Lhotka                       Standards Track                   [Page 13] + +RFC 6110                  Mapping YANG to DSDL             February 2011 + + +5.  Additional Annotations + +   Besides the DSDL schema languages, the mapping also uses three sets +   of annotations that are added as foreign-namespace attributes and +   elements to RELAX NG schemas. + +   Two of the annotation sets -- Dublin Core elements and DTD +   compatibility annotations -- are standard vocabularies for +   representing metadata and documentation, respectively.  Although +   these data model items are not used for formal validation, they quite +   often carry important information for data model implementers. +   Therefore, they SHOULD be included in the hybrid schema and MAY also +   appear in the final validation schemas. + +   The third set are NETMOD-specific annotations.  They are specifically +   designed for the hybrid schema and convey semantic constraints and +   other information that cannot be expressed directly in RELAX NG.  In +   the second mapping step, these annotations are converted to +   Schematron and DSRL rules. + +5.1.  Dublin Core Metadata Elements + +   Dublin Core is a system of metadata elements that was originally +   created for describing metadata of World Wide Web resources in order +   to facilitate their automated lookup.  Later it was accepted as a +   standard for describing metadata of arbitrary resources.  This +   specification uses the definition from [RFC5013]. + +   Dublin Core elements are qualified with namespace URI +   "http://purl.org/dc/terms". + +5.2.  RELAX NG DTD Compatibility Annotations + +   DTD compatibility annotations are a part of the RELAX NG DTD +   Compatibility specification [RNG-DTD].  YANG-to-DSDL mapping uses +   only the <a:documentation> annotation for representing YANG +   'description' and 'reference' texts. + +   Note that there is no intention to make the resulting schemas DTD- +   compatible, the main reason for using these annotations is technical: +   they are well supported and adequately formatted by several RELAX NG +   tools. + +   DTD compatibility annotations are qualified with namespace URI +   "http://relaxng.org/ns/compatibility/annotations/1.0". + + + + + + +Lhotka                       Standards Track                   [Page 14] + +RFC 6110                  Mapping YANG to DSDL             February 2011 + + +5.3.  NETMOD-Specific Annotations + +   NETMOD-specific annotations are XML elements and attributes that are +   qualified with the namespace URI +   "urn:ietf:params:xml:ns:netmod:dsdl-annotations:1" and that appear in +   various locations of the hybrid schema.  YANG statements are mapped +   to these annotations in a straightforward way.  In most cases, the +   annotation attributes and elements have the same name as the +   corresponding YANG statement. + +   Table 2 lists, alphabetically, the names of NETMOD-specific +   annotation attributes (prefixed with "@") and elements (in angle +   brackets) along with a reference to the section where their use is +   described.  Appendix A contains a RELAX NG schema for this annotation +   vocabulary. + +         +---------------------------+--------------------+------+ +         | annotation                | section            | note | +         +---------------------------+--------------------+------+ +         | @nma:config               | 10.9               |      | +         |                           |                    |      | +         | <nma:data>                | 8.1                | 4    | +         |                           |                    |      | +         | @nma:default              | 10.12              |      | +         |                           |                    |      | +         | <nma:error-app-tag>       | 10.16              | 1    | +         |                           |                    |      | +         | <nma:error-message>       | 10.17              | 1    | +         |                           |                    |      | +         | @nma:if-feature           | 10.22              |      | +         |                           |                    |      | +         | @nma:implicit             | 10.11, 10.7, 10.12 |      | +         |                           |                    |      | +         | <nma:input>               | 8.1                | 4    | +         |                           |                    |      | +         | <nma:instance-identifier> | 10.53.7            | 2    | +         |                           |                    |      | +         | @nma:key                  | 10.26              |      | +         |                           |                    |      | +         | @nma:leaf-list            | 10.28              |      | +         |                           |                    |      | +         | @nma:leafref              | 10.53.8            |      | +         |                           |                    |      | +         | @nma:mandatory            | 10.8               |      | +         |                           |                    |      | +         | @nma:max-elements         | 10.28              |      | +         |                           |                    |      | +         | @nma:min-elements         | 10.28              |      | + + + +Lhotka                       Standards Track                   [Page 15] + +RFC 6110                  Mapping YANG to DSDL             February 2011 + + +         |                           |                    |      | +         | @nma:module               | 10.34              |      | +         |                           |                    |      | +         | <nma:must>                | 10.35              | 3    | +         |                           |                    |      | +         | <nma:notification>        | 8.1                | 4    | +         |                           |                    |      | +         | <nma:notifications>       | 8.1                | 4    | +         |                           |                    |      | +         | @nma:ordered-by           | 10.38              |      | +         | <nma:output>              | 8.1                | 4    | +         |                           |                    |      | +         | <nma:rpc>                 | 8.1                | 4    | +         |                           |                    |      | +         | <nma:rpcs>                | 8.1                | 4    | +         |                           |                    |      | +         | @nma:status               | 10.51              |      | +         |                           |                    |      | +         | @nma:unique               | 10.55              |      | +         |                           |                    |      | +         | @nma:units                | 10.56              |      | +         |                           |                    |      | +         | @nma:when                 | 10.59              |      | +         +---------------------------+--------------------+------+ + +                   Table 2: NETMOD-specific annotations + +   Notes: + +   1.  Appears only as a subelement of <nma:must>. + +   2.  Has an optional attribute @require-instance. + +   3.  Has a mandatory attribute @assert and two optional subelements +       <nma:error-app-tag> and <nma:error-message>. + +   4.  Marker element in the hybrid schema. + +6.  Overview of the Mapping + +   This section gives an overview of the YANG-to-DSDL mapping, its +   inputs and outputs.  Figure 1 presents an overall structure of the +   mapping: + + + + + + + + +Lhotka                       Standards Track                   [Page 16] + +RFC 6110                  Mapping YANG to DSDL             February 2011 + + +                    +----------------+ +                    | YANG module(s) | +                    +----------------+ +                            | +                            |T +                            | +          +------------------------------------+ +          |           hybrid schema            | +          +------------------------------------+ +               /       |           |       \ +              /        |           |        \ +           Tg/       Tr|           |Tn       \ +            /          |           |          \ +      +---------+   +-----+    +-------+    +------+ +      |get reply|   | rpc |    | notif |    | .... | +      +---------+   +-----+    +-------+    +------+ + +                    Figure 1: Structure of the mapping + +   The mapping procedure is divided into two steps: + +   1.  Transformation T in the first step maps one or more YANG modules +       to the hybrid schema (see Section 8.1).  Constraints that cannot +       be expressed directly in RELAX NG (list key definitions, 'must' +       statements, etc.) and various documentation texts are recorded in +       the schema as foreign-namespace annotations. + +   2.  In the second step, the hybrid schema may be transformed in +       multiple ways to a coordinated set of DSDL schemas that can be +       used for validating a particular data object in a specific +       context.  Figure 1 shows three simple possibilities as examples. +       In the process, appropriate parts of the hybrid schema are +       extracted and specific annotations transformed to equivalent, but +       usually more complex, Schematron patterns, DSRL element maps, +       etc. + +   An implementation of the mapping algorithm MUST accept one or more +   valid YANG modules as its input.  It is important to be able to +   process multiple YANG modules together since multiple modules may be +   negotiated for a NETCONF session and the contents of the +   configuration datastore is then obtained as the union of data trees +   specified by the individual modules, which may also lead to multiple +   root nodes of the datastore hierarchy.  In addition, the input +   modules may be further coupled by the 'augment' statement in which +   one module augments the data tree of another module. + + + + + + +Lhotka                       Standards Track                   [Page 17] + +RFC 6110                  Mapping YANG to DSDL             February 2011 + + +   It is also assumed that the algorithm has access, perhaps on demand, +   to all YANG modules that the input modules import (directly or +   transitively). + +   Other information contained in input YANG modules, such as semantic +   constraints and default values, is recorded in the hybrid schema as +   annotations -- XML attributes or elements qualified with the +   namespace URI "urn:ietf:params:xml:ns:netmod:dsdl-annotations:1". +   Metadata describing the YANG modules are mapped to Dublin Core +   annotations elements (Section 5.1).  Finally, documentation strings +   are mapped to <a:documentation> elements belonging to the DTD +   compatibility vocabulary (Section 5.2). + +   The output of the second step is a coordinated set of three DSDL +   schemas corresponding to a specific data object and context: + +   o  RELAX NG schema describing the grammatical and data type +      constraints; + +   o  Schematron schema expressing other constraints such as uniqueness +      of list keys or user-specified semantic rules; + +   o  DSRL schema containing the specification of default contents. + +7.  NETCONF Content Validation + +   This section describes how the schemas generated by the YANG-to-DSDL +   mapping are supposed to be applied for validating XML instance +   documents such as the contents of a datastore or various NETCONF +   messages. + +   The validation proceeds in the following steps, which are also +   illustrated in Figure 2: + +   1.  The XML instance document is checked for grammatical and data +       type validity using the RELAX NG schema. + +   2.  Default values for leaf nodes have to be applied and their +       ancestor containers added where necessary.  It is important to +       add the implicit nodes before the next validation step because +       YANG specification [RFC6020] requires that the data tree against +       which XPath expressions are evaluated already has all defaults +       filled-in.  Note that this step modifies the information set of +       the validated XML document. + +   3.  The semantic constraints are checked using the Schematron schema. + + + + + +Lhotka                       Standards Track                   [Page 18] + +RFC 6110                  Mapping YANG to DSDL             February 2011 + + +         +----------+                        +----------+ +         |          |                        |   XML    | +         |   XML    |                        | document | +         | document |-----------o----------->|   with   | +         |          |           ^            | defaults | +         |          |           |            |          | +         +----------+           |            +----------+ +              ^                 | filling in       ^ +              | grammar,        | defaults         | semantic +              | data types       |                  | constraints +              |                 |                  | +         +----------+       +--------+       +------------+ +         | RELAX NG |       |  DSRL  |       | Schematron | +         |  schema  |       | schema |       |   schema   | +         +----------+       +--------+       +------------+ + +               Figure 2: Outline of the validation procedure + +8.  Design Considerations + +   YANG data models could, in principle, be mapped to the DSDL schemas +   in a number of ways.  The mapping procedure described in this +   document uses several specific design decisions that are discussed in +   the following subsections. + +8.1.  Hybrid Schema + +   As was explained in Section 6, the first step of the mapping produces +   an intermediate document -- the hybrid schema, which specifies all +   constraints for the entire data model using the RELAX NG syntax and +   additional annotations.  In cannot be directly used for validation -- +   as a matter of fact, it is not even a valid RELAX NG schema because +   it contains multiple schemas demarcated by special annotation +   elements. + +   Every input YANG module corresponds to exactly one embedded grammar +   in the hybrid schema.  This separation of input YANG modules allows +   each embedded grammar to include named pattern definitions into its +   own namespace, which is important for mapping YANG groupings (see +   Section 9.2 for additional details). + +   In addition to grammatical and data type constraints, YANG modules +   provide other important information that cannot be expressed in a +   RELAX NG schema: semantic constraints, default values, metadata, +   documentation, and so on.  Such information items are represented in + + + + + + +Lhotka                       Standards Track                   [Page 19] + +RFC 6110                  Mapping YANG to DSDL             February 2011 + + +   the hybrid schema as XML attributes and elements belonging to the +   namespace with the following URI: +   "urn:ietf:params:xml:ns:netmod:dsdl-annotations:1".  A complete list +   of these annotations is given in Section 5.3, detailed rules about +   their use are then contained in the following sections. + +   YANG modules define data models not only for configuration and state +   data but also for (multiple) RPC operations [RFC4741] and/or event +   notifications [RFC5277].  In order to be able to capture all three +   types of data models in one schema document, the hybrid schema uses +   special markers that enclose sub-schemas for configuration and state +   data, individual RPC operations (both input and output part) and +   individual notifications. + +   The markers are the following XML elements in the namespace of +   NETMOD-specific annotations (URI +   urn:ietf:params:xml:ns:netmod:dsdl-annotations:1): + +       +-------------------+---------------------------------------+ +       | Element name      | Role                                  | +       +-------------------+---------------------------------------+ +       | nma:data          | encloses configuration and state data | +       |                   |                                       | +       | nma:rpcs          | encloses all RPC operations           | +       |                   |                                       | +       | nma:rpc           | encloses an individual RPC operation  | +       |                   |                                       | +       | nma:input         | encloses an RPC request               | +       |                   |                                       | +       | nma:output        | encloses an RPC reply                 | +       |                   |                                       | +       | nma:notifications | encloses all notifications            | +       |                   |                                       | +       | nma:notification  | encloses an individual notification   | +       +-------------------+---------------------------------------+ + +               Table 3: Marker elements in the hybrid schema + +   For example, consider a data model formed by two YANG modules +   "example-a" and "example-b" that define nodes in the namespaces +   "http://example.com/ns/example-a" and +   "http://example.com/ns/example-b".  Module "example-a" defines +   configuration/state data, RPC methods and notifications, whereas +   "example-b" defines only configuration/state data.  The hybrid schema +   can then be schematically represented as follows: + + + + + + +Lhotka                       Standards Track                   [Page 20] + +RFC 6110                  Mapping YANG to DSDL             February 2011 + + +  <grammar xmlns="http://relaxng.org/ns/structure/1.0" +           xmlns:nma="urn:ietf:params:xml:ns:netmod:dsdl-annotations:1" +           xmlns:exa="http://example.com/ns/example-a" +           xmlns:exb="http://example.com/ns/example-b" +           datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes"> +    <start> +      <grammar nma:module="example-a" +               ns="http://example.com/ns/example-a"> +        <start> +          <nma:data> +            ...configuration and state data defined in "example-a"... +          </nma:data> +          <nma:rpcs> +            <nma:rpc> +              <nma:input> +                <element name="exa:myrpc"> +                  ... +                </element> +              </nma:input> +              <nma:output> +                ... +              </nma:output> +            </nma:rpc> +            ... +          </nma:rpcs> +          <nma:notifications> +            <nma:notification> +              <element name="exa:mynotif"> +                ... +              </element> +            </nma:notification> +            ... +          </nma:notifications> +        </start> +        ...local named pattern definitions of example-a... +      </grammar> +      <grammar nma:module="example-b" +               ns="http://example.com/ns/example-a"> +        <start> +          <nma:data> +            ...configuration and state data defined in "example-b"... +          </nma:data> +          <nma:rpcs/> +          <nma:notifications/> +        </start> +        ...local named pattern definitions of example-b... +      </grammar> +    </start> + + + +Lhotka                       Standards Track                   [Page 21] + +RFC 6110                  Mapping YANG to DSDL             February 2011 + + +    ...global named pattern definitions... +  </grammar> + +   A complete hybrid schema for the data model of a DHCP server is given +   in Appendix C.2. + +8.2.  Modularity + +   Both YANG and RELAX NG offer means for modularity, i.e., for +   splitting the contents of a full schema into separate modules and +   combining or reusing them in various ways.  However, the approaches +   taken by YANG and RELAX NG differ.  Modularity in RELAX NG is +   suitable for ad hoc combinations of a small number of schemas whereas +   YANG assumes a large set of modules similar to SNMP MIB modules.  The +   following differences are important: + +   o  In YANG, whenever module A imports module B, it gets access to the +      definitions (groupings and typedefs) appearing at the top level of +      module B.  However, no part of data tree from module B is imported +      along with it.  In contrast, the <rng:include> pattern in RELAX NG +      imports both definitions of named patterns and the entire schema +      tree from the included schema. + +   o  The names of imported YANG groupings and typedefs are qualified +      with the namespace of the imported module.  On the other hand, the +      names of data nodes contained inside the imported groupings, when +      used within the importing module, become part of the importing +      module's namespace.  In RELAX NG, the names of patterns are +      unqualified and so named patterns defined in both the importing +      and imported module share the same flat namespace.  The contents +      of RELAX NG named patterns may either keep the namespace of the +      schema where they are defined or inherit the namespace of the +      importing module, analogically to YANG.  However, in order to +      achieve the latter behavior, the definitions of named patterns +      must be included from an external schema, which has to be prepared +      in a special way (see [Vli04], Chapter 11). + +   In order to map, as much as possible, the modularity of YANG to RELAX +   NG, a validating RELAX NG schema (the result of the second mapping +   step) has to be split into two files, one of them containing all +   global definitions that are mapped from top-level YANG groupings +   appearing in all input YANG module.  This RELAX NG schema MUST NOT +   define any namespace via the @ns attribute. + +   The other RELAX NG schema file then defines actual data trees mapped +   from input YANG modules, each of them enclosed in an own embedded +   grammar.  Those embedded grammars, in which at least one of the +   global definitions is used, MUST include the first schema with + + + +Lhotka                       Standards Track                   [Page 22] + +RFC 6110                  Mapping YANG to DSDL             February 2011 + + +   definitions and also MUST define the local namespace using the @ns +   attribute.  This way, the global definitions can be used inside +   different embedded grammar, each time accepting a different local +   namespace. + +   Named pattern definitions that are mapped from non-top-level YANG +   groupings MUST be placed inside the embedded grammar corresponding to +   the YANG module where the grouping is defined. + +   In the hybrid schema, we need to distinguish the global and non- +   global named pattern definitions while still keeping the hybrid +   schema in one file.  This is accomplished in the following way: + +   o  Every global definition MUST be placed as a child of the outer +      <rng:grammar> element (the document root of the hybrid schema). + +   o  Every non-global definitions MUST be placed as a child of the +      corresponding embedded <rng:grammar> element. + +   YANG also allows for splitting a module into a number of submodules. +   However, as submodules have no impact on the scope of identifiers and +   namespaces, the modularity based on submodules is not mapped in any +   way.  The contents of submodules is therefore handled as if the +   submodule text appeared directly in the main module. + +8.3.  Granularity + +   RELAX NG supports different styles of schema structuring: one +   extreme, often called "Russian Doll", specifies the structure of an +   XML instance document in a single hierarchy.  The other extreme, the +   flat style, uses a similar approach as the Data Type Definition (DTD) +   schema language -- every XML element corresponds to a named pattern +   definition.  In practice, some compromise between the two extremes is +   usually chosen. + +   YANG supports both styles in principle, too, but in most cases the +   modules are organized in a way closer to the "Russian Doll" style, +   which provides a better insight into the structure of the +   configuration data.  Groupings are usually defined only for contents +   that are prepared for reuse in multiple places via the 'uses' +   statement.  In contrast, RELAX NG schemas tend to be much flatter, +   because finer granularity is also needed in RELAX NG for +   extensibility of the schemas -- it is only possible to replace or +   modify schema fragments that are factored out as named patterns.  For +   YANG, this is not an issue since its 'augment' and 'refine' +   statements can delve, by using path expressions, into arbitrary +   depths of existing structures. + + + + +Lhotka                       Standards Track                   [Page 23] + +RFC 6110                  Mapping YANG to DSDL             February 2011 + + +   In general, it is not feasible to map YANG's powerful extension +   mechanisms to those available in RELAX NG.  For this reason, the +   mapping essentially keeps the granularity of the original YANG data +   model: YANG groupings and definitions of derived types usually have +   direct counterparts in definitions of named patterns in the resulting +   RELAX NG schema. + +8.4.  Handling of XML Namespaces + +   Most modern XML schema languages, including RELAX NG, Schematron, and +   DSRL, support schemas for so-called compound XML documents that +   contain elements from multiple namespaces.  This is useful for our +   purpose since the YANG-to-DSDL mapping allows for multiple input YANG +   modules, which naturally leads to compound document schemas. + +   RELAX NG offers two alternatives for defining the target namespaces +   in the schema: + +   1.  First possibility is the traditional XML way via the @xmlns:xxx +       attribute. + +   2.  One of the target namespace URIs may be declared using the @ns +       attribute. + +   In both the hybrid schema and validation RELAX NG schemas generated +   in the second step, the namespaces MUST be declared as follows: + +   1.  The root <rng:grammar> MUST have @xmlns:xxx attributes declaring +       prefixes of all namespaces that are used in the data model.  The +       prefixes SHOULD be identical to those defined in the 'prefix' +       statements.  An implementation of the mapping MUST resolve all +       collisions in the prefixes defined by different input modules, if +       there are any. + +   2.  Each embedded <rng:grammar> element MUST declare the namespace of +       the corresponding module using the @ns attribute.  This way, the +       names of nodes defined by global named patterns are able to adopt +       the local namespace of each embedded grammar, as explained in +       Section 8.2. + +   This setup is illustrated by the example at the end of Section 8.1. + +   DSRL schemas may declare any number of target namespaces via the +   standard XML attributes xmlns:xxx. + +   In contrast, Schematron requires all used namespaces to be defined in +   the <sch:ns> subelements of the document element <sch:schema>. + + + + +Lhotka                       Standards Track                   [Page 24] + +RFC 6110                  Mapping YANG to DSDL             February 2011 + + +9.  Mapping YANG Data Models to the Hybrid Schema + +   This section explains the main principles governing the first step of +   the mapping.  Its result is the hybrid schema that is described in +   Section 8.1. + +   A detailed specification of the mapping of individual YANG statements +   is contained in Section 10. + +9.1.  Occurrence Rules for Data Nodes + +   In DSDL schema languages, occurrence constraints for a node are +   always localized together with that node.  In a RELAX NG schema, for +   example, the <rng:optional> pattern appears as the parent element of +   the pattern defining a leaf or non-leaf element.  Similarly, DSRL +   specifies default contents separately for every single node, be it a +   leaf or non-leaf element. + +   For leaf nodes in YANG modules, the occurrence constraints are also +   easily inferred from the substatements of 'leaf'.  On the other hand, +   for a YANG container, it is often necessary to examine its entire +   subtree in order to determine the container's occurrence constraints. + +   Therefore, one of the goals of the first mapping step is to infer the +   occurrence constraints for all data nodes and mark, accordingly, the +   corresponding <rng:element> patterns in the hybrid schema so that any +   transformation procedure in the second mapping step can simply use +   this information and need not examine the subtree again. + +   First, it has to be decided whether a given data node must always be +   present in a valid configuration.  If so, such a node is called +   mandatory, otherwise it is called optional.  This constraint is +   closely related to the notion of mandatory nodes in Section 3.1 in +   [RFC6020].  The only difference is that this document also considers +   list keys to be mandatory. + +   The other occurrence constraint has to do with the semantics of the +   'default' statement and the possibility of removing empty non- +   presence containers.  As a result, the information set of a valid +   configuration may be modified by adding or removing certain leaf or +   container elements without changing the meaning of the configuration. +   In this document, such elements are called implicit.  In the hybrid +   schema, they can be identified as RELAX NG patterns having either the +   @nma:default or the @nma:implicit attribute. + + + + + + + +Lhotka                       Standards Track                   [Page 25] + +RFC 6110                  Mapping YANG to DSDL             February 2011 + + +   Note that both occurrence constraints apply to containers at the top +   level of the data tree, and then also to other containers under the +   additional condition that their parent node exists in the instance +   document.  For example, consider the following YANG fragment: + +       container outer { +           presence 'Presence of "outer" means something.'; +           container c1 { +               leaf foo { +                   type uint8; +                   default 1; +               } +           } +           container c2 { +               leaf-list bar { +                   type uint8; +                   min-elements 0; +               } +           } +           container c3 { +               leaf baz { +                   type uint8; +                   mandatory true; +               } +           } +       } + +   Here, container "outer" has the 'presence' substatement, which means +   that it is optional and not implicit.  If "outer" is not present in a +   configuration, its child containers are not present as well. +   However, if "outer" does exist, it makes sense to ask which of its +   child containers are optional and which are implicit.  In this case, +   "c1" is optional and implicit, "c2" is optional but not implicit, and +   "c3" is mandatory (and therefore not implicit). + +   The following subsections give precise rules for determining whether +   a container is optional or mandatory and whether it is implicit.  In +   order to simplify the recursive definition of these occurrence +   characteristics, it is useful to define them also for other types of +   YANG schema nodes, i.e., leaf, list, leaf-list, anyxml, and choice. + +9.1.1.  Optional and Mandatory Nodes + +   The decision whether a given node is mandatory or optional is +   governed by the following rules: + + + + + + +Lhotka                       Standards Track                   [Page 26] + +RFC 6110                  Mapping YANG to DSDL             February 2011 + + +   o  Leaf, anyxml, and choice nodes are mandatory if they contain the +      substatement "mandatory true;".  For a choice node, this means +      that at least one node from exactly one case branch must exist. + +   o  In addition, a leaf node is mandatory if it is declared as a list +      key. + +   o  A list or leaf-list node is mandatory if it contains the 'min- +      elements' substatement with an argument value greater than zero. + +   o  A container node is mandatory if its definition does not contain +      the 'presence' substatement and at least one of its child nodes is +      mandatory. + +   A node that is not mandatory is said to be optional. + +   In RELAX NG, definitions of nodes that are optional must be +   explicitly wrapped in the <rng:optional> element.  The mapping MUST +   use the above rules to determine whether a YANG node is optional, and +   if so, insert the <rng:optional> element in the hybrid schema. + +   However, alternatives in <rng:choice> MUST NOT be defined as optional +   in the hybrid schema.  If a choice in YANG is not mandatory, <rng: +   optional> MUST be used to wrap the entire <rng:choice> pattern. + +9.1.2.  Implicit Nodes + +   The following rules are used to determine whether a given data node +   is implicit: + +   o  List, leaf-list, and anyxml nodes are never implicit. + +   o  A leaf node is implicit if and only if it has a default value, +      defined either directly or via its data type. + +   o  A container node is implicit if and only if it does not have the +      'presence' substatement, none of its children are mandatory, and +      at least one child is implicit. + +   In the hybrid schema, all implicit containers, as well as leafs that +   obtain their default value from a typedef and don't have the @nma: +   default attribute, MUST be marked with @nma:implicit attribute having +   the value of "true". + +   Note that Section 7.9.3 in [RFC6020] specifies other rules that must +   be taken into account when deciding whether or not a given container +   or leaf appearing inside a case of a choice is ultimately implicit. +   Specifically, a leaf or container under a case can be implicit only + + + +Lhotka                       Standards Track                   [Page 27] + +RFC 6110                  Mapping YANG to DSDL             February 2011 + + +   if the case appears in the argument of the choice's 'default' +   statement.  However, this is not sufficient by itself but also +   depends on the particular instance XML document, namely on the +   presence or absence of nodes from other (non-default) cases.  The +   details are explained in Section 11.3. + +9.2.  Mapping YANG Groupings and Typedefs + +   YANG groupings and typedefs are generally mapped to RELAX NG named +   patterns.  There are, however, several caveats that the mapping has +   to take into account. + +   First of all, YANG typedefs and groupings may appear at all levels of +   the module hierarchy and are subject to lexical scoping, see Section +   5.5 in [RFC6020].  Second, top-level symbols from external modules +   may be imported as qualified names represented using the external +   module namespace prefix and the name of the symbol.  In contrast, +   named patterns in RELAX NG (both local and imported via the <rng: +   include> pattern) share the same namespace and within a grammar they +   are always global -- their definitions may only appear at the top +   level as children of the <rng:grammar> element.  Consequently, +   whenever YANG groupings and typedefs are mapped to RELAX NG named +   pattern definitions, their names MUST be disambiguated in order to +   avoid naming conflicts.  The mapping uses the following procedure for +   mangling the names of groupings and type definitions: + +   o  Names of groupings and typedefs appearing at the top level of the +      YANG module hierarchy are prefixed with the module name and two +      underscore characters ("__"). + +   o  Names of other groupings and typedefs, i.e., those that do not +      appear at the top level of a YANG module, are prefixed with the +      module name, double underscore, and then the names of all ancestor +      data nodes separated by double underscore. + +   o  Finally, since the names of groupings and typedefs in YANG have +      different namespaces, an additional underscore character is added +      to the beginning of the mangled names of all groupings. + +   An additional complication is caused by the YANG rules for subelement +   ordering (see, e.g., Section 7.5.7 in [RFC6020]): in RPC input and +   output parameters, subelements must follow the order specified in the +   data model; otherwise, the order is arbitrary.  Consequently, if a +   grouping is used both in RPC input/output parameters and elsewhere, +   it MUST be mapped to two different named pattern definitions -- one +   with fixed order and the other with arbitrary order.  To distinguish +   them, the "__rpc" suffix MUST be appended to the version with fixed +   order. + + + +Lhotka                       Standards Track                   [Page 28] + +RFC 6110                  Mapping YANG to DSDL             February 2011 + + +   EXAMPLE.  Consider the following YANG module that imports the +   standard module "ietf-inet-types" [RFC6021]: + +   module example1 { +       namespace "http://example.com/ns/example1"; +       prefix ex1; +       typedef vowels { +           type string { +               pattern "[aeiouy]*"; +           } +       } +       grouping "grp1" { +           leaf "void" { +               type "empty"; +           } +       } +       container "cont" { +           leaf foo { +               type vowels; +           } +           uses "grp1"; +       } +   } + +   The hybrid schema generated by the first mapping step will then +   contain the following two (global) named pattern definitions: + +   <rng:define name="example1__vowels"> +     <rng:data type="string"> +       <rng:param name="pattern">[aeiouy]*</rng:param> +     </rng:data> +   </rng:define> + +   <rng:define name="_example1__grp1"> +     <rng:optional> +       <rng:element name="void"> +         <rng:empty/> +       </rng:element> +     </rng:optional> +   </rng:define> + +9.2.1.  YANG Refinements and Augments + +   YANG groupings represent a similar concept as named pattern +   definitions in RELAX NG, and both languages also offer mechanisms for +   their subsequent modification.  However, in RELAX NG, the definitions +   themselves are modified, whereas YANG provides two substatements of +   'uses', which modify expansions of groupings: + + + +Lhotka                       Standards Track                   [Page 29] + +RFC 6110                  Mapping YANG to DSDL             February 2011 + + +   o  The 'refine' statement allows for changing parameters of a schema +      node inside the grouping referenced by the parent 'uses' +      statement; + +   o  The 'augment' statement can be used for adding new schema nodes to +      the grouping contents. + +   Both 'refine' and 'augment' statements are quite powerful in that +   they can address, using XPath-like expressions as their arguments, +   schema nodes that are arbitrarily deep inside the grouping contents. +   In contrast, modifications of named pattern definitions in RELAX NG +   are applied exclusively at the topmost level of the named pattern +   contents.  In order to achieve a modifiability of named patterns +   comparable to YANG, a RELAX NG schema would have to be extremely flat +   (cf. Section 8.3) and very difficult to read. + +   Since the goal of the mapping described in this document is to +   generate ad hoc DSDL schemas, we decided to avoid these complications +   and instead expand the grouping and refine and/or augment it "in +   place".  In other words, every 'uses' statement that has 'refine' +   and/or 'augment' substatements is replaced by the contents of the +   corresponding grouping, the changes specified in the 'refine' and +   'augment' statements are applied, and the resulting YANG schema +   fragment is mapped as if the 'uses'/'grouping' indirection wasn't +   there. + +   If there are further 'uses' statements inside the grouping contents, +   they may require expansion, too: it is necessary if the contained +   'uses'/'grouping' pair lies on the "modification path" specified in +   the argument of a 'refine' or 'augment' statement. + + + + + + + + + + + + + + + + + + + + + +Lhotka                       Standards Track                   [Page 30] + +RFC 6110                  Mapping YANG to DSDL             February 2011 + + +   EXAMPLE.  Consider the following YANG module: + +   module example2 { +       namespace "http://example.com/ns/example2"; +       prefix ex2; +       grouping leaves { +           uses fr; +           uses es; +       } +       grouping fr { +           leaf feuille { +               type string; +           } +       } +       grouping es { +           leaf hoja { +               type string; +           } +       } +       uses leaves; +   } + +   The resulting hybrid schema contains three global named pattern +   definitions corresponding to the three groupings, namely: + +   <rng:define name="_example2__leaves"> +     <rng:interleave> +       <rng:ref name="_example2__fr"/> +       <rng:ref name="_example2__es"/> +     </rng:interleave> +   </rng:define> + +   <rng:define name="_example2__fr"> +     <rng:optional> +       <rng:element name="feuille"> +         <rng:data type="string"/> +       </rng:element> +     </rng:optional> +   </rng:define> + +   <rng:define name="_example2__es"> +     <rng:optional> +       <rng:element name="hoja"> +         <rng:data type="string"/> +       </rng:element> +     </rng:optional> +   </rng:define> + + + + +Lhotka                       Standards Track                   [Page 31] + +RFC 6110                  Mapping YANG to DSDL             February 2011 + + +   and the configuration data part of the hybrid schema is a single +   named pattern reference: + +   <nma:data> +     <rng:ref name="_example2__leaves"/> +   </nma:data> + +   Now assume that the "uses leaves" statement contains a 'refine' +   substatement, for example: + +   uses leaves { +       refine "hoja" { +           default "alamo"; +       } +   } + +   The resulting hybrid schema now contains just one named pattern +   definition - "_example2__fr".  The other two groupings "leaves" and +   "es" have to be expanded because they both lie on the "modification +   path", i.e., contain the leaf "hoja" that is being refined.  The +   configuration data part of the hybrid schema now looks like this: + +   <nma:data> +     <rng:interleave> +       <rng:ref name="_example2__fr"/> +       <rng:optional> +         <rng:element name="ex2:hoja" nma:default="alamo"> +           <rng:data type="string"/> +         </rng:element> +       </rng:optional> +     </rng:interleave> +   </nma:data> + +9.2.2.  Type Derivation Chains + +   RELAX NG has no equivalent of the type derivation mechanism in YANG +   that allows one to restrict a built-in type (perhaps in multiple +   steps) by adding new constraints.  Whenever a derived YANG type is +   used without restrictions -- as a substatement of either 'leaf' or +   another 'typedef' -- then the 'type' statement is mapped simply to a +   named pattern reference <rng:ref>, and the type definition is mapped +   to a RELAX NG named pattern definition <rng:define>.  However, if any +   restrictions are specified as substatements of the 'type' statement, +   the type definition MUST be expanded at that point so that only the +   ancestor built-in type appears in the hybrid schema, restricted with +   facets that correspond to the combination of all restrictions found +   along the type derivation chain and also in the 'type' statement. + + + + +Lhotka                       Standards Track                   [Page 32] + +RFC 6110                  Mapping YANG to DSDL             February 2011 + + +   EXAMPLE.  Consider this YANG module: + +   module example3 { +       namespace "http://example.com/ns/example3"; +       prefix ex3; +       typedef dozen { +           type uint8 { +               range 1..12; +           } +       } +       leaf month { +           type dozen; +       } +   } + +   The 'type' statement in "leaf month" has no restrictions and is +   therefore mapped simply to the reference <rng:ref +   name="example3__dozen"/> and the corresponding named pattern is +   defined as follows: + +   <rng:define name="example3__dozen"> +     <rng:data type="unsignedByte"> +       <rng:param name="minInclusive">1</rng:param> +       <rng:param name="maxInclusive">12</rng:param> +     </rng:data> +   </rng:define> + +   Assume now that the definition of leaf "month" is changed to: + +   leaf month { +       type dozen { +           range 7..max; +       } +   } + +   The output RELAX NG schema then will not contain any named pattern +   definition and the leaf "month" will be mapped directly to: + +   <rng:element name="ex3:month"> +     <rng:data type="unsignedByte"> +       <rng:param name="minInclusive">7</rng:param> +       <rng:param name="maxInclusive">12</rng:param> +     </rng:data> +   </rng:element> + +   The mapping of type derivation chains may be further complicated by +   the presence of the 'default' statement in type definitions.  In the +   simple case, when a type definition containing the 'default' + + + +Lhotka                       Standards Track                   [Page 33] + +RFC 6110                  Mapping YANG to DSDL             February 2011 + + +   statement is used without restrictions, the 'default' statement is +   mapped to the @nma:default attribute attached to the <rng:define> +   element. + +   However, if that type definition has to be expanded due to +   restrictions, the @nma:default attribute arising from the expanded +   type or ancestor types in the type derivation chain MUST be attached +   to the pattern where the expansion occurs.  If there are multiple +   'default' statements in consecutive steps of the type derivation, +   only the 'default' statement that is closest to the expanded type is +   used. + +   EXAMPLE.  Consider this variation of the last example: + +   module example3bis { +       namespace "http://example.com/ns/example3bis"; +       prefix ex3bis; +       typedef dozen { +           type uint8 { +               range 1..12; +           } +           default 7; +       } +       leaf month { +           type dozen; +       } +   } + +   The 'typedef' statement in this module is mapped to the following +   named pattern definition: + +   <rng:define name="example3bis__dozen" @nma:default="7"> +     <rng:data type="unsignedByte"> +       <rng:param name="minInclusive">1</rng:param> +       <rng:param name="maxInclusive">12</rng:param> +     </rng:data> +   </rng:define> + +   If the "dozen" type is restricted when used in the leaf "month" +   definition, as in the previous example, the "dozen" type has to be +   expanded and @nma:default becomes an attribute of the <ex3bis:month> +   element definition: + + + + + + + + + +Lhotka                       Standards Track                   [Page 34] + +RFC 6110                  Mapping YANG to DSDL             February 2011 + + +   <rng:element name="ex3bis:month" @nma:default="7"> +     <rng:data type="unsignedByte"> +       <rng:param name="minInclusive">7</rng:param> +       <rng:param name="maxInclusive">12</rng:param> +     </rng:data> +   </rng:element> + +   However, if the definition of the leaf "month" itself contained the +   'default' substatement, the default specified for the "dozen" type +   would be ignored. + +9.3.  Translation of XPath Expressions + +   YANG uses full XPath 1.0 syntax [XPath] for the arguments of 'must', +   'when', and 'path' statements.  As the names of data nodes defined in +   a YANG module always belong to the namespace of that YANG module, +   YANG adopted a simplification similar to the concept of default +   namespace in XPath 2.0: node names in XPath expressions needn't carry +   a namespace prefix inside the module where they are defined and the +   local module's namespace is assumed. + +   Consequently, all XPath expressions MUST be translated into a fully +   conformant XPath 1.0 expression: every unprefixed node name MUST be +   prepended with the local module's namespace prefix as declared by the +   'prefix' statement. + +   XPath expressions appearing inside top-level groupings require +   special attention because all unprefixed node names contained in them +   must adopt the namespace of each module where the grouping is used +   (cf. Section 8.2).  In order to achieve this, the local prefix MUST +   be represented using the variable "$pref" in the hybrid schema.  A +   Schematron schema which encounters such an XPath expression then +   supplies an appropriate value for this variable via a parameter to an +   abstract pattern to which the YANG grouping is mapped (see +   Section 11.2). + +   For example, XPath expression "/dhcp/max-lease-time" appearing in a +   YANG module with the "dhcp" prefix will be translated to: + +   o  "$pref:dhcp/$pref:max-lease-time", if the expression is inside a +      top-level grouping; + +   o  "dhcp:dhcp/dhcp:max-lease-time", otherwise. + + + + + + + + +Lhotka                       Standards Track                   [Page 35] + +RFC 6110                  Mapping YANG to DSDL             February 2011 + + +   YANG also uses other XPath-like expressions, namely key identifiers +   and "descendant schema node identifiers" (see the ABNF production for +   and "descendant-schema-nodeid" in Section 12 of [RFC6020]).  These +   expressions MUST be translated by adding local module prefixes as +   well. + +9.4.  YANG Language Extensions + +   YANG allows for extending its own language in-line by adding new +   statements with keywords from special namespaces.  Such extensions +   first have to be declared using the 'extension' statement, and then +   they can be used as the standard YANG statements, from which they are +   distinguished by a namespace prefix qualifying the extension keyword. +   RELAX NG has a similar extension mechanism -- XML elements and +   attributes with names from foreign namespaces may be inserted at +   almost any place of a RELAX NG schema. + +   YANG language extensions may or may not have a meaning in the context +   of DSDL schemas.  Therefore, an implementation MAY ignore any or all +   of the extensions.  However, an extension that is not ignored MUST be +   mapped to XML element(s) and/or attribute(s) that exactly match the +   YIN form of the extension, see Section 11.1 in [RFC6020]. + +   EXAMPLE.  Consider the following extension defined by the "acme" +   module: + +   extension documentation-flag { +       argument number; +   } + +   This extension can then be used in the same or another module, for +   instance like this: + +   leaf folio { +       acme:documentation-flag 42; +       type string; +   } + +   If this extension is honored by the mapping, it will be mapped to: + +   <rng:element name="acme:folio"> +      <acme:documentation-flag number="42"/> +      <rng:data type="string"/> +   </rng:element> + +   Note that the 'extension' statement itself is not mapped in any way. + + + + + +Lhotka                       Standards Track                   [Page 36] + +RFC 6110                  Mapping YANG to DSDL             February 2011 + + +10.  Mapping YANG Statements to the Hybrid Schema + +   Each subsection in this section is devoted to one YANG statement and +   provides the specification of how the statement is mapped to the +   hybrid schema.  The subsections are sorted alphabetically by the +   statement keyword. + +   Each YANG statement is mapped to an XML fragment, typically a single +   element or attribute, but it may also be a larger structure.  The +   mapping procedure is inherently recursive, which means that after +   finishing a statement the mapping continues with its substatements, +   if there are any, and a certain element of the resulting fragment +   becomes the parent of other fragments resulting from the mapping of +   substatements.  Any changes to this default recursive procedure are +   explicitly specified. + +   YANG XML encoding rules translate to the following rules for ordering +   multiple subelements: + +   1.  Within the <nma:rpcs> subtree (i.e., for input and output +       parameters of an RPC operation) the order of subelements is fixed +       and their definitions in the hybrid schema MUST follow the order +       specified in the source YANG module. + +   2.  When mapping the 'list' statement, all keys MUST come before any +       other subelements and in the same order as they are declared in +       the 'key' statement.  The order of the remaining (non-key) +       subelements is not specified, so their definitions in the hybrid +       schema MUST be enclosed in the <rng:interleave> element. + +   3.  Otherwise, the order of subelements is arbitrary and, +       consequently, all definitions of subelements in the hybrid schema +       MUST be enclosed in the <rng:interleave> element. + +   The following conventions are used in this section: + +   o  The argument of the statement being mapped is denoted by ARGUMENT. + +   o  The element in the RELAX NG schema that becomes the parent of the +      resulting XML fragment is denoted by PARENT. + +10.1.  The 'anyxml' Statement + +   This statement is mapped to the <rng:element> element and ARGUMENT +   with prepended local namespace prefix becomes the value of its @name +   attribute.  The contents of <rng:element> are: + +   <rng:ref name="__anyxml__"/> + + + +Lhotka                       Standards Track                   [Page 37] + +RFC 6110                  Mapping YANG to DSDL             February 2011 + + +   Substatements of the 'anyxml' statement, if any, MAY be mapped to +   additional children of the <rng:element> element. + +   If at least one 'anyxml' statement occurs in any of the input YANG +   modules, the following pattern definition MUST be added exactly once +   to the RELAX NG schema as a child of the root <rng:grammar> element +   (cf. [Vli04], p. 172): + +   <rng:define name="__anyxml__"> +     <rng:zeroOrMore> +       <rng:choice> +         <rng:attribute> +           <rng:anyName/> +         </rng:attribute> +         <rng:element> +           <rng:anyName/> +           <rng:ref name="__anyxml__"/> +         </rng:element> +         <rng:text/> +       </rng:choice> +     </rng:zeroOrMore> +   </rng:define> + +   EXAMPLE: YANG statement in a module with namespace prefix "yam" + +   anyxml data { +       description "Any XML content allowed here."; +   } + +   is mapped to the following fragment: + +   <rng:element name="yam:data"> +       <a:documentation>Any XML content allowed here</a:documentation> +       <rng:ref name="__anyxml__"/> +   </rng:element> + +   An anyxml node is optional if there is no "mandatory true;" +   substatement.  The <rng:element> element then MUST be wrapped in +   <rng:optional>, except when the 'anyxml' statement is a child of the +   'choice' statement and thus forms a shorthand case for that choice +   (see Section 9.1.1 for details). + +10.2.  The 'argument' Statement + +   This statement is not mapped to the output schema, but see the rules +   for handling extensions in Section 9.4. + + + + + +Lhotka                       Standards Track                   [Page 38] + +RFC 6110                  Mapping YANG to DSDL             February 2011 + + +10.3.  The 'augment' Statement + +   As a substatement of 'uses', this statement is handled as a part of +   'uses' mapping, see Section 10.57. + +   At the top level of a module or submodule, the 'augment' statement is +   used for augmenting the schema tree of another YANG module.  If the +   augmented module is not processed within the same mapping session, +   the top-level 'augment' statement MUST be ignored.  Otherwise, the +   contents of the statement are added to the foreign module with the +   namespace of the module where the 'augment' statement appears. + +10.4.  The 'base' Statement + +   This statement is ignored as a substatement of 'identity' and handled +   within the 'identityref' type if it appears as a substatement of that +   type definition, see Section 10.53.6. + +10.5.  The 'belongs-to' Statement + +   This statement is not used since the processing of submodules is +   always initiated from the main module, see Section 10.24. + +10.6.  The 'bit' Statement + +   This statement is handled within the "bits" type, see +   Section 10.53.4. + +10.7.  The 'case' Statement + +   This statement is mapped to the <rng:group> or <rng:interleave> +   element, depending on whether or not the statement belongs to an +   definition of an RPC operation.  If the argument of a sibling +   'default' statement equals to ARGUMENT, the @nma:implicit attribute +   with the value of "true" MUST be added to that <rng:group> or <rng: +   interleave> element.  The @nma:implicit attribute MUST NOT be used +   for nodes at the top-level of a non-default case (see Section 7.9.3 +   in [RFC6020]). + +10.8.  The 'choice' Statement + +   This statement is mapped to the <rng:choice> element. + +   If 'choice' has the 'mandatory' substatement with the value of +   "true", the attribute @nma:mandatory MUST be added to the <rng: +   choice> element with the value of ARGUMENT.  This case may require + + + + + +Lhotka                       Standards Track                   [Page 39] + +RFC 6110                  Mapping YANG to DSDL             February 2011 + + +   additional handling, see Section 11.2.1.  Otherwise, if "mandatory +   true;" is not present, the <rng:choice> element MUST be wrapped in +   <rng:optional>. + +   The alternatives in <rng:choice> -- mapped from either the 'case' +   statement or a shorthand case -- MUST NOT be defined as optional. + +10.9.  The 'config' Statement + +   This statement is mapped to the @nma:config attribute, and ARGUMENT +   becomes its value. + +10.10.  The 'contact' Statement + +   This statement SHOULD NOT be used by the mapping since the hybrid +   schema may be mapped from multiple YANG modules created by different +   authors.  The hybrid schema contains references to all input modules +   in the Dublin Core elements <dc:source>, see Section 10.34.  The +   original YANG modules are the authoritative sources of the authorship +   information. + +10.11.  The 'container' Statement + +   Using the rules specified in Section 9.1.1, the mapping algorithm +   MUST determine whether the statement defines an optional container, +   and if so, insert the <rng:optional> element and make it the new +   PARENT. + +   The container defined by this statement is then mapped to the <rng: +   element> element, which becomes a child of PARENT and uses ARGUMENT +   with prepended local namespace prefix as the value of its @name +   attribute. + +   Finally, using the rules specified in Section 9.1.2, the mapping +   algorithm MUST determine whether the container is implicit, and if +   so, add the attribute @nma:implicit with the value of "true" to the +   <rng:element> element. + +10.12.  The 'default' Statement + +   If this statement is a substatement of 'leaf', it is mapped to the +   @nma:default attribute of PARENT and ARGUMENT becomes its value. + +   As a substatement of 'typedef', the 'default' statement is also +   mapped to the @nma:default attribute with the value of ARGUMENT.  The +   placement of this attribute depends on whether or not the type +   definition has to be expanded when it is used: + + + + +Lhotka                       Standards Track                   [Page 40] + +RFC 6110                  Mapping YANG to DSDL             February 2011 + + +   o  If the type definition is not expanded, @nma:default becomes an +      attribute of the <rng:define> pattern resulting from the parent +      'typedef' mapping. + +   o  Otherwise, @nma:default becomes an attribute of the ancestor RELAX +      NG pattern inside which the expansion takes place. + +   Details and an example are given in Section 9.2.2. + +   Finally, as a substatement of 'choice', the 'default' statement +   identifies the default case and is handled within the 'case' +   statement, see Section 10.7.  If the default case uses the shorthand +   notation where the 'case' statement is omitted, the @nma:implicit +   attribute with the value of "true" is either attached to the node +   representing the default case in the shorthand notation or, +   alternatively, an extra <rng:group> element MAY be inserted and the +   @nma:implicit attribute attached to it.  In the latter case, the net +   result is the same as if the 'case' statement wasn't omitted for the +   default case. + +   EXAMPLE.  The following 'choice' statement in a module with namespace +   prefix "yam" + +   choice leaves { +       default feuille; +       leaf feuille { type empty; } +       leaf hoja { type empty; } +   } + +   is either mapped directly to: + +   <rng:choice> +     <rng:element name="yam:feuille" nma:implicit="true"> +       <rng:empty/> +     </rng:element> +     <rng:element name="yam:hoja"> +       <rng:empty/> +     </rng:element/> +   </rng:choice> + + + + + + + + + + + + +Lhotka                       Standards Track                   [Page 41] + +RFC 6110                  Mapping YANG to DSDL             February 2011 + + +   or the default case may be wrapped in an extra <rng:group>: + +   <rng:choice> +     <rng:group nma:implicit="true"> +       <rng:element name="yam:feuille"> +         <rng:empty/> +       </rng:element> +     </rng:group> +     <rng:element name="yam:hoja"> +       <rng:empty/> +     </rng:element/> +   </rng:choice> + +10.13.  The 'description' Statement + +   This statement is mapped to the DTD compatibility element +   <a:documentation> and ARGUMENT becomes its text. + +   In order to get properly formatted in the RELAX NG compact syntax, +   this element SHOULD be inserted as the first child of PARENT. + +10.14.  The 'deviation' Statement + +   This statement is ignored.  However, it is assumed that all +   deviations are known beforehand and the corresponding changes have +   already been applied to the input YANG modules. + +10.15.  The 'enum' Statement + +   This statement is mapped to the <rng:value> element, and ARGUMENT +   becomes its text.  All substatements except 'status' are ignored +   because the <rng:value> element cannot contain annotation elements, +   see [RNG], Section 6. + +10.16.  The 'error-app-tag' Statement + +   This statement is ignored unless it is a substatement of 'must'.  In +   the latter case, it is mapped to the <nma:error-app-tag> element. +   See also Section 10.35. + +10.17.  The 'error-message' Statement + +   This statement is ignored unless it is a substatement of 'must'.  In +   the latter case, it is mapped to the <nma:error-message> element. +   See also Section 10.35. + + + + + + +Lhotka                       Standards Track                   [Page 42] + +RFC 6110                  Mapping YANG to DSDL             February 2011 + + +10.18.  The 'extension' Statement + +   This statement is ignored.  However, extensions to the YANG language +   MAY be mapped as described in Section 9.4. + +10.19.  The 'feature' Statement + +   This statement is ignored. + +10.20.  The 'grouping' Statement + +   This statement is mapped to a RELAX NG named pattern definition <rng: +   define>, but only if the grouping defined by this statement is used +   without refinements and augments in at least one of the input +   modules.  In this case, the named pattern definition becomes a child +   of the <rng:grammar> element and its name is ARGUMENT mangled +   according to the rules specified in Section 9.2. + +   As explained in Section 8.2, a named pattern definition MUST be +   placed: + +   o  as a child of the root <rng:grammar> element if the corresponding +      grouping is defined at the top level of an input YANG module; + +   o  otherwise as a child of the embedded <rng:grammar> element +      corresponding to the module in which the grouping is defined. + +   Whenever a grouping is used with refinements and/or augments, it is +   expanded so that the refinements and augments may be applied in place +   to the prescribed schema nodes.  See Section 9.2.1 for further +   details and an example. + +   An implementation MAY offer the option of mapping all 'grouping' +   statements as named pattern definitions in the output RELAX NG schema +   even if they are not referenced.  This is useful for mapping YANG +   "library" modules that typically contain only 'typedef' and/or +   'grouping' statements. + +10.21.  The 'identity' Statement + +   This statement is mapped to the following named pattern definition +   which is placed as a child of the root <rng:grammar> element: + + + + + + + + + +Lhotka                       Standards Track                   [Page 43] + +RFC 6110                  Mapping YANG to DSDL             February 2011 + + +   <rng:define name="__PREFIX_ARGUMENT"> +     <rng:choice> +       <rng:value type="QName">PREFIX:ARGUMENT</rng:value> +       <rng:ref name="IDENTITY1"/> +       ... +     </rng:choice> +   </rng:define> + +   where: + +      PREFIX is the prefix used in the hybrid schema for the namespace +      of the module where the current identity is defined. + +      IDENTITY1 is the name of the named pattern corresponding to an +      identity that is derived from the current identity.  Exactly one +      <rng:ref> element MUST be present for every such identity. + +   EXAMPLE ([RFC6020], Section 7.16.3).  Consider the following +   identities defined in two input YANG modules: + +   module crypto-base { +     namespace "http://example.com/crypto-base"; +     prefix "crypto"; +     identity crypto-alg { +       description +         "Base identity from which all crypto algorithms +          are derived."; +       } +   } + +   module des { +     namespace "http://example.com/des"; +     prefix "des"; +     import "crypto-base" { +       prefix "crypto"; +     } +     identity des { +       base "crypto:crypto-alg"; +       description "DES crypto algorithm"; +     } +     identity des3 { +       base "crypto:crypto-alg"; +       description "Triple DES crypto algorithm"; +     } +   } + + + + + + +Lhotka                       Standards Track                   [Page 44] + +RFC 6110                  Mapping YANG to DSDL             February 2011 + + +   The identities will be mapped to the following named pattern +   definitions: + +   <define name="__crypto_crypto-alg"> +     <choice> +       <value type="QName">crypto:crypto-alg</value> +       <ref name="__des_des"/> +       <ref name="__des_des3"/> +     </choice> +   </define> +   <define name="__des_des"> +     <value type="QName">des:des</value> +   </define> +   <define name="__des_des3"> +     <value type="QName">des:des3</value> +   </define> + +10.22.  The 'if-feature' Statement + +   ARGUMENT together with arguments of all sibling 'if-feature' +   statements (with added prefixes, if missing) MUST be collected in a +   space-separated list that becomes the value of the @nma:if-feature +   attribute.  This attribute is attached to PARENT. + +10.23.  The 'import' Statement + +   This statement is not specifically mapped.  The module whose name is +   in ARGUMENT has to be parsed so that the importing module is able to +   use its top-level groupings, typedefs and identities, and also +   augment the data tree of the imported module. + +   If the 'import' statement has the 'revision' substatement, the +   corresponding revision of the imported module MUST be used.  The +   mechanism for finding a given module revision is outside the scope of +   this document. + +10.24.  The 'include' Statement + +   This statement is not specifically mapped.  The submodule whose name +   is in ARGUMENT has to be parsed and its contents mapped exactly as if +   the submodule text appeared directly in the main module text. + +   If the 'include' statement has the 'revision' substatement, the +   corresponding revision of the submodule MUST be used.  The mechanism +   for finding a given submodule revision is outside the scope of this +   document. + + + + + +Lhotka                       Standards Track                   [Page 45] + +RFC 6110                  Mapping YANG to DSDL             February 2011 + + +10.25.  The 'input' Statement + +   This statement is handled within 'rpc' statement, see Section 10.50. + +10.26.  The 'key' Statement + +   This statement is mapped to @nma:key attribute.  ARGUMENT MUST be +   translated so that every key is prefixed with the namespace prefix of +   the local module.  The result of this translation then becomes the +   value of the @nma:key attribute. + +10.27.  The 'leaf' Statement + +   This statement is mapped to the <rng:element> element and ARGUMENT +   with prepended local namespace prefix becomes the value of its @name +   attribute. + +   If the leaf is optional, i.e., if there is no "mandatory true;" +   substatement and the leaf is not declared among the keys of an +   enclosing list, then the <rng:element> element MUST be enclosed in +   <rng:optional>, except when the 'leaf' statement is a child of the +   'choice' statement and thus represents a shorthand case for that +   choice (see Section 9.1.1 for details). + +10.28.  The 'leaf-list' Statement + +   This statement is mapped to a block enclosed by either the <rng: +   zeroOrMore> or the <rng:oneOrMore> element depending on whether the +   argument of 'min-elements' substatement is "0" or positive, +   respectively (it is zero by default).  This <rng:zeroOrMore> or <rng: +   oneOrMore> element becomes the PARENT. + +   <rng:element> is then added as a child element of PARENT and ARGUMENT +   with prepended local namespace prefix becomes the value of its @name +   attribute.  Another attribute, @nma:leaf-list, MUST also be added to +   this <rng:element> element with the value of "true".  If the 'leaf- +   list' statement has the 'min-elements' substatement and its argument +   is greater than one, additional attribute @nma:min-elements is +   attached to <rng:element> and the argument of 'min-elements' becomes +   the value of this attribute.  Similarly, if there is the 'max- +   elements' substatement and its argument value is not "unbounded", +   attribute @nma:max-elements is attached to this element and the +   argument of 'max-elements' becomes the value of this attribute. + + + + + + + + +Lhotka                       Standards Track                   [Page 46] + +RFC 6110                  Mapping YANG to DSDL             February 2011 + + +   EXAMPLE.  Consider the following 'leaf-list' appearing in a module +   with the namespace prefix "yam": + +   leaf-list foliage { +       min-elements 3; +       max-elements 6378; +       ordered-by user; +       type string; +   } + +   It is mapped to the following RELAX NG fragment: + +   <rng:oneOrMore> +     <rng:element name="yam:foliage" nma:leaf-list="true" +                  nma:ordered-by="user" +                  nma:min-elements="3" nma:max-elements="6378"> +       <rng:data type="string"/> +     </rng:element> +   </rng:oneOrMore> + +10.29.  The 'length' Statement + +   This statement is handled within the "string" type, see +   Section 10.53.10. + +10.30.  The 'list' Statement + +   This statement is mapped exactly as the 'leaf-list' statement, see +   Section 10.28.  The only difference is that the @nma:leaf-list +   annotation either MUST NOT be present or MUST have the value of +   "false". + +   When mapping the substatements of 'list', the order of children of +   the list element MUST be specified so that list keys, if there are +   any, always appear in the same order as they are defined in the 'key' +   substatement and before other children, see [RFC6020], Section 7.8.5. +   In particular, if a list key is defined in a grouping but the list +   node itself is not a part of the same grouping, and the position of +   the 'uses' statement would violate the above ordering requirement, +   the grouping MUST be expanded, i.e., the 'uses' statement replaced by +   the grouping contents. + +   For example, consider the following YANG fragment of a module with +   the prefix "yam": + + + + + + + +Lhotka                       Standards Track                   [Page 47] + +RFC 6110                  Mapping YANG to DSDL             February 2011 + + +   grouping keygrp { +     leaf clef { +       type uint8; +     } +   } +   list foo { +     key clef; +     leaf bar { +       type string; +     } +     leaf baz { +       type string; +     } +     uses keygrp; +   } + +   It is mapped to the following RELAX NG fragment: + +   <rng:zeroOrMore> +     <rng:element name="yam:foo" nma:key="yam:clef"> +       <rng:element name="yam:clef"> +         <rng:data type="unsignedByte"/> +       </rng:element> +       <rng:interleave> +         <rng:element name="yam:bar"> +           <rng:data type="string"/> +         </rng:element> +         <rng:element name="yam:baz"> +           <rng:data type="string"/> +         </rng:element> +       </rng:interleave> +     </rng:element> +   </rng:zeroOrMore> + +   Note that the "keygrp" grouping is expanded and the definition of +   "yam:clef" is moved before the <rng:interleave> pattern. + +10.31.  The 'mandatory' Statement + +   This statement may appear as a substatement of 'leaf', 'choice', or +   'anyxml' statement.  If ARGUMENT is "true", the parent data node is +   mapped as mandatory, see Section 9.1.1. + +   As a substatement of 'choice', this statement is also mapped to the +   @nma:mandatory attribute, which is added to PARENT.  The value of +   this attribute is the argument of the parent 'choice' statement. + + + + + +Lhotka                       Standards Track                   [Page 48] + +RFC 6110                  Mapping YANG to DSDL             February 2011 + + +10.32.  The 'max-elements' Statement + +   This statement is handled within 'leaf-list' or 'list' statements, +   see Section 10.28. + +10.33.  The 'min-elements' Statement + +   This statement is handled within 'leaf-list' or 'list' statements, +   see Section 10.28. + +10.34.  The 'module' Statement + +   This statement is mapped to an embedded <rng:grammar> pattern having +   the @nma:module attribute with the value of ARGUMENT.  In addition, a +   <dc:source> element SHOULD be created as a child of this <rng: +   grammar> element and contain ARGUMENT as a metadata reference to the +   input YANG module.  See also Section 10.49. + +   Substatements of the 'module' statement MUST be mapped so that: + +   o  statements representing configuration/state data are mapped to +      descendants of the <nma:data> element; + +   o  statements representing the contents of RPC requests or replies +      are mapped to descendants of the <nma:rpcs> element; + +   o  statements representing the contents of event notifications are +      mapped to descendants of the <nma:notifications> element. + +10.35.  The 'must' Statement + +   This statement is mapped to the <nma:must> element.  It has one +   mandatory attribute @assert (with no namespace) that contains +   ARGUMENT transformed into a valid XPath expression (see Section 9.3). +   The <nma:must> element may have other subelements resulting from +   mapping the 'error-app-tag' and 'error-message' substatements.  Other +   substatements of 'must', i.e., 'description' and 'reference', are +   ignored. + +   EXAMPLE.  YANG statement in the "dhcp" module + +   must 'current() <= ../max-lease-time' { +       error-message +           "The default-lease-time must be less than max-lease-time"; +   } + + + + + + +Lhotka                       Standards Track                   [Page 49] + +RFC 6110                  Mapping YANG to DSDL             February 2011 + + +   is mapped to: + +   <nma:must assert="current()<=../dhcp:max-lease-time"> +     <nma:error-message> +       The default-lease-time must be less than max-lease-time +     </nma:error-message> +   </nma:must> + +10.36.  The 'namespace' Statement + +   This statement is mapped simultaneously in two ways: + +   1.  to the @xmlns:PREFIX attribute of the root <rng:grammar> element +       where PREFIX is the namespace prefix specified by the sibling +       'prefix' statement.  ARGUMENT becomes the value of this +       attribute; + +   2.  to the @ns attribute of PARENT, which is an embedded <rng: +       grammar> pattern.  ARGUMENT becomes the value of this attribute. + +10.37.  The 'notification' Statement + +   This statement is mapped to the following subtree of the <nma: +   notifications> element in the hybrid schema (where PREFIX is the +   prefix of the local YANG module): + +   <nma:notification> +     <rng:element name="PREFIX:ARGUMENT"> +       ... +     </rng:element> +   </nma:notification> + +   Substatements of 'notification' are mapped under <rng:element +   name="PREFIX:ARGUMENT">. + +10.38.  The 'ordered-by' Statement + +   This statement is mapped to @nma:ordered-by attribute and ARGUMENT +   becomes the value of this attribute.  See Section 10.28 for an +   example. + +10.39.  The 'organization' Statement + +   This statement is ignored by the mapping because the hybrid schema +   may be mapped from multiple YANG modules authored by different +   parties.  The hybrid schema SHOULD contain references to all input +   modules in the Dublin Core <dc:source> elements, see Section 10.34. + + + + +Lhotka                       Standards Track                   [Page 50] + +RFC 6110                  Mapping YANG to DSDL             February 2011 + + +   The original YANG modules are the authoritative sources of the +   authorship information. + +10.40.  The 'output' Statement + +   This statement is handled within the 'rpc' statement, see +   Section 10.50. + +10.41.  The 'path' Statement + +   This statement is handled within the "leafref" type, see +   Section 10.53.8. + +10.42.  The 'pattern' Statement + +   This statement is handled within the "string" type, see +   Section 10.53.10. + +10.43.  The 'position' Statement + +   This statement is ignored. + +10.44.  The 'prefix' Statement + +   This statement is handled within the sibling 'namespace' statement, +   see Section 10.36, or within the parent 'import' statement, see +   Section 10.23.  As a substatement of 'belongs-to' (in submodules), +   the 'prefix' statement is ignored. + +10.45.  The 'presence' Statement + +   This statement influences the mapping of the parent container +   (Section 10.11): the parent container definition MUST be wrapped in +   <rng:optional>, regardless of its contents.  See also Section 9.1.1. + +10.46.  The 'range' Statement + +   This statement is handled within numeric types, see Section 10.53.9. + +10.47.  The 'reference' Statement + +   This statement is mapped to <a:documentation> element and its text is +   set to ARGUMENT prefixed with "See: ". + +10.48.  The 'require-instance' Statement + +   This statement is handled within "instance-identifier" type +   (Section 10.53.7). + + + +Lhotka                       Standards Track                   [Page 51] + +RFC 6110                  Mapping YANG to DSDL             February 2011 + + +10.49.  The 'revision' Statement + +   The mapping uses only the most recent instance of the 'revision' +   statement, i.e., one with the latest date in ARGUMENT, which +   specifies the current revision of the input YANG module [RFC6020]. +   This date SHOULD be recorded, together with the name of the YANG +   module, in the corresponding Dublin Core <dc:source> element (see +   Section 10.34), for example in this form: + +   <dc:source>YANG module 'foo', revision 2010-03-02</dc:source> + +   The 'description' substatement of 'revision' is ignored. + +10.50.  The 'rpc' Statement + +   This statement is mapped to the following subtree in the RELAX NG +   schema (where PREFIX is the prefix of the local YANG module): + +   <nma:rpc> +     <nma:input> +       <rng:element name="PREFIX:ARGUMENT"> +         ... mapped contents of 'input' ... +       </rng:element> +     </nma:input> +     <nma:output"> +       ... mapped contents of 'output' ... +     </nma:output> +   </nma:rpc> + +   As indicated in the schema fragment, contents of the 'input' +   substatement (if any) are mapped under <rng:element name="PREFIX: +   ARGUMENT">.  Similarly, contents of the 'output' substatement are +   mapped under <nma:output>.  If there is no 'output' substatement, the +   <nma:output> element MUST NOT be present. + +   The <nma:rpc> element is a child of <nma:rpcs>. + +10.51.  The 'status' Statement + +   This statement MAY be ignored.  Otherwise, it is mapped to @nma: +   status attribute and ARGUMENT becomes its value. + +10.52.  The 'submodule' Statement + +   This statement is not specifically mapped.  Its substatements are +   mapped as if they appeared directly in the module to which the +   submodule belongs. + + + + +Lhotka                       Standards Track                   [Page 52] + +RFC 6110                  Mapping YANG to DSDL             February 2011 + + +10.53.  The 'type' Statement + +   Most YANG built-in data types have an equivalent in the XSD data type +   library [XSD-D] as shown in Table 4. + +      +-----------+---------------+--------------------------------+ +      | YANG type | XSD type      | Meaning                        | +      +-----------+---------------+--------------------------------+ +      | int8      | byte          | 8-bit integer value            | +      |           |               |                                | +      | int16     | short         | 16-bit integer value           | +      |           |               |                                | +      | int32     | int           | 32-bit integer value           | +      |           |               |                                | +      | int64     | long          | 64-bit integer value           | +      |           |               |                                | +      | uint8     | unsignedByte  | 8-bit unsigned integer value   | +      |           |               |                                | +      | uint16    | unsignedShort | 16-bit unsigned integer value  | +      |           |               |                                | +      | uint32    | unsignedInt   | 32-bit unsigned integer value  | +      |           |               |                                | +      | uint64    | unsignedLong  | 64-bit unsigned integer value  | +      |           |               |                                | +      | string    | string        | character string               | +      |           |               |                                | +      | binary    | base64Binary  | binary data in base64 encoding | +      +-----------+---------------+--------------------------------+ + +     Table 4: YANG built-in data types with equivalents in the W3C XML +                            Schema Type Library + +   Two important data types of the XSD data type library -- "dateTime" +   and "anyURI" -- are not built-in types in YANG but instead are +   defined as derived types in the standard modules [RFC6021]: "date- +   and-time" in the "ietf-yang-types" module and "uri" in the "ietf- +   inet-types" module.  However, the formal restrictions in the YANG +   type definitions are rather weak.  Therefore, implementations of the +   YANG-to-DSDL mapping SHOULD detect these derived types in source YANG +   modules and map them to "dateType" and "anyURI", respectively. + +   Details about the mapping of individual YANG built-in types are given +   in the following subsections. + + + + + + + + +Lhotka                       Standards Track                   [Page 53] + +RFC 6110                  Mapping YANG to DSDL             February 2011 + + +10.53.1.  The "empty" Type + +   This type is mapped to <rng:empty/>. + +10.53.2.  The "boolean" Type + +   This built-in type does not allow any restrictions and is mapped to +   the following XML fragment: + +   <rng:choice> +     <rng:value>true</rng:value> +     <rng:value>false</rng:value> +   </rng:choice> + +   Note that the XSD "boolean" type cannot be used here because it +   allows, unlike YANG, an alternative numeric representation of boolean +   values: 0 for "false" and 1 for "true". + +10.53.3.  The "binary" Type + +   This built-in type does not allow any restrictions and is mapped +   simply by inserting an <rng:data> element whose @type attribute value +   is set to "base64Binary" (see also Table 4). + +10.53.4.  The "bits" Type + +   This type is mapped to the <rng:list> and for each 'bit' substatement +   the following XML fragment is inserted as a child of <rng:list>: + +   <rng:optional> +     <rng:value>bit_name</rng:value> +   </rng:optional> + +   where bit_name is the name of the bit as found in the argument of a +   'bit' substatement. + +10.53.5.  The "enumeration" and "union" Types + +   These types are mapped to the <rng:choice> element. + +10.53.6.  The "identityref" Type + +   This type is mapped to the following named pattern reference: + +   <rng:ref name="__PREFIX_BASE"/> + +   where PREFIX:BASE is the qualified name of the identity appearing in +   the argument of the 'base' substatement. + + + +Lhotka                       Standards Track                   [Page 54] + +RFC 6110                  Mapping YANG to DSDL             February 2011 + + +   For example, assume that module "des" in Section 10.21 contains the +   following leaf definition: + +   leaf foo { +     type identityref { +       base crypto:crypto-alg; +     } +   } + +   This leaf would then be mapped to the following element pattern: + +   <element name="des:foo"> +     <ref name="__crypto_crypto-alg"/> +   </element> + +10.53.7.  The "instance-identifier" Type + +   This type is mapped to <rng:data> element with @type attribute set to +   "string".  In addition, an empty <nma:instance-identifier> element +   MUST be inserted as a child of PARENT. + +   The argument of the 'require-instance' substatement, if it exists, +   becomes the value of the @require-instance attribute of the <nma: +   instance-identifier> element. + +10.53.8.  The "leafref" Type + +   This type is mapped exactly as the type of the leaf given in the +   argument of 'path' substatement.  However, if the type of the +   referred leaf defines a default value, this default value MUST be +   ignored by the mapping. + +   In addition, @nma:leafref attribute MUST be added to PARENT.  The +   argument of the 'path' substatement, translated according to +   Section 9.3, is set as the value of this attribute. + +10.53.9.  The Numeric Types + +   YANG built-in numeric types are "int8", "int16", "int32", "int64", +   "uint8", "uint16", "uint32", "uint64", and "decimal64".  They are +   mapped to the <rng:data> element with the @type attribute set to +   ARGUMENT translated according to Table 4 above. + +   An exception is the "decimal64" type, which is mapped to the +   "decimal" type of the XSD data type library.  Its precision and +   number of fractional digits are controlled with the following facets, +   which MUST always be present: + + + + +Lhotka                       Standards Track                   [Page 55] + +RFC 6110                  Mapping YANG to DSDL             February 2011 + + +   o  "totalDigits" facet set to the value of 19. + +   o  "fractionDigits" facet set to the argument of the 'fraction- +      digits' substatement. + +   The fixed value of "totalDigits" corresponds to the maximum of 19 +   decimal digits for 64-bit integers. + +   For example, the statement: + +   type decimal64 { +       fraction-digits 2; +   } + +   is mapped to the following RELAX NG data type: + +   <rng:data type="decimal"> +     <rng:param name="totalDigits">19</rng:param> +     <rng:param name="fractionDigits">2</rng:param> +   </rng:data> + +   All numeric types support the 'range' restriction, which is mapped as +   follows: + +   If the range expression consists of just a single range LO..HI, then +   it is mapped to a pair of data type facets: + +         <rng:param name="minInclusive">LO</rng:param> + +   and + +          <rng:param name="maxInclusive">HI</rng:param> + +   If the range consists of a single number, the values of both facets +   are set to this value.  If LO is equal to the string "min", the +   "minInclusive" facet is omitted.  If HI is equal to the string "max", +   the "maxInclusive" facet is omitted. + +   If the range expression has multiple parts separated by "|", then the +   parent <rng:data> element must be repeated once for every range part +   and all such <rng:data> elements are wrapped in <rng:choice> element. +   Each <rng:data> element contains the "minInclusive" and +   "maxInclusive" facets for one part of the range expression as +   described in the previous paragraph. + +   For the "decimal64" type, the "totalDigits" and "fractionDigits" must +   be repeated inside each of the <rng:data> elements. + + + + +Lhotka                       Standards Track                   [Page 56] + +RFC 6110                  Mapping YANG to DSDL             February 2011 + + +   For example, + +   type int32 { +       range "-6378..0|42|100..max"; +   } + +   is mapped to the following RELAX NG fragment: + +   <rng:choice> +     <rng:data type="int"> +       <rng:param name="minInclusive">-6378</rng:param> +       <rng:param name="maxInclusive">0</rng:param> +     </rng:data> +     <rng:data type="int"> +       <rng:param name="minInclusive">42</rng:param> +       <rng:param name="maxInclusive">42</rng:param> +     </rng:data> +     <rng:data type="int"> +       <rng:param name="minInclusive">100</rng:param> +     </rng:data> +   </rng:choice> + +   See Section 9.2.2 for further details on mapping the restrictions. + +10.53.10.  The "string" Type + +   This type is mapped to the <rng:data> element with the @type +   attribute set to "string". + +   The 'length' restriction is handled analogically to the 'range' +   restriction for the numeric types (Section 10.53.9): + +   If the length expression has just a single range: + +   o  and if the length range consists of a single number LENGTH, the +      following data type facet is inserted: + +         <rng:param name="length">LENGTH</rng:param>. + +   o  if the length range is of the form LO..HI, i.e., it consists of +      both the lower and upper bound.  The following two data type +      facets are then inserted: + +         <rng:param name="minLength">LO</rng:param> + +   and + +         <rng:param name="maxLength">HI</rng:param> + + + +Lhotka                       Standards Track                   [Page 57] + +RFC 6110                  Mapping YANG to DSDL             February 2011 + + +   If LO is equal to the string "min", the "minLength" facet is omitted. +   If HI is equal to the string "max", the "maxLength" facet is omitted. + +   If the length expression has of multiple parts separated by "|", then +   the parent <rng:data> element must be repeated once for every range +   part and all such <rng:data> elements are wrapped in <rng:choice> +   element.  Each <rng:data> element contains the "length" or +   "minLength" and "maxLength" facets for one part of the length +   expression as described in the previous paragraph. + +   Every 'pattern' restriction of the "string" data type is mapped to +   the "pattern" facet: + +   <rng:param name="pattern">...</rng:param> + +   with text equal to the argument of the 'pattern' statement.  All such +   "pattern" facets must be repeated inside each copy of the <rng:data> +   element, i.e., once for each length range. + +   For example, + +   type string { +       length "1|3..8"; +       pattern "[A-Z][a-z]*"; +   } + +   is mapped to the following RELAX NG fragment: + +   <rng:choice> +     <rng:data type="string"> +       <rng:param name="length">1</rng:param> +       <rng:param name="pattern">[A-Z][a-z]*</rng:param> +     </rng:data> +     <rng:data type="string"> +       <rng:param name="minLength">3</rng:param> +       <rng:param name="maxLength">8</rng:param> +       <rng:param name="pattern">[A-Z][a-z]*</rng:param> +     </rng:data> +   </rng:choice> + +10.53.11.  Derived Types + +   If the 'type' statement refers to a derived type, it is mapped in one +   of the following ways depending on whether it contains any +   restrictions as its substatements: + + + + + + +Lhotka                       Standards Track                   [Page 58] + +RFC 6110                  Mapping YANG to DSDL             February 2011 + + +   1.  Without restrictions, the 'type' statement is mapped simply to +       the <rng:ref> element, i.e., a reference to a named pattern.  If +       the RELAX NG definition of this named pattern has not been added +       to the hybrid schema yet, the corresponding type definition MUST +       be found and its mapping installed as a subelement of either the +       root or an embedded <rng:grammar> element, see Section 10.54. +       Even if a given derived type is used more than once in the input +       YANG modules, the mapping of the corresponding 'typedef' MUST be +       installed only once. + +   2.  If any restrictions are present, the ancestor built-in type for +       the given derived type must be determined and the mapping of this +       base type MUST be used.  Restrictions appearing at all stages of +       the type derivation chain MUST be taken into account and their +       conjunction added to the <rng:data> element that defines the +       basic type. + +   See Section 9.2.2 for more details and an example. + +10.54.  The 'typedef' Statement + +   This statement is mapped to a RELAX NG named pattern definition <rng: +   define>, but only if the type defined by this statement is used +   without restrictions in at least one of the input modules.  In this +   case, the named pattern definition becomes a child of either the root +   or an embedded <rng:grammar> element, depending on whether or not the +   'typedef' statement appears at the top level of a YANG module.  The +   name of this named pattern definition is set to ARGUMENT mangled +   according to the rules specified in Section 9.2. + +   Whenever a derived type is used with additional restrictions, the +   ancestor built-in type for the derived type is used instead with +   restrictions (facets) that are a combination of all restrictions +   specified along the type derivation chain.  See Section 10.53.11 for +   further details and an example. + +   An implementation MAY offer the option of recording all 'typedef' +   statements as named patterns in the output RELAX NG schema even if +   they are not referenced.  This is useful for mapping YANG "library" +   modules containing only 'typedef' and/or 'grouping' statements. + +10.55.  The 'unique' Statement + +   This statement is mapped to the @nma:unique attribute.  ARGUMENT MUST +   be translated so that every node identifier in each of its components +   is prefixed with the namespace prefix of the local module, unless the +   prefix is already present.  The result of this translation then +   becomes the value of the @nma:unique attribute. + + + +Lhotka                       Standards Track                   [Page 59] + +RFC 6110                  Mapping YANG to DSDL             February 2011 + + +   For example, assuming that the local module prefix is "ex", + +   unique "foo ex:bar/baz" + +   is mapped to the following attribute/value pair: + +   nma:unique="ex:foo ex:bar/ex:baz" + +10.56.  The 'units' Statement + +   This statement is mapped to the @nma:units attribute and ARGUMENT +   becomes its value. + +10.57.  The 'uses' Statement + +   If this statement has neither 'refine' nor 'augment' substatements, +   it is mapped to the <rng:ref> element, i.e., a reference to a named +   pattern, and the value of its @name attribute is set to ARGUMENT +   mangled according to Section 9.2.  If the RELAX NG definition of the +   referenced named pattern has not been added to the hybrid schema yet, +   the corresponding grouping MUST be found and its mapping installed as +   a subelement of <rng:grammar>, see Section 10.20. + +   Otherwise, if the 'uses' statement has any 'refine' or 'augment' +   substatements, the corresponding grouping must be looked up and its +   contents inserted under PARENT.  See Section 9.2.1 for further +   details and an example. + +10.58.  The 'value' Statement + +   This statement is ignored. + +10.59.  The 'when' Statement + +   This statement is mapped to the @nma:when attribute and ARGUMENT, +   translated according to Section 9.3, becomes it value. + +10.60.  The 'yang-version' Statement + +   This statement is not mapped to the output schema.  However, an +   implementation SHOULD check that it is compatible with the YANG +   version declared by the statement (currently version 1).  In the case +   of a mismatch, the implementation SHOULD report an error and +   terminate. + + + + + + + +Lhotka                       Standards Track                   [Page 60] + +RFC 6110                  Mapping YANG to DSDL             February 2011 + + +10.61.  The 'yin-element' Statement + +   This statement is not mapped to the output schema, but see the rules +   for extension handling in Section 9.4. + +11.  Mapping the Hybrid Schema to DSDL + +   As explained in Section 6, the second step of the YANG-to-DSDL +   mapping takes the hybrid schema and transforms it to various DSDL +   schemas capable of validating instance XML documents.  As an input +   parameter, this step takes, in the simplest case, just a +   specification of the NETCONF XML document type that is to be +   validated.  These document types can be, for example, the contents of +   a datastore, a reply to <nc:get> or <nc:get-config>, contents of +   other RPC requests/replies and event notifications, and so on. + +   The second mapping step has to accomplish the following three general +   tasks: + +   1.  Extract the parts of the hybrid schema that are appropriate for +       the requested document type.  For example, if a <nc:get> reply is +       to be validated, the subtree under <nma:data> has to be selected. + +   2.  The schema must be adapted to the specific encapsulating XML +       elements mandated by the RPC layer.  These are, for example, <nc: +       rpc> and <nc:data> elements in the case of a <nc:get> reply or +       <en:notification> for a notification. + +   3.  Finally, NETMOD-specific annotations that are relevant for the +       schema language of the generated schema must be mapped to the +       corresponding patterns or rules. + +   These three tasks are together much simpler than the first mapping +   step and can be effectively implemented using XSL transformations +   [XSLT]. + +   The following subsections describe the details of the second mapping +   step for the individual DSDL schema languages.  Section 12 then +   contains a detailed specification for the mapping of all NETMOD- +   specific annotations. + +11.1.  Generating RELAX NG Schemas for Various Document Types + +   With one minor exception, obtaining a validating RELAX NG schema from +   the hybrid schema only means taking appropriate parts of the hybrid +   schema and assembling them in a new RELAX NG grammar, perhaps after +   removing all unwanted annotations. + + + + +Lhotka                       Standards Track                   [Page 61] + +RFC 6110                  Mapping YANG to DSDL             February 2011 + + +   The structure of the resulting RELAX NG schema is similar to that of +   the hybrid schema: the root grammar contains embedded grammars, one +   for each input YANG module.  However, as explained in Section 8.2, +   global named pattern definitions (children of the root <rng:grammar> +   element) MUST be moved to a separate schema file. + +   Depending on the XML document type that is the target for validation, +   such as <nc:get> or <nc:get-config> reply, RPC operations or +   notifications, patterns defining corresponding top-level information +   items MUST be added, such as <nc:rpc-reply> with the @message-id +   attribute and so on. + +   In order to avoid copying common named pattern definitions for common +   NETCONF elements and attributes to every single output RELAX NG file, +   such schema-independent definitions SHOULD be collected in a library +   file that is then included by the validating RELAX NG schemas. +   Appendix B has the listing of such a library file. + +   The minor exception mentioned above is the annotation @nma:config, +   which must be observed if the target document type is a reply to <nc: +   get-config>.  In this case, each element definition that has this +   attribute with the value of "false" MUST be removed from the schema +   together with its descendants.  See Section 12.1 for more details. + +11.2.  Mapping Semantic Constraints to Schematron + +   Schematron schemas tend to be much flatter and more uniform compared +   to RELAX NG.  They have exactly four levels of XML hierarchy: <sch: +   schema>, <sch:pattern>, <sch:rule>, and <sch:assert> or <sch:report>. + +   In a Schematron schema generated by the second mapping step, the +   basic unit of organization is a rule represented by the <sch:rule> +   element.  The following NETMOD-specific annotations from the hybrid +   schema (henceforth called "semantic annotations") are mapped to +   corresponding Schematron rules: <nma:must>, @nma:key, @nma:unique, +   @nma:max-elements, @nma:min-elements, @nma:when, @nma:leafref, @nma: +   leaf-list, and also @nma:mandatory appearing as an attribute of <rng: +   choice> (see Section 11.2.1). + +   Each input YANG module is mapped to a Schematron pattern whose @id +   attribute is set to the module name.  Every <rng:element> pattern +   containing at least one of the above-mentioned semantic annotations +   is then mapped to a Schematron rule: + +   <sch:rule context="XELEM"> +     ... +   </sch:rule> + + + + +Lhotka                       Standards Track                   [Page 62] + +RFC 6110                  Mapping YANG to DSDL             February 2011 + + +   The value of the mandatory @context attribute of <sch:rule> (denoted +   as XELEM) MUST be set to the absolute path of the context element in +   the data tree.  The <sch:rule> element contains the mappings of all +   contained semantic annotations in the form of Schematron asserts or +   reports. + +   Semantic annotations appearing inside a named pattern definition +   (i.e., having <rng:define> among its ancestors) require special +   treatment because they may be potentially used in different contexts. +   This is accomplished by using Schematron abstract patterns that use +   the "$pref" variable in place of the local namespace prefix.  The +   value of the @id attribute of such an abstract pattern MUST be set to +   the name of the named pattern definition that is being mapped (i.e., +   the mangled name of the original YANG grouping). + +   When the abstract pattern is instantiated, the values of the +   following two parameters MUST be provided: + +   o  pref: the actual namespace prefix, + +   o  start: XPath expression defining the context in which the grouping +      is used. + +   EXAMPLE.  Consider the following YANG module: + +   module example4 { +     namespace "http://example.com/ns/example4"; +     prefix ex4; +     uses sorted-leaf-list; +     grouping sorted-leaf-list { +       leaf-list sorted-entry { +         must "not(preceding-sibling::sorted-entry > .)" { +           error-message "Entries must appear in ascending order."; +         } +         type uint8; +       } +     } +   } + + + + + + + + + + + + + +Lhotka                       Standards Track                   [Page 63] + +RFC 6110                  Mapping YANG to DSDL             February 2011 + + +   The resulting Schematron schema for a reply to <nc:get> is then as +   follows: + +   <?xml version="1.0" encoding="utf-8"?> +   <sch:schema xmlns:sch="http://purl.oclc.org/dsdl/schematron"> +     <sch:ns uri="http://example.com/ns/example4" prefix="ex4"/> +     <sch:ns uri="urn:ietf:params:xml:ns:netconf:base:1.0" +             prefix="nc"/> +     <sch:pattern abstract="true" +                  id="_example4__sorted-leaf-list"> +       <sch:rule context="$start/$pref:sorted-entry"> +         <sch:report +             test=". = preceding-sibling::$pref:sorted-entry"> +           Duplicate leaf-list entry "<sch:value-of select="."/>". +         </sch:report> +         <sch:assert +             test="not(preceding-sibling::$pref:sorted-entry > .)"> +           Entries must appear in ascending order. +         </sch:assert> +       </sch:rule> +     </sch:pattern> +     <sch:pattern id="example4"/> +     <sch:pattern id="id2573371" is-a="_example4__sorted-leaf-list"> +       <sch:param name="start" value="/nc:rpc-reply/nc:data"/> +       <sch:param name="pref" value="ex4"/> +     </sch:pattern> +   </sch:schema> + +   The "sorted-leaf-list" grouping from the input module is mapped to an +   abstract pattern with an @id value of "_example4__sorted-leaf-list" +   in which the 'must' statement corresponds to the <sch:assert> +   element.  The abstract pattern is the instantiated by the pattern +   with an @id value of "id2573371", which sets the "start" and "pref" +   parameters to appropriate values. + +   Note that another Schematron element, <sch:report>, was automatically +   added, checking for duplicate leaf-list entries. + +   The mapping from the hybrid schema to Schematron proceeds in the +   following steps: + +   1.  First, the active subtree(s) of the hybrid schema must be +       selected depending on the requested target document type.  This +       procedure is identical to the RELAX NG case, including the +       handling of @nma:config if the target document type is <nc:get- +       config> reply. + + + + + +Lhotka                       Standards Track                   [Page 64] + +RFC 6110                  Mapping YANG to DSDL             February 2011 + + +   2.  Namespaces of all input YANG modules, together with the +       namespaces of base NETCONF ("nc" prefix) or notifications ("en" +       prefix) MUST be declared using the <sch:ns> element, for example: + +   <sch:ns uri="http://example.com/ns/example4" prefix="ex4"/> + +   3.  One pattern is created for every input module.  In addition, an +       abstract pattern is created for every named pattern definition +       containing one or more semantic annotations. + +   4.  A <sch:rule> element is created for each element pattern +       containing semantic annotations. + +   5.  Every such annotation is then mapped to an <sch:assert> or <sch: +       report> element, which is installed as a child of the <sch:rule> +       element. + +11.2.1.  Constraints on Mandatory Choice + +   In order to fully represent the semantics of YANG's 'choice' +   statement with the "mandatory true;" substatement, the RELAX NG +   grammar has to be combined with a special Schematron rule. + +   EXAMPLE.  Consider the following module: + +   module example5 { +       namespace "http://example.com/ns/example5"; +       prefix ex5; +       choice foobar { +           mandatory true; +           case foo { +               leaf foo1 { +                   type uint8; +               } +               leaf foo2 { +                   type uint8; +               } +           } +           leaf bar { +               type uint8; +           } +       } +   } + + + + + + + + +Lhotka                       Standards Track                   [Page 65] + +RFC 6110                  Mapping YANG to DSDL             February 2011 + + +   In this module, all three leaf nodes in both case branches are +   optional but because of the "mandatory true;" statement, at least one +   of them must be present in a valid configuration.  The 'choice' +   statement from this module is mapped to the following fragment of the +   RELAX NG schema: + +   <rng:choice> +     <rng:interleave> +       <rng:optional> +         <rng:element name="ex5:foo1"> +           <rng:data type="unsignedByte"/> +         </rng:element> +       </rng:optional> +       <rng:optional> +         <rng:element name="ex5:foo2"> +           <rng:data type="unsignedByte"/> +         </rng:element> +       </rng:optional> +     </rng:interleave> +     <rng:element name="ex5:bar"> +       <rng:data type="unsignedByte"/> +     </rng:element> +   </rng:choice> + +   In the second case branch, the "ex5:bar" element is defined as +   mandatory so that this element must be present in a valid +   configuration if this branch is selected.  However, the two elements +   in the first branch "foo" cannot be both declared as mandatory since +   each of them alone suffices for a valid configuration.  As a result, +   the above RELAX NG fragment would successfully validate +   configurations where none of the three leaf elements are present. + +   Therefore, mandatory choices, which can be recognized in the hybrid +   schema as <rng:choice> elements with the @nma:mandatory annotation, +   have to be handled in a special way: for each mandatory choice where +   at least one of the cases contains more than one node, a Schematron +   rule MUST be added enforcing the presence of at least one element +   from any of the cases.  (RELAX NG schema guarantees that elements +   from different cases cannot be mixed together, that all mandatory +   nodes are present, etc.). + +   For the example module above, the Schematron rule will be as follows: + +   <sch:rule context="/nc:rpc-reply/nc:data"> +     <sch:assert test="ex5:foo1 or ex5:foo2 or ex5:bar"> +       Node(s) from at least one case of choice "foobar" must exist. +     </sch:assert> +   </sch:rule> + + + +Lhotka                       Standards Track                   [Page 66] + +RFC 6110                  Mapping YANG to DSDL             February 2011 + + +11.3.  Mapping Default Values to DSRL + +   DSRL is the only component of DSDL that is allowed to change the +   information set of the validated XML document.  While DSRL also has +   other functions, YANG-to-DSDL mapping uses it only for specifying and +   applying default contents.  For XML instance documents based on YANG +   data models, insertion of default contents may potentially take place +   for all implicit nodes identified by the rules in Section 9.1.2. + +   In DSRL, the default contents of an element are specified using the +   <dsrl:default-content> element, which is a child of <dsrl:element- +   map>.  Two sibling elements of <dsrl:default-content> determine the +   context for the application of the default contents, see [DSRL]: + +   o  the <dsrl:parent> element contains an XSLT pattern specifying the +      parent element; the default contents are applied only if the +      parent element exists in the instance document; + +   o  the <dsrl:name> contains the XML name of the element that, if +      missing or empty, is inserted together with the contents of <dsrl: +      default-content>. + +   The <dsrl:parent> element is optional in a general DSRL schema but, +   for the purpose of the YANG-to-DSDL mapping, this element MUST be +   always present, in order to guarantee a proper application of default +   contents. + +   DSRL mapping only deals with <rng:element> patterns in the hybrid +   schema that define implicit nodes (see Section 9.1.2).  Such element +   patterns are distinguished by having NETMOD-specific annotation +   attributes @nma:default or @nma:implicit, i.e., either: + +   <rng:element name="ELEM" nma:default="DEFVALUE"> +     ... +   </rng:element> + +   or + +   <rng:element name="ELEM" nma:implicit="true"> +     ... +   </rng:element> + +   The former case applies to leaf nodes having the 'default' +   substatement, but also to leaf nodes that obtain their default value +   from a typedef, if this typedef is expanded according to the rules in +   Section 9.2.2 so that the @nma:default annotation is attached +   directly to the leaf's element pattern. + + + + +Lhotka                       Standards Track                   [Page 67] + +RFC 6110                  Mapping YANG to DSDL             February 2011 + + +   The latter case is used for all implicit containers (see Section 9.1) +   and for leafs that obtain the default value from a typedef and don't +   have the @nma:default annotation. + +   In the simplest case, both element patterns are mapped to the +   following DSRL element map: + +   <dsrl:element-map> +     <dsrl:parent>XPARENT</dsrl:parent> +     <dsrl:name>ELEM</dsrl:name> +     <dsrl:default-content>DEFCONT</dsrl:default-content> +   </dsrl:element-map> + +   where XPARENT is the absolute XPath of ELEM's parent element in the +   data tree and DEFCONT is constructed as follows: + +   o  If the implicit node ELEM is a leaf and has the @nma:default +      attribute, DEFCONT is set to the value of this attribute (denoted +      above as DEFVALUE). + +   o  If the implicit node ELEM is a leaf and has the @nma:implicit +      attribute with the value of "true", the default value has to be +      determined from the @nma:default attribute of the definition of +      ELEM's type (perhaps recursively) and used in place of DEFCONT in +      the above DSRL element map.  See also Section 9.2.2. + +   o  Otherwise, the implicit node ELEM is a container and DEFCONT is +      constructed as an XML fragment containing all descendant elements +      of ELEM that have either the @nma:implicit or the @nma:default +      attribute. + +   In addition, when mapping the default case of a choice, it has to be +   guaranteed that the default contents are not applied if any node from +   any non-default case is present.  This is accomplished by setting +   <dsrl:parent> in a special way: + +   <dsrl:parent>XPARENT[not (ELEM1|ELEM2|...|ELEMn)]</dsrl:parent> + +   where ELEM1, ELEM2, ...  ELEMn are the names of all top-level nodes +   from all non-default cases.  The rest of the element map is exactly +   as before. + + + + + + + + + + +Lhotka                       Standards Track                   [Page 68] + +RFC 6110                  Mapping YANG to DSDL             February 2011 + + +   EXAMPLE.  Consider the following YANG module: + +   module example6 { +     namespace "http://example.com/ns/example6"; +     prefix ex6; +     container outer { +       leaf leaf1 { +         type uint8; +         default 1; +       } +       choice one-or-two { +         default "one"; +         container one { +           leaf leaf2 { +             type uint8; +             default 2; +           } +         } +         leaf leaf3 { +           type uint8; +           default 3; +         } +       } +     } +   } + + + + + + + + + + + + + + + + + + + + + + + + + + +Lhotka                       Standards Track                   [Page 69] + +RFC 6110                  Mapping YANG to DSDL             February 2011 + + +   The DSRL schema generated for the "get-reply" target document type +   will be: + +   <?xml version="1.0" encoding="utf-8"?> +   <dsrl:maps xmlns:dsrl="http://purl.oclc.org/dsdl/dsrl" +              xmlns:ex6="http://example.com/ns/example6" +              xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0"> +     <dsrl:element-map> +       <dsrl:parent>/nc:rpc-reply/nc:data</dsrl:parent> +       <dsrl:name>ex6:outer</dsrl:name> +       <dsrl:default-content> +         <ex6:leaf1>1</ex6:leaf1> +         <ex6:one> +           <ex6:leaf2>2</ex6:leaf2> +         </ex6:one> +       </dsrl:default-content> +     </dsrl:element-map> +     <dsrl:element-map> +       <dsrl:parent>/nc:rpc-reply/nc:data/ex6:outer</dsrl:parent> +       <dsrl:name>ex6:leaf1</dsrl:name> +       <dsrl:default-content>1</dsrl:default-content> +     </dsrl:element-map> +     <dsrl:element-map> +       <dsrl:parent> +         /nc:rpc-reply/nc:data/ex6:outer[not(ex6:leaf3)] +       </dsrl:parent> +       <dsrl:name>ex6:one</dsrl:name> +       <dsrl:default-content> +         <ex6:leaf2>2</ex6:leaf2> +       </dsrl:default-content> +     </dsrl:element-map> +     <dsrl:element-map> +       <dsrl:parent> +         /nc:rpc-reply/nc:data/ex6:outer/ex6:one +       </dsrl:parent> +       <dsrl:name>ex6:leaf2</dsrl:name> +       <dsrl:default-content>2</dsrl:default-content> +     </dsrl:element-map> +   </dsrl:maps> + +   Note that the default value for "leaf3" defined in the YANG module is +   ignored because "leaf3" represents a non-default alternative of a +   choice and as such never becomes an implicit element. + + + + + + + + +Lhotka                       Standards Track                   [Page 70] + +RFC 6110                  Mapping YANG to DSDL             February 2011 + + +12.  Mapping NETMOD-Specific Annotations to DSDL Schema Languages + +   This section contains the mapping specification for the individual +   NETMOD-specific annotations.  In each case, the result of the mapping +   must be inserted into an appropriate context of the target DSDL +   schema as described in Section 11.  The context is determined by the +   element pattern in the hybrid schema to which the annotation is +   attached.  In the rest of this section, CONTELEM will denote the name +   of this context element properly qualified with its namespace prefix. + +12.1.  The @nma:config Annotation + +   If this annotation is present with the value of "false", the +   following rules MUST be observed for DSDL schemas of <nc:get-config> +   reply: + +   o  When generating RELAX NG, the contents of the CONTELEM definition +      MUST be changed to <rng:notAllowed>. + +   o  When generating Schematron or DSRL, the CONTELEM definition and +      all its descendants in the hybrid schema MUST be ignored. + +12.2.  The @nma:default Annotation + +   This annotation is used for generating the DSRL schema as described +   in Section 11.3. + +12.3.  The <nma:error-app-tag> Annotation + +   This annotation currently has no mapping defined. + +12.4.  The <nma:error-message> Annotation + +   This annotation is handled within <nma:must>, see Section 12.13. + +12.5.  The @if-feature Annotation + +   The information about available features MAY be supplied as an input +   parameter to an implementation.  In this case, the following changes +   MUST be performed for all features that are considered unavailable: + +   o  When generating RELAX NG, the contents of the CONTELEM definition +      MUST be changed to <rng:notAllowed>. + +   o  When generating Schematron or DSRL, the CONTELEM definition and +      all its descendants in the hybrid schema MUST be ignored. + + + + + +Lhotka                       Standards Track                   [Page 71] + +RFC 6110                  Mapping YANG to DSDL             February 2011 + + +12.6.  The @nma:implicit Annotation + +   This annotation is used for generating the DSRL schema as described +   in Section 11.3. + +12.7.  The <nma:instance-identifier> Annotation + +   If this annotation element has the @require-instance attribute with +   the value of "false", it is ignored.  Otherwise, it is mapped to the +   following Schematron assert: + +   <sch:assert test="nmf:evaluate(.)"> +     The element pointed to by "CONTELEM" must exist. +   </sch:assert> + +   The nmf:evaluate() function is an XSLT extension function (see +   Extension Functions in [XSLT]) that evaluates an XPath expression at +   run time.  Such an extension function is available in Extended XSLT +   (EXSLT) or provided as a proprietary extension by some XSLT +   processors, for example Saxon. + +12.8.  The @nma:key Annotation + +   Assume this annotation attribute contains "k_1 k_2 ... k_n", i.e., +   specifies n children of CONTELEM as list keys.  The annotation is +   then mapped to the following Schematron report: + +   <sch:report test="CONDITION"> +     Duplicate key of list "CONTELEM" +   </sch:report> + +   where CONDITION has this form: +   preceding-sibling::CONTELEM[C_1 and C_2 and ... and C_n] + +   Each sub-expression C_i, for i=1,2,...,n, specifies the condition for +   violated uniqueness of the key k_i, namely + +   k_i=current()/k_i + +12.9.  The @nma:leaf-list Annotation + +   This annotation is mapped to the following Schematron rule, which +   detects duplicate entries of a leaf-list: + +   <sch:report +       test=". = preceding-sibling::PREFIX:sorted-entry"> +     Duplicate leaf-list entry "<sch:value-of select="."/>". +   </sch:report> + + + +Lhotka                       Standards Track                   [Page 72] + +RFC 6110                  Mapping YANG to DSDL             February 2011 + + +   See Section 11.2 for a complete example. + +12.10.  The @nma:leafref Annotation + +   This annotation is mapped to the following assert: + +   <sch:assert test="PATH=."> +     Leaf "PATH" does not exist for leafref value "VALUE" +   </sch:assert> + +   where PATH is the value of @nma:leafref and VALUE is the value of the +   context element in the instance document for which the referred leaf +   doesn't exist. + +12.11.  The @nma:min-elements Annotation + +   This annotation is mapped to the following Schematron assert: + +   <sch:assert test="count(../CONTELEM)>=MIN"> +     List "CONTELEM" - item count must be at least MIN +   </sch:assert> + +   where MIN is the value of @nma:min-elements. + +12.12.  The @nma:max-elements Annotation + +   This annotation is mapped to the following Schematron assert: + +<sch:assert +    test="count(../CONTELEM)<=MAX or preceding-sibling::../CONTELEM"> +  Number of list items must be at most MAX +</sch:assert> + +   where MAX is the value of @nma:min-elements. + +12.13.  The <nma:must> Annotation + +   This annotation is mapped to the following Schematron assert: + +   <sch:assert test="EXPRESSION"> +     MESSAGE +   </sch:assert> + +   where EXPRESSION is the value of the mandatory @assert attribute of +   <nma:must>.  If the <nma:error-message> subelement exists, MESSAGE is +   set to its contents; otherwise, it is set to the default message +   "Condition EXPRESSION must be true". + + + + +Lhotka                       Standards Track                   [Page 73] + +RFC 6110                  Mapping YANG to DSDL             February 2011 + + +12.14.  The <nma:ordered-by> Annotation + +   This annotation currently has no mapping defined. + +12.15.  The <nma:status> Annotation + +   This annotation currently has no mapping defined. + +12.16.  The @nma:unique Annotation + +   The mapping of this annotation is almost identical as for @nma:key, +   see Section 12.8, with two small differences: + +   o  The value of @nma:unique is a list of descendant schema node +      identifiers rather than simple leaf names.  However, the XPath +      expressions specified in Section 12.8 work without any +      modifications if the descendant schema node identifiers are +      substituted for k_1, k_2, ..., k_n. + +   o  The message appearing as the text of <sch:report> is different: +      "Violated uniqueness for list CONTELEM". + +12.17.  The @nma:when Annotation + +   This annotation is mapped to the following Schematron assert: + +   <sch:assert test="EXPRESSION"> +     Node "CONTELEM" is only valid when "EXPRESSION" is true. +   </sch:assert> + +   where EXPRESSION is the value of @nma:when. + + + + + + + + + + + + + + + + + + + + +Lhotka                       Standards Track                   [Page 74] + +RFC 6110                  Mapping YANG to DSDL             February 2011 + + +13.  IANA Considerations + +   This document requests the following two registrations of namespace +   URIs in the IETF XML registry [RFC3688]: + +   ----------------------------------------------------- +   URI: urn:ietf:params:xml:ns:netmod:dsdl-annotations:1 + +   Registrant Contact: The IESG. + +   XML: N/A, the requested URI is an XML namespace. +   ----------------------------------------------------- + +   ----------------------------------------------------- +   URI: urn:ietf:params:xml:ns:netmod:xpath-extensions:1 + +   Registrant Contact: The IESG. + +   XML: N/A, the requested URI is an XML namespace. +   ----------------------------------------------------- + +14.  Security Considerations + +   This document defines a procedure that maps data models expressed in +   the YANG language to a coordinated set of DSDL schemas.  The +   procedure itself has no security impact on the Internet. + +   DSDL schemas obtained by the mapping procedure may be used for +   validating the contents of NETCONF messages or entire datastores, and +   thus they provide additional validity checks above those performed by +   NETCONF server and client implementations supporting YANG data +   models.  The strictness of this validation is directly derived from +   the source YANG modules that the validated XML data adhere to. + +15.  Contributors + +   The following people contributed significantly to the initial version +   of this document: + +   o  Rohan Mahy + +   o  Sharon Chisholm (Ciena) + + + + + + + + + +Lhotka                       Standards Track                   [Page 75] + +RFC 6110                  Mapping YANG to DSDL             February 2011 + + +16.  Acknowledgments + +   The editor wishes to thank the following individuals who provided +   helpful suggestions and/or comments on various versions of this +   document: Andy Bierman, Martin Bjorklund, Jirka Kosek, Juergen +   Schoenwaelder, and Phil Shafer. + +17.  References + +17.1.  Normative References + +   [DSDL]         ISO/IEC, "Document Schema Definition Languages (DSDL) +                  - Part 1: Overview", ISO/IEC 19757-1, November 2004. + +   [DSRL]         ISO/IEC, "Information Technology - Document Schema +                  Definition Languages (DSDL) - Part 8: Document +                  Semantics Renaming Language - DSRL", ISO/ +                  IEC 19757-8:2008(E), December 2008. + +   [RFC2119]      Bradner, S., "Key words for use in RFCs to Indicate +                  Requirement Levels", BCP 14, RFC 2119, March 1997. + +   [RFC3688]      Mealling, M., "The IETF XML Registry", BCP 81, +                  RFC 3688, January 2004. + +   [RFC4741]      Enns, R., "NETCONF Configuration Protocol", RFC 4741, +                  December 2006. + +   [RFC6020]      Bjorklund, M., Ed., "YANG - A Data Modeling Language +                  for Network Configuration Protocol (NETCONF)", +                  RFC 6020, October 2010. + +   [RFC6021]      Schoenwaelder, J., Ed., "Common YANG Data Types", +                  RFC 6021, October 2010. + +   [RNG]          ISO/IEC, "Information Technology - Document Schema +                  Definition Languages (DSDL) - Part 2: Regular-Grammar- +                  Based Validation - RELAX NG. Second Edition.", ISO/ +                  IEC 19757-2:2008(E), December 2008. + +   [RNG-CS]       ISO/IEC, "Information Technology - Document Schema +                  Definition Languages (DSDL) - Part 2: Regular-Grammar- +                  Based Validation - RELAX NG. AMENDMENT 1: Compact +                  Syntax", ISO/IEC 19757-2:2003/Amd. 1:2006(E), +                  January 2006. + + + + + + +Lhotka                       Standards Track                   [Page 76] + +RFC 6110                  Mapping YANG to DSDL             February 2011 + + +   [RNG-DTD]      Clark, J., Ed. and M. Murata, Ed., "RELAX NG DTD +                  Compatibility", OASIS Committee Specification, 3 +                  December 2001. + +   [Schematron]   ISO/IEC, "Information Technology - Document Schema +                  Definition Languages (DSDL) - Part 3: Rule-Based +                  Validation - Schematron", ISO/IEC 19757-3:2006(E), +                  June 2006. + +   [XML]          Bray, T., Paoli, J., Sperberg-McQueen, C., Maler, E., +                  and F. Yergeau, "Extensible Markup Language (XML) 1.0 +                  (Fifth Edition)", World Wide Web Consortium +                  Recommendation REC-xml-20081126, November 2008, +                  <http://www.w3.org/TR/2006/REC-xml-20060816>. + +   [XML-INFOSET]  Tobin, R. and J. Cowan, "XML Information Set (Second +                  Edition)", World Wide Web Consortium +                  Recommendation REC-xml-infoset-20040204, +                  February 2004, +                  <http://www.w3.org/TR/2004/REC-xml-infoset-20040204>. + +   [XPath]        Clark, J. and S. DeRose, "XML Path Language (XPath) +                  Version 1.0", World Wide Web Consortium +                  Recommendation REC-xpath-19991116, November 1999, +                  <http://www.w3.org/TR/1999/REC-xpath-19991116>. + +   [XSD-D]        Biron, P. and A. Malhotra, "XML Schema Part 2: +                  Datatypes Second Edition", World Wide Web Consortium +                  Recommendation REC-xmlschema-2-20041028, October 2004, +                  <http://www.w3.org/TR/2004/REC-xmlschema-2-20041028>. + +   [XSLT]         Clark, J., "XSL Transformations (XSLT) Version 1.0", +                  World Wide Web Consortium Recommendation REC-xslt- +                  19991116, November 1999. + +17.2.  Informative References + +   [DHCPtut]      Bjorklund, M., "DHCP Tutorial", November 2007, <http:/ +                  /www.yang-central.org/twiki/bin/view/Main/ +                  DhcpTutorial>. + +   [RFC1157]      Case, J., Fedor, M., Schoffstall, M., and J. Davin, +                  "Simple Network Management Protocol (SNMP)", RFC 1157, +                  May 1990. + + + + + + + +Lhotka                       Standards Track                   [Page 77] + +RFC 6110                  Mapping YANG to DSDL             February 2011 + + +   [RFC2578]      McCloghrie, K., Ed., Perkins, D., Ed., and J. +                  Schoenwaelder, Ed., "Structure of Management +                  Information Version 2 (SMIv2)", STD 58, RFC 2578, +                  April 1999. + +   [RFC5013]      Kunze, J., "The Dublin Core Metadata Element Set", +                  RFC 5013, August 2007. + +   [RFC5277]      Chisholm, S. and H. Trevino, "NETCONF Event +                  Notifications", RFC 5277, July 2008. + +   [Trang]        Clark, J., "Trang: Multiformat schema converter based +                  on RELAX NG", 2008, +                  <http://www.thaiopensource.com/relaxng/trang.html>. + +   [Vli04]        van der Vlist, E., "RELAX NG", O'Reilly, 2004. + +   [XSD]          Thompson, H., Beech, D., Maloney, M., and N. +                  Mendelsohn, "XML Schema Part 1: Structures Second +                  Edition", World Wide Web Consortium +                  Recommendation REC-xmlschema-1-20041028, October 2004, +                  <http://www.w3.org/TR/2004/REC-xmlschema-1-20041028>. + +   [pyang]        Bjorklund, M. and L. Lhotka, "pyang: An extensible +                  YANG validator and converter in Python", 2010, +                  <http://code.google.com/p/pyang/>. + + + + + + + + + + + + + + + + + + + + + + + + + +Lhotka                       Standards Track                   [Page 78] + +RFC 6110                  Mapping YANG to DSDL             February 2011 + + +Appendix A.  RELAX NG Schema for NETMOD-Specific Annotations + +   This appendix defines the content model for all NETMOD-specific +   annotations in the form of RELAX NG named pattern definitions. + +  <CODE BEGINS> file "nmannot.rng" + +  <?xml version="1.0" encoding="UTF-8"?> +  <grammar xmlns="http://relaxng.org/ns/structure/1.0" +           xmlns:nma="urn:ietf:params:xml:ns:netmod:dsdl-annotations:1" +           datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes"> + +  <define name="config-attribute"> +    <attribute name="nma:config"> +      <data type="boolean"/> +    </attribute> +  </define> + +  <define name="data-element"> +    <element name="nma:data"> +      <ref name="__anyxml__"/> +    </element> +  </define> + +  <define name="default-attribute"> +    <attribute name="nma:default"> +      <data type="string"/> +    </attribute> +  </define> + +  <define name="error-app-tag-element"> +    <element name="nma:error-app-tag"> +      <text/> +    </element> +  </define> + +  <define name="error-message-element"> +    <element name="nma:error-message"> +      <text/> +    </element> +  </define> + + + + + + + + + + +Lhotka                       Standards Track                   [Page 79] + +RFC 6110                  Mapping YANG to DSDL             February 2011 + + +  <define name="if-feature-attribute"> +    <attribute name="nma:if-feature"> +      <list> +        <data type="QName"/> +      </list> +    </attribute> +  </define> + +  <define name="implicit-attribute"> +    <attribute name="nma:implicit"> +      <data type="boolean"/> +    </attribute> +  </define> + +  <define name="instance-identifier-element"> +    <element name="nma:instance-identifier"> +      <optional> +        <attribute name="nma:require-instance"> +          <data type="boolean"/> +        </attribute> +      </optional> +    </element> +  </define> + +  <define name="key-attribute"> +    <attribute name="nma:key"> +      <list> +        <data type="QName"/> +      </list> +    </attribute> +  </define> + +  <define name="leaf-list-attribute"> +    <attribute name="nma:leaf-list"> +      <data type="boolean"/> +    </attribute> +  </define> + +  <define name="leafref-attribute"> +    <attribute name="nma:leafref"> +      <data type="string"/> +    </attribute> +  </define> + + + + + + + + +Lhotka                       Standards Track                   [Page 80] + +RFC 6110                  Mapping YANG to DSDL             February 2011 + + +  <define name="mandatory-attribute"> +    <attribute name="nma:mandatory"> +      <data type="Name"/> +    </attribute> +  </define> + +  <define name="max-elements-attribute"> +    <attribute name="nma:max-elements"> +      <data type="nonNegativeInteger"/> +    </attribute> +  </define> + +  <define name="min-elements-attribute"> +    <attribute name="nma:min-elements"> +      <data type="nonNegativeInteger"/> +    </attribute> +  </define> + +  <define name="module-attribute"> +    <attribute name="nma:module"> +      <data type="Name"/> +    </attribute> +  </define> + +  <define name="must-element"> +    <element name="nma:must"> +      <attribute name="assert"> +        <data type="string"/> +      </attribute> +      <interleave> +        <optional> +          <ref name="error-app-tag-element"/> +        </optional> +        <optional> +          <ref name="error-message-element"/> +        </optional> +      </interleave> +    </element> +  </define> + + + + + + + + + + + + +Lhotka                       Standards Track                   [Page 81] + +RFC 6110                  Mapping YANG to DSDL             February 2011 + + +  <define name="notifications-element"> +    <element name="nma:notifications"> +      <zeroOrMore> +        <element name="nma:notification"> +          <ref name="__anyxml__"/> +        </element> +      </zeroOrMore> +    </element> +  </define> + +  <define name="rpcs-element"> +    <element name="nma:rpcs"> +      <zeroOrMore> +        <element name="nma:rpc"> +          <interleave> +            <element name="nma:input"> +              <ref name="__anyxml__"/> +            </element> +            <optional> +              <element name="nma:output"> +                <ref name="__anyxml__"/> +              </element> +            </optional> +          </interleave> +        </element> +      </zeroOrMore> +    </element> +  </define> + +  <define name="ordered-by-attribute"> +    <attribute name="nma:ordered-by"> +      <choice> +        <value>user</value> +        <value>system</value> +      </choice> +    </attribute> +  </define> + + + + + + + + + + + + + + +Lhotka                       Standards Track                   [Page 82] + +RFC 6110                  Mapping YANG to DSDL             February 2011 + + +  <define name="status-attribute"> +    <optional> +      <attribute name="nma:status"> +        <choice> +          <value>current</value> +          <value>deprecated</value> +          <value>obsolete</value> +        </choice> +      </attribute> +    </optional> +  </define> + +  <define name="unique-attribute"> +    <optional> +      <attribute name="nma:unique"> +        <list> +          <data type="token"/> +        </list> +      </attribute> +    </optional> +  </define> + +  <define name="units-attribute"> +    <optional> +      <attribute name="nma:units"> +        <data type="string"/> +      </attribute> +    </optional> +  </define> + +  <define name="when-attribute"> +    <optional> +      <attribute name="nma:when"> +        <data type="string"/> +      </attribute> +    </optional> +  </define> + + + + + + + + + + + + + + +Lhotka                       Standards Track                   [Page 83] + +RFC 6110                  Mapping YANG to DSDL             February 2011 + + +  <define name="__anyxml__"> +    <zeroOrMore> +      <choice> +        <attribute> +          <anyName/> +        </attribute> +        <element> +          <anyName/> +          <ref name="__anyxml__"/> +        </element> +        <text/> +      </choice> +    </zeroOrMore> +  </define> + +  </grammar> + +  <CODE ENDS> + +Appendix B.  Schema-Independent Library + +   In order to avoid copying the common named pattern definitions to +   every RELAX NG schema generated in the second mapping step, the +   definitions are collected in a library file -- schema-independent +   library -- which is included by the validating schemas under the file +   name "relaxng-lib.rng" (XML syntax) and "relaxng-lib.rnc" (compact +   syntax).  The included definitions cover patterns for common elements +   from base NETCONF [RFC4741] and event notifications [RFC5277]. + +  <CODE BEGINS> file "relaxng-lib.rng" + +  <?xml version="1.0" encoding="UTF-8"?> + +  <grammar xmlns="http://relaxng.org/ns/structure/1.0" +           xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0" +           xmlns:en="urn:ietf:params:xml:ns:netconf:notification:1.0" +           datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes"> + +    <define name="message-id-attribute"> +      <attribute name="message-id"> +        <data type="string"> +          <param name="maxLength">4095</param> +        </data> +      </attribute> +    </define> + + + + + + +Lhotka                       Standards Track                   [Page 84] + +RFC 6110                  Mapping YANG to DSDL             February 2011 + + +    <define name="ok-element"> +      <element name="nc:ok"> +        <empty/> +      </element> +    </define> + +    <define name="eventTime-element"> +      <element name="en:eventTime"> +        <data type="dateTime"/> +      </element> +    </define> +  </grammar> + +  <CODE ENDS> + +Appendix C.  Mapping DHCP Data Model - A Complete Example + +   This appendix demonstrates both steps of the YANG-to-DSDL mapping +   applied to the "canonical" DHCP tutorial [DHCPtut] data model.  The +   input YANG module is shown in Appendix C.1 and the output schemas in +   the following two subsections. + +   The hybrid schema was obtained by the "dsdl" plugin of the pyang tool +   [pyang] and the validating DSDL schemas were obtained by XSLT +   stylesheets that are also part of pyang distribution. + +   Due to the limit of 72 characters per line, a few long strings +   required manual editing, in particular the regular expression +   patterns for IP addresses, etc.  These were replaced by the +   placeholder string "... regex pattern ...".  Also, line breaks were +   added to several documentation strings and Schematron messages. + +   Other than that, the results of the automatic translations were not +   changed. + +C.1.  Input YANG Module + +   module dhcp { +     namespace "http://example.com/ns/dhcp"; +     prefix dhcp; + +     import ietf-yang-types { prefix yang; } +     import ietf-inet-types { prefix inet; } + + + + + + + + +Lhotka                       Standards Track                   [Page 85] + +RFC 6110                  Mapping YANG to DSDL             February 2011 + + +     organization +       "yang-central.org"; +     description +       "Partial data model for DHCP, based on the config of +        the ISC DHCP reference implementation."; + +     container dhcp { +       description +         "configuration and operational parameters for a DHCP server."; + +       leaf max-lease-time { +         type uint32; +         units seconds; +         default 7200; +       } + +       leaf default-lease-time { +         type uint32; +         units seconds; +         must '. <= ../max-lease-time' { +           error-message +             "The default-lease-time must be less than max-lease-time"; +         } +         default 600; +       } + +       uses subnet-list; + +       container shared-networks { +         list shared-network { +           key name; + +           leaf name { +             type string; +           } +           uses subnet-list; +         } +       } + +       container status { +         config false; +         list leases { +           key address; + + + + + + + + +Lhotka                       Standards Track                   [Page 86] + +RFC 6110                  Mapping YANG to DSDL             February 2011 + + +           leaf address { +             type inet:ip-address; +           } +           leaf starts { +             type yang:date-and-time; +           } +           leaf ends { +             type yang:date-and-time; +           } +           container hardware { +             leaf type { +               type enumeration { +                 enum "ethernet"; +                 enum "token-ring"; +                 enum "fddi"; +               } +             } +             leaf address { +               type yang:phys-address; +             } +           } +         } +       } +     } + +     grouping subnet-list { +       description "A reusable list of subnets"; +       list subnet { +         key net; +         leaf net { +           type inet:ip-prefix; +         } +         container range { +           presence "enables dynamic address assignment"; +           leaf dynamic-bootp { +             type empty; +             description +               "Allows BOOTP clients to get addresses in this range"; +           } + + + + + + + + + + + + +Lhotka                       Standards Track                   [Page 87] + +RFC 6110                  Mapping YANG to DSDL             February 2011 + + +           leaf low { +             type inet:ip-address; +             mandatory true; +           } +           leaf high { +             type inet:ip-address; +             mandatory true; +           } +         } + +         container dhcp-options { +           description "Options in the DHCP protocol"; +           leaf-list router { +             type inet:host; +             ordered-by user; +             reference "RFC 2132, sec. 3.8"; +           } +           leaf domain-name { +             type inet:domain-name; +             reference "RFC 2132, sec. 3.17"; +           } +         } + +         leaf max-lease-time { +           type uint32; +           units seconds; +           default 7200; +         } +       } +     } +   } + +C.2.  Hybrid Schema + +   <?xml version="1.0" encoding="UTF-8"?> +   <grammar +       xmlns="http://relaxng.org/ns/structure/1.0" +       xmlns:nma="urn:ietf:params:xml:ns:netmod:dsdl-annotations:1" +       xmlns:dc="http://purl.org/dc/terms" +       xmlns:a="http://relaxng.org/ns/compatibility/annotations/1.0" +       xmlns:dhcp="http://example.com/ns/dhcp" +       datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes"> +    <dc:creator>Pyang 1.0a, DSDL plugin</dc:creator> +    <dc:date>2010-06-17</dc:date> +    <start> +     <grammar nma:module="dhcp" ns="http://example.com/ns/dhcp"> +      <dc:source>YANG module 'dhcp'</dc:source> +      <start> + + + +Lhotka                       Standards Track                   [Page 88] + +RFC 6110                  Mapping YANG to DSDL             February 2011 + + +       <nma:data> +        <optional> +         <element nma:implicit="true" name="dhcp:dhcp"> +          <interleave> +           <a:documentation> +            configuration and operational parameters for a DHCP server. +           </a:documentation> +           <optional> +            <element nma:default="7200" +                     name="dhcp:max-lease-time" +                     nma:units="seconds"> +             <data type="unsignedInt"/> +            </element> +           </optional> +           <optional> +            <element nma:default="600" +                     name="dhcp:default-lease-time" +                     nma:units="seconds"> +             <data type="unsignedInt"/> +             <nma:must assert=". <= ../dhcp:max-lease-time"> +              <nma:error-message> +               The default-lease-time must be less than max-lease-time +              </nma:error-message> +             </nma:must> +            </element> +           </optional> +           <ref name="_dhcp__subnet-list"/> +           <optional> +            <element name="dhcp:shared-networks"> +             <zeroOrMore> +              <element nma:key="dhcp:name" +                       name="dhcp:shared-network"> +               <element name="dhcp:name"> +                <data type="string"/> +               </element> +               <ref name="_dhcp__subnet-list"/> +              </element> +             </zeroOrMore> +            </element> +           </optional> +           <optional> +            <element name="dhcp:status" nma:config="false"> +             <zeroOrMore> +              <element nma:key="dhcp:address" +                       name="dhcp:leases"> +               <element name="dhcp:address"> +                <ref name="ietf-inet-types__ip-address"/> +               </element> + + + +Lhotka                       Standards Track                   [Page 89] + +RFC 6110                  Mapping YANG to DSDL             February 2011 + + +               <interleave> +                <optional> +                 <element name="dhcp:starts"> +                  <ref name="ietf-yang-types__date-and-time"/> +                 </element> +                </optional> +                <optional> +                 <element name="dhcp:ends"> +                  <ref name="ietf-yang-types__date-and-time"/> +                 </element> +                </optional> +                <optional> +                 <element name="dhcp:hardware"> +                  <interleave> +                   <optional> +                    <element name="dhcp:type"> +                     <choice> +                      <value>ethernet</value> +                      <value>token-ring</value> +                      <value>fddi</value> +                     </choice> +                    </element> +                   </optional> +                   <optional> +                    <element name="dhcp:address"> +                     <ref name="ietf-yang-types__phys-address"/> +                    </element> +                   </optional> +                  </interleave> +                 </element> +                </optional> +               </interleave> +              </element> +             </zeroOrMore> +            </element> +           </optional> +          </interleave> +         </element> +        </optional> +       </nma:data> +       <nma:rpcs/> +       <nma:notifications/> +      </start> +     </grammar> +    </start> +    <define name="ietf-yang-types__phys-address"> +     <data type="string"> +      <param name="pattern">([0-9a-fA-F]{2}(:[0-9a-fA-F]{2})*)?</param> + + + +Lhotka                       Standards Track                   [Page 90] + +RFC 6110                  Mapping YANG to DSDL             February 2011 + + +     </data> +    </define> +    <define name="ietf-inet-types__ipv6-address"> +     <data type="string"> +      <param name="pattern">... regex pattern ...</param> +      <param name="pattern">... regex pattern ...</param> +     </data> +    </define> +    <define name="ietf-inet-types__ip-prefix"> +     <choice> +      <ref name="ietf-inet-types__ipv4-prefix"/> +      <ref name="ietf-inet-types__ipv6-prefix"/> +     </choice> +    </define> +    <define name="ietf-inet-types__host"> +     <choice> +      <ref name="ietf-inet-types__ip-address"/> +      <ref name="ietf-inet-types__domain-name"/> +     </choice> +    </define> +    <define name="ietf-yang-types__date-and-time"> +     <data type="string"> +      <param name="pattern">... regex pattern ...</param> +     </data> +    </define> +    <define name="_dhcp__subnet-list"> +     <a:documentation>A reusable list of subnets</a:documentation> +     <zeroOrMore> +      <element nma:key="net" name="subnet"> +       <element name="net"> +        <ref name="ietf-inet-types__ip-prefix"/> +       </element> +       <interleave> +        <optional> +         <element name="range"> +          <interleave> +           <optional> +            <element name="dynamic-bootp"> +             <a:documentation> +              Allows BOOTP clients to get addresses in this range +             </a:documentation> +             <empty/> +            </element> +           </optional> +           <element name="low"> +            <ref name="ietf-inet-types__ip-address"/> +           </element> +           <element name="high"> + + + +Lhotka                       Standards Track                   [Page 91] + +RFC 6110                  Mapping YANG to DSDL             February 2011 + + +            <ref name="ietf-inet-types__ip-address"/> +           </element> +          </interleave> +         </element> +        </optional> +        <optional> +         <element name="dhcp-options"> +          <interleave> +           <a:documentation> +            Options in the DHCP protocol +           </a:documentation> +           <zeroOrMore> +            <element nma:leaf-list="true" name="router" +                     nma:ordered-by="user"> +             <a:documentation> +              See: RFC 2132, sec. 3.8 +             </a:documentation> +             <ref name="ietf-inet-types__host"/> +            </element> +           </zeroOrMore> +           <optional> +            <element name="domain-name"> +             <a:documentation> +              See: RFC 2132, sec. 3.17 +             </a:documentation> +             <ref name="ietf-inet-types__domain-name"/> +            </element> +           </optional> +          </interleave> +         </element> +        </optional> +        <optional> +         <element nma:default="7200" name="max-lease-time" +                  nma:units="seconds"> +          <data type="unsignedInt"/> +         </element> +        </optional> +       </interleave> +      </element> +     </zeroOrMore> +    </define> +    <define name="ietf-inet-types__domain-name"> +     <data type="string"> +      <param name="pattern">... regex pattern ...</param> +      <param name="minLength">1</param> +      <param name="maxLength">253</param> +     </data> +    </define> + + + +Lhotka                       Standards Track                   [Page 92] + +RFC 6110                  Mapping YANG to DSDL             February 2011 + + +    <define name="ietf-inet-types__ipv4-prefix"> +     <data type="string"> +      <param name="pattern">... regex pattern ...</param> +     </data> +    </define> +    <define name="ietf-inet-types__ipv4-address"> +     <data type="string"> +      <param name="pattern">... regex pattern ...</param> +     </data> +    </define> +    <define name="ietf-inet-types__ipv6-prefix"> +     <data type="string"> +      <param name="pattern">... regex pattern ...</param> +      <param name="pattern">... regex pattern ...</param> +     </data> +    </define> +    <define name="ietf-inet-types__ip-address"> +     <choice> +      <ref name="ietf-inet-types__ipv4-address"/> +      <ref name="ietf-inet-types__ipv6-address"/> +     </choice> +    </define> +   </grammar> + +C.3.  Final DSDL Schemas + +   This appendix contains DSDL schemas that were obtained from the +   hybrid schema in Appendix C.2 by XSL transformations.  These schemas +   can be directly used for validating a reply to unfiltered <nc:get> +   with the contents corresponding to the DHCP data model. + +   The RELAX NG schema (in two parts, as explained in Section 8.2) also +   includes the schema-independent library from Appendix B. + +C.3.1.  Main RELAX NG Schema for <nc:get> Reply + +   <?xml version="1.0" encoding="utf-8"?> +   <grammar +       xmlns="http://relaxng.org/ns/structure/1.0" +       xmlns:nma="urn:ietf:params:xml:ns:netmod:dsdl-annotations:1" +       xmlns:dhcp="http://example.com/ns/dhcp" +       datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes" +       ns="urn:ietf:params:xml:ns:netconf:base:1.0"> +    <include href="relaxng-lib.rng"/> +    <start> +     <element name="rpc-reply"> +      <ref name="message-id-attribute"/> +      <element name="data"> + + + +Lhotka                       Standards Track                   [Page 93] + +RFC 6110                  Mapping YANG to DSDL             February 2011 + + +       <interleave> +        <grammar ns="http://example.com/ns/dhcp"> +         <include href="dhcp-gdefs.rng"/> +         <start> +          <optional> +           <element name="dhcp:dhcp"> +            <interleave> +             <optional> +              <element name="dhcp:max-lease-time"> +               <data type="unsignedInt"/> +              </element> +             </optional> +             <optional> +              <element name="dhcp:default-lease-time"> +               <data type="unsignedInt"/> +              </element> +             </optional> +             <ref name="_dhcp__subnet-list"/> +             <optional> +              <element name="dhcp:shared-networks"> +               <zeroOrMore> +                <element name="dhcp:shared-network"> +                 <element name="dhcp:name"> +                  <data type="string"/> +                 </element> +                 <ref name="_dhcp__subnet-list"/> +                </element> +               </zeroOrMore> +              </element> +             </optional> +             <optional> +              <element name="dhcp:status"> +               <zeroOrMore> +                <element name="dhcp:leases"> +                 <element name="dhcp:address"> +                  <ref name="ietf-inet-types__ip-address"/> +                 </element> +                 <interleave> +                  <optional> +                   <element name="dhcp:starts"> +                    <ref name="ietf-yang-types__date-and-time"/> +                   </element> +                  </optional> +                  <optional> +                   <element name="dhcp:ends"> +                    <ref name="ietf-yang-types__date-and-time"/> +                   </element> +                  </optional> + + + +Lhotka                       Standards Track                   [Page 94] + +RFC 6110                  Mapping YANG to DSDL             February 2011 + + +                  <optional> +                   <element name="dhcp:hardware"> +                    <interleave> +                     <optional> +                      <element name="dhcp:type"> +                       <choice> +                        <value>ethernet</value> +                        <value>token-ring</value> +                        <value>fddi</value> +                       </choice> +                      </element> +                     </optional> +                     <optional> +                      <element name="dhcp:address"> +                       <ref name="ietf-yang-types__phys-address"/> +                      </element> +                     </optional> +                    </interleave> +                   </element> +                  </optional> +                 </interleave> +                </element> +               </zeroOrMore> +              </element> +             </optional> +            </interleave> +           </element> +          </optional> +         </start> +        </grammar> +       </interleave> +      </element> +     </element> +    </start> +   </grammar> + +C.3.2.  RELAX NG Schema - Global Named Pattern Definitions + +   <?xml version="1.0" encoding="utf-8"?> +   <grammar +       xmlns="http://relaxng.org/ns/structure/1.0" +       xmlns:nma="urn:ietf:params:xml:ns:netmod:dsdl-annotations:1" +       xmlns:dhcp="http://example.com/ns/dhcp" +       datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes"> +    <define name="ietf-yang-types__phys-address"> +     <data type="string"> +      <param name="pattern"> +       ([0-9a-fA-F]{2}(:[0-9a-fA-F]{2})*)? + + + +Lhotka                       Standards Track                   [Page 95] + +RFC 6110                  Mapping YANG to DSDL             February 2011 + + +      </param> +     </data> +    </define> +    <define name="ietf-inet-types__ipv6-address"> +     <data type="string"> +      <param name="pattern">... regex pattern ...</param> +     </data> +    </define> +    <define name="ietf-inet-types__ip-prefix"> +     <choice> +      <ref name="ietf-inet-types__ipv4-prefix"/> +      <ref name="ietf-inet-types__ipv6-prefix"/> +     </choice> +    </define> +    <define name="ietf-inet-types__host"> +     <choice> +      <ref name="ietf-inet-types__ip-address"/> +      <ref name="ietf-inet-types__domain-name"/> +     </choice> +    </define> +    <define name="ietf-yang-types__date-and-time"> +     <data type="string"> +      <param name="pattern">... regex pattern ...</param> +     </data> +    </define> +    <define name="_dhcp__subnet-list"> +     <zeroOrMore> +      <element name="subnet"> +       <element name="net"> +        <ref name="ietf-inet-types__ip-prefix"/> +       </element> +       <interleave> +        <optional> +         <element name="range"> +          <interleave> +           <optional> +            <element name="dynamic-bootp"> +             <empty/> +            </element> +           </optional> +           <element name="low"> +            <ref name="ietf-inet-types__ip-address"/> +           </element> +           <element name="high"> +            <ref name="ietf-inet-types__ip-address"/> +           </element> +          </interleave> +         </element> + + + +Lhotka                       Standards Track                   [Page 96] + +RFC 6110                  Mapping YANG to DSDL             February 2011 + + +        </optional> +        <optional> +         <element name="dhcp-options"> +          <interleave> +           <zeroOrMore> +            <element name="router"> +             <ref name="ietf-inet-types__host"/> +            </element> +           </zeroOrMore> +           <optional> +            <element name="domain-name"> +             <ref name="ietf-inet-types__domain-name"/> +            </element> +           </optional> +          </interleave> +         </element> +        </optional> +        <optional> +         <element name="max-lease-time"> +          <data type="unsignedInt"/> +         </element> +        </optional> +       </interleave> +      </element> +     </zeroOrMore> +    </define> +    <define name="ietf-inet-types__domain-name"> +     <data type="string"> +      <param name="pattern">... regex pattern ...</param> +      <param name="minLength">1</param> +      <param name="maxLength">253</param> +     </data> +    </define> +    <define name="ietf-inet-types__ipv4-prefix"> +     <data type="string"> +      <param name="pattern">... regex pattern ...</param> +     </data> +    </define> +    <define name="ietf-inet-types__ipv4-address"> +     <data type="string"> +      <param name="pattern">... regex pattern ...</param> +     </data> +    </define> +    <define name="ietf-inet-types__ipv6-prefix"> +     <data type="string"> +      <param name="pattern">... regex pattern ...</param> +      <param name="pattern">... regex pattern ...</param> +     </data> + + + +Lhotka                       Standards Track                   [Page 97] + +RFC 6110                  Mapping YANG to DSDL             February 2011 + + +    </define> +    <define name="ietf-inet-types__ip-address"> +     <choice> +      <ref name="ietf-inet-types__ipv4-address"/> +      <ref name="ietf-inet-types__ipv6-address"/> +     </choice> +    </define> +   </grammar> + +C.3.3.  Schematron Schema for <nc:get> Reply + +  <?xml version="1.0" encoding="utf-8"?> +  <sch:schema xmlns:sch="http://purl.oclc.org/dsdl/schematron"> +   <sch:ns uri="http://example.com/ns/dhcp" prefix="dhcp"/> +   <sch:ns uri="urn:ietf:params:xml:ns:netconf:base:1.0" prefix="nc"/> +   <sch:pattern abstract="true" id="_dhcp__subnet-list"> +    <sch:rule context="$start/$pref:subnet"> +     <sch:report test="preceding-sibling::$pref:subnet +                       [$pref:net=current()/$pref:net]"> +      Duplicate key "net" +     </sch:report> +    </sch:rule> +    <sch:rule +      context="$start/$pref:subnet/$pref:dhcp-options/$pref:router"> +     <sch:report test=".=preceding-sibling::router"> +      Duplicate leaf-list value "<sch:value-of select="."/>" +     </sch:report> +    </sch:rule> +   </sch:pattern> +   <sch:pattern id="dhcp"> +    <sch:rule +      context="/nc:rpc-reply/nc:data/dhcp:dhcp/dhcp:default-lease-time"> +     <sch:assert test=". <= ../dhcp:max-lease-time"> +      The default-lease-time must be less than max-lease-time +     </sch:assert> +    </sch:rule> +    <sch:rule context="/nc:rpc-reply/nc:data/dhcp:dhcp/ +                       dhcp:shared-networks/dhcp:shared-network"> +     <sch:report test="preceding-sibling::dhcp:shared-network +                       [dhcp:name=current()/dhcp:name]"> +      Duplicate key "dhcp:name" +     </sch:report> +    </sch:rule> +    <sch:rule context="/nc:rpc-reply/nc:data/dhcp:dhcp/ +                       dhcp:status/dhcp:leases"> +     <sch:report test="preceding-sibling::dhcp:leases +                       [dhcp:address=current()/dhcp:address]"> +      Duplicate key "dhcp:address" + + + +Lhotka                       Standards Track                   [Page 98] + +RFC 6110                  Mapping YANG to DSDL             February 2011 + + +     </sch:report> +    </sch:rule> +   </sch:pattern> +   <sch:pattern id="id2768196" is-a="_dhcp__subnet-list"> +    <sch:param name="start" value="/nc:rpc-reply/nc:data/dhcp:dhcp"/> +    <sch:param name="pref" value="dhcp"/> +   </sch:pattern> +   <sch:pattern id="id2768215" is-a="_dhcp__subnet-list"> +    <sch:param name="start" +               value="/nc:rpc-reply/nc:data/dhcp:dhcp/ +                      dhcp:shared-networks/dhcp:shared-network"/> +    <sch:param name="pref" value="dhcp"/> +   </sch:pattern> +  </sch:schema> + +C.3.4.  DSRL Schema for <nc:get> Reply + +   <?xml version="1.0" encoding="utf-8"?> +   <dsrl:maps +       xmlns:dsrl="http://purl.oclc.org/dsdl/dsrl" +       xmlns:dhcp="http://example.com/ns/dhcp" +       xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0"> +    <dsrl:element-map> +     <dsrl:parent>/nc:rpc-reply/nc:data</dsrl:parent> +     <dsrl:name>dhcp:dhcp</dsrl:name> +     <dsrl:default-content> +      <dhcp:max-lease-time>7200</dhcp:max-lease-time> +      <dhcp:default-lease-time>600</dhcp:default-lease-time> +     </dsrl:default-content> +    </dsrl:element-map> +    <dsrl:element-map> +     <dsrl:parent>/nc:rpc-reply/nc:data/dhcp:dhcp</dsrl:parent> +     <dsrl:name>dhcp:max-lease-time</dsrl:name> +     <dsrl:default-content>7200</dsrl:default-content> +    </dsrl:element-map> +    <dsrl:element-map> +     <dsrl:parent>/nc:rpc-reply/nc:data/dhcp:dhcp</dsrl:parent> +     <dsrl:name>dhcp:default-lease-time</dsrl:name> +     <dsrl:default-content>600</dsrl:default-content> +    </dsrl:element-map> +    <dsrl:element-map> +     <dsrl:parent> +      /nc:rpc-reply/nc:data/dhcp:dhcp/dhcp:subnet +     </dsrl:parent> +     <dsrl:name>dhcp:max-lease-time</dsrl:name> +     <dsrl:default-content>7200</dsrl:default-content> +    </dsrl:element-map> +    <dsrl:element-map> + + + +Lhotka                       Standards Track                   [Page 99] + +RFC 6110                  Mapping YANG to DSDL             February 2011 + + +     <dsrl:parent> +      /nc:rpc-reply/nc:data/dhcp:dhcp/dhcp:shared-networks/ +      dhcp:shared-network/dhcp:subnet +     </dsrl:parent> +     <dsrl:name>dhcp:max-lease-time</dsrl:name> +     <dsrl:default-content>7200</dsrl:default-content> +    </dsrl:element-map> +   </dsrl:maps> + +Author's Address + +   Ladislav Lhotka (editor) +   CESNET + +   EMail: lhotka@cesnet.cz + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Lhotka                       Standards Track                  [Page 100] + |