<?xml version="1.0"?>
<?rfc strict="yes"?>
<?rfc toc="yes"?>
<?rfc tocdepth="3"?>
<?rfc symrefs="yes"?>
<?rfc sortrefs="yes"?>
<?rfc compact="yes"?>
<?rfc subcompact="no"?> version="1.0" encoding="UTF-8"?>
<!DOCTYPE rfc SYSTEM "rfc2629-xhtml.ent">

<rfc docName="draft-ietf-dnsop-iana-class-type-yang-05" number="9108" ipr="trust200902" category="std" xmlns:xi="http://www.w3.org/2001/XInclude" submissionType="IETF" version="3" consensus="true"> category="std" consensus="true" tocInclude="true" tocDepth="3" symRefs="true" sortRefs="true" updates="" obsoletes="" xml:lang="en" version="3">

  <front>
    <title abbrev="iana-dns-class-rr-type-yang">YANG abbrev="YANG Types for DNS and RR">YANG Types for DNS
    Classes and Resource Record Types</title>
    <seriesInfo name="Internet-Draft" status="standard" value="draft-ietf-dnsop-iana-class-type-yang-03"/> name="RFC" value="9108"/>
    <author fullname="Ladislav Lhotka" initials="L." surname="Lhotka">
      <organization>CZ.NIC</organization>
      <address>
	<postal>
	  <country>Czech Republic</country>
	</postal>
        <email>ladislav.lhotka@nic.cz</email>
      </address>
    </author>
    <author fullname="Petr Spacek" Špaček" initials="P." surname="Spacek"> surname="Špaček">
      <organization>Internet Systems Consortium</organization>
      <address>
	<postal>
	  <country>Czech Republic</country>
	</postal>
        <email>pspacek@isc.org</email>
      </address>
    </author>
    <date day="17" month="June" month="September" year="2021"/>

<area>Operations and Management</area>
<workgroup>DNSOP Working Group</workgroup>

<keyword>IANA registry</keyword>
<keyword>DNA Parameters</keyword>

    <abstract>
      <t>This document introduces the YANG
      module "iana-dns-class-rr-type" that "iana-dns-class-rr-type", which contains derived types
      reflecting two IANA registries: DNS CLASSes and Resource Record
      (RR) TYPEs. These YANG types are intended as a the minimum basis for
      future data modeling work.</t>
    </abstract>
  </front>

  <middle>
    <section anchor="introduction" title="Introduction">
      <t>YANG <xref target="RFC7950"/> has become a de facto standard
      as a language for modeling configuration and state data, as well
      as specifying management operations and asynchronous
      notifications. It is reasonable to expect that the approach
      based on utilizing such data models along with standard
      management protocols such as NETCONF&#xA0;<xref target="RFC6241"/>
      and RESTCONF&#xA0;<xref target="RFC8040"/> can be effectively used in
      DNS operations, too. In fact, several efforts are currently
      underway that attempt to use NETCONF or RESTCONF for configuring
      and managing</t>
      <ul>
        <li>authoritative servers</li>
        <li>resolvers</li> servers,</li>
        <li>resolvers, and</li>
        <li>zone data.</li>
      </ul>
      <t>While it is possible to use the management protocols
      mentioned above with ad hoc or proprietary data models, their
      real potential can be realized only if there is a (completely or
      partly) unified data model supported by multiple DNS software
      implementations. Operators can then, for instance, run several
      DNS server implementations in parallel, and use a common
      configuration and management interface and data for all of
      them. Also, it becomes considerably easier to migrate to another
      implementation.</t>
      <t>Based on the previous experience from the IETF Routing Area,
      it is to be expected that the development of unified data models
      for DNS will be a lengthy and complicated process that will
      require active cooperation and compromises compromise from the vendors and
      developers of major DNS server platforms. Nevertheless, it is
      likely that any DNS-related data modeling effort will need to
      use various DNS parameters and enumerations that are specified
      in several IANA registries. For use with YANG, these parameters
      and enumerations have to be translated into corresponding YANG
      types or other structures. Such translations should be
      straightforward and relatively uncontroversial.</t>
      <t>This document provides a translation of two fundamental
      DNS-related IANA registries to YANG. It contains the initial
      revision
      version of the YANG module "iana-dns-class-rr-type" that "iana-dns-class-rr-type", which
      defines derived types for the common parameters of DNS resource
      records (RR): class and type. These YANG types, "dns-class" and
      "rr-type", reflect the IANA registries "DNS CLASSes" and
      "Resource Record (RR) TYPEs" <xref target="IANA-DNS-PARAMETERS"/>.</t>
      <t><xref target="app.xslt"/> contains an XSLT 1.0 stylesheet
      that is intended to be used by IANA for generating the initial
      revision
      version of the "iana-dns-class-rr-type" YANG
      module. Subsequently, whenever a new class or RR type is added
      to the above registries, IANA will also update the
      "iana-dns-class-rr-type" YANG module, following the instructions
      in <xref target="iana"/> below.</t>
    </section>

    <section anchor="terminology" title="Terminology">

<t>The
        <t>
    The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL
NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED",
"MAY", "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
    NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
    "<bcp14>MAY</bcp14>", and "OPTIONAL" "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
    described in BCP&#xA0;14 BCP&nbsp;14 <xref target="RFC2119"/> <xref target="RFC8174"/>
    when, and only when, they appear in all capitals, as shown here.</t> here.
        </t>

      <t>The terminology for describing YANG data models can be found
      in <xref target="RFC7950"/>. DNS terminology used in this
      document can be found in <xref target="RFC1035"/> and <xref target="RFC8499"/>.</t>

    </section>

    <section anchor="design" title="YANG Design Considerations">

      <t>At the time of writing, the IANA document "Domain Name System
      (DNS) Parameters" <xref target="IANA-DNS-PARAMETERS"/> contains
      altogether thirteen registries. The YANG module
      "iana-dns-class-rr-type" defines derived types corresponding to
      only two of the registries that are essential for data models
      involving zone data, namely "DNS CLASSes" and "Resource Record
      (RR) TYPEs". It is expected that the remaining registries in
      <xref target="IANA-DNS-PARAMETERS"/>, as well as other
      DNS-related IANA registries, will be analogously reflected in
      future YANG modules as necessary. This way, an appropriate
      combination of YANG modules can be chosen depending on which
      YANG types are needed for a given data modeling purpose.</t>
      <t>The registries "DNS CLASSes" and "Resource Record (RR) TYPEs"
      are transformed into YANG enumeration types "dns-class-name" and
      "rr-type-name", respectively. This is the initial fragment of
      the former:</t>

      <sourcecode type="yang">
  typedef dns-class-name {
    type enumeration {
      enum IN {
        value 1;
        description
          "Internet (IN)";
        reference
          "RFC 1035";
      }
      ...
    }
    ...
  }
      </sourcecode>
      <t>The other derived type, "rr-type-name", is defined
      similarly.</t>

      <t><xref target="RFC3597"/> introduced the option of specifying
      a class or RR type via its assigned decimal number, number as an
      alternative to the mnemonic name. For example, the "IN" class
      can be equivalently written as "CLASS1", and "AAAA" type can be
      written as "TYPE28".</t>
      <t>Accordingly, the derived types "dns-class" and "rr-type" are
      defined in the YANG module as a union of two member types:</t>
      <ul>
        <li>16-bit decimal integer ("uint16")</li>
        <li>mnemonic name belonging to the enumerations
        "dns-class-name" and "rr-type-name", respectively.</li>
      </ul>
      <t>For instance, the "rr-type" type is defined as follows:</t>
      <sourcecode type="yang">
  typedef rr-type {
    type union {
      type uint16;
      type rr-type-name;
    }
    description
      "This type allows for referring reference to a DNS resource record type
       using either the assigned mnemonic name or numeric value.";
  }
      </sourcecode>
      <t>As unassigned and reserved class and RR type values are not
      included in the mnemonic name enumerations, they can only be specified
      using their decimal values.</t>

    </section>

    <section anchor="iana" title="IANA Considerations">

<t>RFC Editor: In this section, replace all occurrences of "XXXX"
with the actual RFC number (and remove this note).</t>

      <t>This section deals with actions and processes necessary for
      IANA to undertake to maintain the "iana-dns-class-rr-type" YANG
      module. This YANG module is intended to reflect the "DNS
      CLASSes" and "Resource Record (RR) TYPEs" registries in <xref target="IANA-DNS-PARAMETERS"/>. The most recent revision version of the
      YANG module is available from the "YANG Parameters" registry <xref target="IANA-YANG-PARAMETERS"/>.</t>

      <t>Upon

      <t>With the publication of this document, IANA has created and posted the initial revision version
of the "iana-dns-class-rr-type" YANG module SHALL be created by applying the XSLT stylesheet from
<xref target="app.xslt"/> to the XML version of <xref target="IANA-DNS-PARAMETERS"/>.</t>

      <t>IANA SHALL add has added this note to the "iana-dns-class-rr-type" item
      of the "YANG Module Names" registry <xref target="IANA-YANG-PARAMETERS"/>:</t>

      <blockquote>
        Classes and types of DNS resource records must not be directly
        added to the "iana-dns-class-rr-type" YANG module. They must
        instead be added to the "DNS CLASSes" and "Resource Record
        (RR) TYPEs" registries, respectively.
      </blockquote>

      <t>When a new DNS class or RR type is added to the "DNS CLASSes"
      or "Resource Record (RR) TYPEs" registry, a new "enum" statement
      SHALL
      <bcp14>SHALL</bcp14> be added to the "dns-class-name" or "rr-type-name" type,
      respectively. The assigned name defined by the "enum" statement
      SHALL
      <bcp14>SHALL</bcp14> be the same as the mnemonic name of the new class or
      type. The following substatements to the "enum" statement SHALL <bcp14>SHALL</bcp14>
      be defined:</t>

      <dl>

      <dl indent="16">
        <dt>"value":</dt>
	<dd>Use the decimal value from the registry.</dd>
        <dt>"status":</dt>
	<dd>Include only if a class or type registration has been
	deprecated or obsoleted. IANA "deprecated" maps to YANG status
	"deprecated", and IANA "obsolete" maps to YANG status "obsolete".</dd>
        <dt>"description":</dt>
	<dd>Replicate the corresponding information from the registry,
	namely the full name of the new DNS class, or the meaning of
	the new RR type, if any.</dd>
        <dt>"reference":</dt>
	<dd>Replicate the reference(s) from the registry.</dd>
      </dl>
      <t>Unassigned or reserved values SHALL NOT <bcp14>SHALL NOT</bcp14> be included in the
      "dns-class-name" and "rr-type-name" enumeration types.</t>
      <t>Each time the "iana-dns-class-rr-type" YANG module is updated, a new
      "revision" statement SHALL <bcp14>SHALL</bcp14> be added before the existing
      "revision" statements.</t>

      <t>IANA SHALL add has added this new note to the "DNS CLASSes" and
      "Resource Record (RR) TYPEs" registries:</t>
      <blockquote>
	When this registry is modified, the YANG module
	"iana-dns-class-rr-type" must be updated as defined in RFC
	XXXX. [RFC9108].
      </blockquote>

      <t>The "Reference" text in the "DNS CLASSes" registry SHALL be has been
      updated as follows:</t>

<t>
OLD:</t>
      <blockquote>
        <artwork>
OLD:
  [RFC6895]

NEW:
  [RFC6895][RFCXXXX]
        </artwork>     </blockquote>
<t>
NEW:</t>
    <blockquote>
  [RFC6895][RFC9108]
  </blockquote>

      <t>The "Reference" text in the "Resource Record (RR) TYPEs"
      registry SHALL be has been updated as follows:</t>
<t>
OLD:</t>
      <blockquote>
        <artwork>
OLD:
  [RFC6895][RFC1035]

NEW:
  [RFC6895][RFC1035][RFCXXXX]
        </artwork> </blockquote>
<t>
NEW:</t>
<blockquote>
  [RFC6895][RFC1035][RFC9108]
      </blockquote>

      <section title="URI Registrations">

        <t>This document registers a URI in the "IETF XML Registry"
        <xref target="RFC3688"/>. The following registration has been
        made:</t>
        <blockquote>
          <artwork>
URI: urn:ietf:params:xml:ns:yang:iana-dns-class-rr-type
Registrant Contact: The IESG.
XML: N/A,
<dl spacing="compact">
<dt>URI:</dt><dd>urn:ietf:params:xml:ns:yang:iana-dns-class-rr-type</dd>
<dt>Registrant Contact:</dt><dd>The IESG.</dd>
<dt>XML:</dt><dd>N/A, the requested URI is an XML namespace.
          </artwork>
	</blockquote> namespace.</dd>
</dl>
      </section>

      <section title="YANG Module Registrations">
        <t>This document registers a YANG module in the "YANG Module
        Names" registry <xref target="RFC6020"/>. The following
        registration has been made:</t>
        <blockquote>
          <artwork>
name:      iana-dns-class-rr-type
namespace: urn:ietf:params:xml:ns:yang:iana-dns-class-rr-type
prefix:    dnsct
reference: RFC XXXX
          </artwork>
	</blockquote>
<dl spacing="compact">
<dt>Name:</dt><dd>iana-dns-class-rr-type</dd>
<dt>Namespace:</dt><dd>urn:ietf:params:xml:ns:yang:iana-dns-class-rr-type</dd>
<dt>Prefix:</dt><dd>dnsct</dd>
<dt>Reference:</dt><dd>RFC 9108</dd>
</dl>
      </section>

    </section>

    <section anchor="security" title="Security Considerations">

      <t>This document translates two IANA registries into YANG data
      types and otherwise introduces no technology or
      protocol. The definitions themselves have no security impact on
      the Internet, but their use in concrete YANG modules might
      have. The security considerations spelled out in the YANG
      specification&#xA0;<xref target="RFC7950"/> apply for to this document
      as well.</t>

    </section>

  </middle>

  <back>
<references>
<name>References</name>
    <references title="Normative References">
      <reference anchor="IANA-DNS-PARAMETERS" target="https://www.iana.org/assignments/dns-parameters">
        <front>
          <title>Domain Name System (DNS) Parameters</title>
          <author>
            <organization>Internet Assigned Numbers Authority</organization>
            <organization>IANA</organization>
          </author>
        </front>
      </reference>
      <reference anchor="IANA-YANG-PARAMETERS" target="https://www.iana.org/assignments/yang-parameters">
        <front>
          <title>YANG Parameters</title>
          <author>
            <organization>Internet Assigned Numbers Authority</organization>
            <organization>IANA</organization>
          </author>
        </front>
      </reference>

<reference anchor="RFC2119" target="https://www.rfc-editor.org/info/rfc2119">
<front>
<title>Key words for use in RFCs to Indicate Requirement Levels</title>
<author initials="S." surname="Bradner" fullname="S. Bradner"><organization/></author>
<date year="1997" month="March"/>
<abstract><t>In many standards track documents several words are used to signify the requirements in the specification.  These words are often capitalized. This document defines these words as they should be interpreted in IETF documents.  This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t></abstract>
</front>
<seriesInfo name="BCP" value="14"/>
<seriesInfo name="RFC" value="2119"/>
<seriesInfo name="DOI" value="10.17487/RFC2119"/>
</reference>

<reference anchor="RFC3688" target="https://www.rfc-editor.org/info/rfc3688">
<front>
<title>The IETF XML Registry</title>
<author initials="M." surname="Mealling" fullname="M. Mealling"><organization/></author>
<date year="2004" month="January"/>
<abstract><t>This document describes an IANA maintained registry for IETF standards which use Extensible Markup Language (XML) related items such as Namespaces, Document Type Declarations (DTDs), Schemas, and Resource Description Framework (RDF) Schemas.</t></abstract>
</front>
<seriesInfo name="BCP" value="81"/>
<seriesInfo name="RFC" value="3688"/>
<seriesInfo name="DOI" value="10.17487/RFC3688"/>
</reference>

<reference anchor="RFC6020" target="https://www.rfc-editor.org/info/rfc6020">
<front>
<title>YANG - A Data Modeling Language for the Network Configuration Protocol (NETCONF)</title>
<author initials="M." surname="Bjorklund" fullname="M. Bjorklund" role="editor"><organization/></author>
<date year="2010" month="October"/>
<abstract><t>YANG is a data modeling language used to model configuration and state data manipulated by the Network Configuration Protocol (NETCONF), NETCONF remote procedure calls, and NETCONF notifications. [STANDARDS-TRACK]</t></abstract>
</front>
<seriesInfo name="RFC" value="6020"/>
<seriesInfo name="DOI" value="10.17487/RFC6020"/>
</reference>

<reference anchor="RFC7950" target="https://www.rfc-editor.org/info/rfc7950">
<front>
<title>The YANG 1.1 Data Modeling Language</title>
<author initials="M." surname="Bjorklund" fullname="M. Bjorklund" role="editor"><organization/></author>
<date year="2016" month="August"/>
<abstract><t>YANG is a data modeling language used to model configuration data, state data, Remote Procedure Calls, and notifications for network management protocols.  This document describes the syntax and semantics of version 1.1 of the YANG language.  YANG version 1.1 is a maintenance release of the YANG language, addressing ambiguities and defects in the original specification.  There are a small number of backward incompatibilities from YANG version 1.  This document also specifies the YANG mappings to the Network Configuration Protocol (NETCONF).</t></abstract>
</front>
<seriesInfo name="RFC" value="7950"/>
<seriesInfo name="DOI" value="10.17487/RFC7950"/>
</reference>

<reference anchor="RFC8174" target="https://www.rfc-editor.org/info/rfc8174">
<front>
<title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
<author initials="B." surname="Leiba" fullname="B. Leiba"><organization/></author>
<date year="2017" month="May"/>
<abstract><t>RFC 2119 specifies common key words that may be used in protocol  specifications.  This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the  defined special meanings.</t></abstract>
</front>
<seriesInfo name="BCP" value="14"/>
<seriesInfo name="RFC" value="8174"/>
<seriesInfo name="DOI" value="10.17487/RFC8174"/>
</reference>

<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml"/>
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.3688.xml"/>
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.6020.xml"/>
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.7950.xml"/>
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8174.xml"/>

<reference anchor="W3C.REC-xslt-19991116" target="https://www.w3.org/TR/1999/REC-xslt-19991116">
<front>
<title>XSL Transformations (XSLT) Version 1.0</title>
<author initials="J." surname="Clark" fullname="James Clark">
    <organization/>
</author>
<date month="November" day="16" year="1999"/>
</front>
<seriesInfo name="World Wide Web Consortium name="W3C Recommendation" value="REC-xslt-19991116"/>
<format type="HTML" target="https://www.w3.org/TR/1999/REC-xslt-19991116"/>
</reference>

    </references>

    <references title="Informative References">

<reference anchor="RFC1035" target="https://www.rfc-editor.org/info/rfc1035">
<front>
<title>Domain names - implementation and specification</title>
<author initials="P.V." surname="Mockapetris" fullname="P.V. Mockapetris"><organization/></author>
<date year="1987" month="November"/>
<abstract><t>This RFC is the revised specification of the protocol and format used in the implementation of the Domain Name System.  It obsoletes RFC-883. This memo documents the details of the domain name client - server communication.</t></abstract>
</front>
<seriesInfo name="STD" value="13"/>
<seriesInfo name="RFC" value="1035"/>
<seriesInfo name="DOI" value="10.17487/RFC1035"/>
</reference>

<reference anchor="RFC3597" target="https://www.rfc-editor.org/info/rfc3597">
<front>
<title>Handling of Unknown DNS Resource Record (RR) Types</title>
<author initials="A." surname="Gustafsson" fullname="A. Gustafsson"><organization/></author>
<date year="2003" month="September"/>
<abstract><t>Extending the Domain Name System (DNS) with new Resource Record (RR) types currently requires changes to name server software.  This document specifies the changes necessary to allow future DNS implementations to handle new RR types transparently.  [STANDARDS-TRACK]</t></abstract>
</front>
<seriesInfo name="RFC" value="3597"/>
<seriesInfo name="DOI" value="10.17487/RFC3597"/>
</reference>

<reference anchor="RFC6241" target="https://www.rfc-editor.org/info/rfc6241">
<front>
<title>Network Configuration Protocol (NETCONF)</title>
<author initials="R." surname="Enns" fullname="R. Enns" role="editor"><organization/></author>
<author initials="M." surname="Bjorklund" fullname="M. Bjorklund" role="editor"><organization/></author>
<author initials="J." surname="Schoenwaelder" fullname="J. Schoenwaelder" role="editor"><organization/></author>
<author initials="A." surname="Bierman" fullname="A. Bierman" role="editor"><organization/></author>
<date year="2011" month="June"/>
<abstract><t>The Network Configuration Protocol (NETCONF) defined in this document provides mechanisms to install, manipulate, and delete the configuration of network devices.  It uses an Extensible Markup Language (XML)-based data encoding for the configuration data as well as the protocol messages.  The NETCONF protocol operations are realized as remote procedure calls (RPCs).  This document obsoletes RFC 4741.  [STANDARDS-TRACK]</t></abstract>
</front>
<seriesInfo name="RFC" value="6241"/>
<seriesInfo name="DOI" value="10.17487/RFC6241"/>
</reference>

<reference anchor="RFC8040" target="https://www.rfc-editor.org/info/rfc8040">
<front>
<title>RESTCONF Protocol</title>
<author initials="A." surname="Bierman" fullname="A. Bierman"><organization/></author>
<author initials="M." surname="Bjorklund" fullname="M. Bjorklund"><organization/></author>
<author initials="K." surname="Watsen" fullname="K. Watsen"><organization/></author>
<date year="2017" month="January"/>
<abstract><t>This document describes an HTTP-based protocol that provides a programmatic interface for accessing data defined in YANG, using the datastore concepts defined in the Network Configuration Protocol (NETCONF).</t></abstract>
</front>
<seriesInfo name="RFC" value="8040"/>
<seriesInfo name="DOI" value="10.17487/RFC8040"/>
</reference>

<reference anchor="RFC8499" target="https://www.rfc-editor.org/info/rfc8499">
<front>
<title>DNS Terminology</title>
<author initials="P." surname="Hoffman" fullname="P. Hoffman"><organization/></author>
<author initials="A." surname="Sullivan" fullname="A. Sullivan"><organization/></author>
<author initials="K." surname="Fujiwara" fullname="K. Fujiwara"><organization/></author>
<date year="2019" month="January"/>
<abstract><t>The Domain Name System (DNS) is defined in literally dozens of different RFCs.  The terminology used by implementers and developers of DNS protocols, and by operators of DNS systems, has sometimes changed in the decades since the DNS was first defined.  This document gives current definitions for many of the terms used in the DNS in a single document.</t><t>This document obsoletes RFC 7719 and updates RFC 2308.</t></abstract>
</front>
<seriesInfo name="BCP" value="219"/>
<seriesInfo name="RFC" value="8499"/>
<seriesInfo name="DOI" value="10.17487/RFC8499"/>
</reference>

<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.1035.xml"/>
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.3597.xml"/>
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.6241.xml"/>
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8040.xml"/>
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8499.xml"/>

    </references>
</references>
    <section anchor="app.xslt" title="XSLT Stylesheet">

<t>RFC Editor: In this section, replace all occurrences of "XXXX"
with the actual RFC number (and remove this note).</t>

      <t>This appendix contains an XSLT 1.0 stylesheet <xref target="W3C.REC-xslt-19991116"/> that is intended to be used for
      generating to
      generate the initial revision of the "iana-dns-class-rr-type"
      YANG module. This is achieved by applying the stylesheet to the
      XML version of the IANA registry "Domain Name System (DNS)
      Parameters" <xref target="IANA-DNS-PARAMETERS"/> that was
      current at the time when this document was published.</t>

      <t>Using the ubiquitous xsltproc tool, the YANG module text can
      be generated with this command:</t>
      <sourcecode type="bash">
    $ xsltproc iana-dns-class-rr-type.xsl dns-parameters.xml
      </sourcecode>

      <sourcecode markers="true" name="iana-dns-class-rr-type.xsl" type="xml">
&lt;?xml type="xml"><![CDATA[
<?xml version="1.0" standalone="yes"?&gt;
&lt;stylesheet standalone="yes"?>
<stylesheet xmlns="http://www.w3.org/1999/XSL/Transform"
            xmlns:iana="http://www.iana.org/assignments"
            version="1.0"&gt;
  &lt;output method="text"/&gt;
  &lt;strip-space elements="*"/&gt;

  &lt;variable name="dq"&gt;"&lt;/variable&gt;
  &lt;variable name="sq"&gt;'&lt;/variable&gt;

  &lt;variable name="module-intro"&gt;
    &lt;text&gt;module
            version="1.0">
  <output method="text"/>
  <strip-space elements="*"/>

  <variable name="dq">"</variable>
  <variable name="sq">'</variable>

  <variable name="module-intro">
    <text>module iana-dns-class-rr-type {
  yang-version 1.1;
  namespace
    "urn:ietf:params:xml:ns:yang:iana-dns-class-rr-type";
  prefix dnsct;

  organization
    "Internet Assigned Numbers Authority (IANA)";

  contact
    "        Internet Assigned Numbers Authority

     Postal: ICANN
             4676 Admiralty Way,
             12025 Waterfront Drive, Suite 330
             Marina del Rey, 300
             Los Angeles, CA 90292 90094

     Tel:    +1 310 823 9358

     &amp;lt;mailto:iana@iana.org&amp;gt;"; 424 254 5300

     &lt;mailto:iana@iana.org&gt;";

  description
    "This YANG module translates IANA registries 'DNS CLASSes' and
     'Resource Record (RR) TYPEs' to YANG derived YANG-derived types.

     Copyright (c) 2020 2021 IETF Trust and the persons identified as
     authors of the code.  All rights reserved.

     Redistribution and use in source and binary forms, with or
     without modification, is permitted pursuant to, and subject to
     the license terms contained in, the Simplified BSD License set
     forth in Section 4.c of the IETF Trust's Legal Provisions
     Relating to IETF Documents
     (https://trustee.ietf.org/license-info).

     This initial version of this YANG module was generated from
     the corresponding IANA registries using an XSLT stylesheet
     from Appendix A of RFC XXXX
     (https://www.rfc-editor.org/info/rfcXXXX); 9108
     (https://www.rfc-editor.org/info/rfc9108); see the RFC itself
     for full legal notices.";

  reference
    "IANA 'Domain Name System (DNS) Parameters' registry
     https://www.iana.org/assignments/dns-parameters";&lt;/text&gt;
     &lt;text&gt;&amp;#xA;&amp;#xA;&lt;/text&gt;
  &lt;/variable&gt;

  &lt;template name="enum"&gt;
    &lt;param name="id"/&gt;
    &lt;value-of
     https://www.iana.org/assignments/dns-parameters";</text>
     <text>&#xA;&#xA;</text>
  </variable>

  <template name="enum">
    <param name="id"/>
    <value-of select="concat('      enum ', $id)"/&gt;
    &lt;text&gt; {&amp;#xA; $id)"/>
    <text> {&#xA;        value &lt;/text&gt;
    &lt;value-of </text>
    <value-of select="concat(iana:value, ';&amp;#xA;')"/&gt;
    &lt;if ';&#xA;')"/>
    <if test="contains(iana:description, 'OBSOLETE')"&gt;
      &lt;text&gt; 'OBSOLETE')">
      <text>        status obsolete;&amp;#xA;&lt;/text&gt;
    &lt;/if&gt;
    &lt;apply-templates select="iana:description"/&gt;
    &lt;variable obsolete;&#xA;</text>
    </if>
    <apply-templates select="iana:description"/>
    <variable name="xrefs" select="iana:xref[@type!='note']"/&gt;
    &lt;if test="$xrefs"&gt;
      &lt;text&gt;        reference&amp;#xA;          "&lt;/text&gt;
      &lt;if test="count($xrefs)&amp;gt;1"&gt;- &lt;/if&gt;
      &lt;apply-templates select="iana:xref[@type!='note']"/&gt;
    &lt;/if&gt;
    &lt;text&gt;      }&amp;#xA;&lt;/text&gt;
  &lt;/template&gt;

  &lt;template match="/"&gt;
    &lt;value-of select="$module-intro"/&gt;
    &lt;apply-templates select="iana:registry[@id='dns-parameters']"/&gt;
    &lt;text&gt;}&amp;#xA;&lt;/text&gt;
  &lt;/template&gt;

  &lt;template match="iana:registry[@id='dns-parameters']"&gt;
    &lt;apply-templates select="iana:updated"/&gt;
    &lt;apply-templates
        select="iana:registry[@id='dns-parameters-2']"/&gt;
    &lt;apply-templates
        select="iana:registry[@id='dns-parameters-4']"/&gt;
  &lt;/template&gt;

  &lt;template match="iana:updated"&gt;
    &lt;value-of select="iana:xref[@type!='note']"/>
    <if test="$xrefs">
      <text>        reference&#xA;          "</text>
      <if test="count($xrefs)&gt;1">- </if>
      <apply-templates select="iana:xref[@type!='note']"/>
    </if>
    <text>      }&#xA;</text>
  </template>

  <template match="/">
    <value-of select="$module-intro"/>
    <apply-templates select="iana:registry[@id='dns-parameters']"/>
    <text>}&#xA;</text>
  </template>

  <template match="iana:registry[@id='dns-parameters']">
    <apply-templates select="iana:updated"/>
    <apply-templates
        select="iana:registry[@id='dns-parameters-2']"/>
    <apply-templates
        select="iana:registry[@id='dns-parameters-4']"/>
  </template>

  <template match="iana:updated">
    <value-of select="concat('  revision ', ., ' {')"/&gt;
    &lt;text&gt; {')"/>
    <text>
    description
      "Initial revision.";
    reference
      "RFC XXXX: 9108: YANG Types for DNS Classes and Resource Record
       Types";
  }

  /* Typedefs */&amp;#xA;&amp;#xA;&lt;/text&gt;
  &lt;/template&gt;

  &lt;template match="iana:registry[@id='dns-parameters-2']"&gt;
    &lt;text&gt; */&#xA;&#xA;</text>
  </template>

  <template match="iana:registry[@id='dns-parameters-2']">
    <text>  typedef dns-class-name {&amp;#xA;&lt;/text&gt;
    &lt;text&gt; {&#xA;</text>
    <text>    type enumeration {&amp;#xA;&lt;/text&gt;
    &lt;apply-templates {&#xA;</text>
    <apply-templates
        select="iana:record[not(iana:description='Unassigned' or
                starts-with(iana:description,'Reserved'))]"
        mode="class"/&gt;
    &lt;text&gt;
        mode="class"/>
    <text>    }
    description
      "This enumeration type defines mnemonic names and corresponding
       numeric values of DNS classes.";
    reference
      "RFC 6895: Domain Name System (DNS) IANA Considerations";
  }

  typedef dns-class {
    type union {
      type uint16;
      type dns-class-name;
    }
    description
      "This type allows for referring reference to a DNS class using either the
       assigned mnemonic name or numeric value.";
  }&amp;#xA;&amp;#xA;&lt;/text&gt;
  &lt;/template&gt;

  &lt;template match="iana:registry[@id='dns-parameters-4']"&gt;
    &lt;text&gt;
  }&#xA;&#xA;</text>
  </template>

  <template match="iana:registry[@id='dns-parameters-4']">
    <text>  typedef rr-type-name {&amp;#xA;&lt;/text&gt;
    &lt;text&gt; {&#xA;</text>
    <text>    type enumeration {&amp;#xA;&lt;/text&gt;
    &lt;apply-templates {&#xA;</text>
    <apply-templates
        select="iana:record[iana:type!='Unassigned' and
                iana:type!='Private use' and iana:type!='Reserved']"
        mode="rr-type"/&gt;
    &lt;text&gt;
        mode="rr-type"/>
    <text>    }
    description
      "This enumeration type defines mnemonic names and corresponding
       numeric values of DNS resource record types.";
    reference
      "- RFC 6895: Domain Name System (DNS) IANA Considerations

       - RFC 1035: Domain Names names - Implementation implementation and Specification"; specification";
  }

  typedef rr-type {
    type union {
      type uint16;
      type rr-type-name;
    }
    description
      "This type allows for referring reference to a DNS resource record type
       using either the assigned mnemonic name or numeric value.";
  }&amp;#xA;&lt;/text&gt;
  &lt;/template&gt;

  &lt;template
  }&#xA;</text>
  </template>

  <template match="iana:record" mode="class"&gt;
    &lt;call-template name="enum"&gt;
      &lt;with-param name="id"&gt;
        &lt;choose&gt;
          &lt;when test="contains(iana:description,'(')"&gt;
            &lt;value-of mode="class">
    <call-template name="enum">
      <with-param name="id">
        <choose>
          <when test="contains(iana:description,'(')">
            <value-of select="substring-before(substring-after(
                              iana:description, '('), ')')"/&gt;
          &lt;/when&gt;
          &lt;otherwise&gt;
            &lt;value-of ')')"/>
          </when>
          <otherwise>
            <value-of
                select="substring-after(iana:description, ' ')"/&gt;
          &lt;/otherwise&gt;
        &lt;/choose&gt;
      &lt;/with-param&gt;
    &lt;/call-template&gt;
  &lt;/template&gt;

  &lt;template ')"/>
          </otherwise>
        </choose>
      </with-param>
    </call-template>
  </template>

  <template match="iana:record" mode="rr-type"&gt;
    &lt;call-template name="enum"&gt;
      &lt;with-param mode="rr-type">
    <call-template name="enum">
      <with-param name="id" select="iana:type"/&gt;
    &lt;/call-template&gt;
  &lt;/template&gt;

  &lt;template match="iana:description"&gt;
    &lt;text&gt;        description&amp;#xA;          &lt;/text&gt;
    &lt;value-of select="iana:type"/>
    </call-template>
  </template>

  <template match="iana:description">
    <text>        description&#xA;          </text>
    <value-of select="concat($dq, ., $dq, ';&amp;#xA;')"/&gt;
  &lt;/template&gt;

  &lt;template match="iana:xref"&gt;
    &lt;choose&gt;
      &lt;when test="@type='rfc'"&gt;
        &lt;value-of ';&#xA;')"/>
  </template>

  <template match="iana:xref">
    <choose>
      <when test="@type='rfc'">
        <value-of
            select="concat('RFC ', substring-after(@data, 'rfc'))"/&gt;
      &lt;/when&gt;
      &lt;when test="@type='person'"&gt;
        &lt;apply-templates 'rfc'))"/>
      </when>
      <when test="@type='person'">
        <apply-templates
            select="/iana:registry/iana:people/iana:person[
                    @id=current()/@data]"/&gt;
      &lt;/when&gt;
      &lt;when test="@type='text'"&gt;
        &lt;value-of
                    @id=current()/@data]"/>
      </when>
      <when test="@type='text'">
        <value-of select="translate(., $dq, $sq)"/&gt;
      &lt;/when&gt;
      &lt;otherwise&gt;
        &lt;value-of select="@data"/&gt;
      &lt;/otherwise&gt;
    &lt;/choose&gt;
    &lt;choose&gt;
      &lt;when test="position()=last()"&gt;
        &lt;text&gt;";&amp;#xA;&lt;/text&gt;
      &lt;/when&gt;
      &lt;otherwise&gt;
        &lt;text&gt;&amp;#xA; $sq)"/>
      </when>
      <otherwise>
        <value-of select="@data"/>
      </otherwise>
    </choose>
    <choose>
      <when test="position()=last()">
        <text>";&#xA;</text>
      </when>
      <otherwise>
        <text>&#xA;           - &lt;/text&gt;
      &lt;/otherwise&gt;
    &lt;/choose&gt;
  &lt;/template&gt;

  &lt;template match="iana:person"&gt;
    &lt;value-of </text>
      </otherwise>
    </choose>
  </template>

  <template match="iana:person">
    <value-of select="concat(iana:name, ' &amp;lt;', &lt;', iana:uri, '&amp;gt;')"/&gt;
  &lt;/template&gt;

&lt;/stylesheet&gt;

</sourcecode> '&gt;')"/>
  </template>

</stylesheet>

]]></sourcecode>

    </section>

  </back>
</rfc>