Network Working GroupJ. Reschke
Internet-Draftgreenbytes
Obsoletes: 2629 (if approved)November 18, 2013
Intended status: Standards Track
Expires: May 22, 2014

The 'XML2RFC' Vocabulary

Abstract

This document defines the 'XML2RFC' vocabulary; an XML-based (Extensible Markup Language) language used for writing Internet Drafts and RFCs.

Status of This Memo

This Internet-Draft is submitted in full conformance with the provisions of BCP 78 and BCP 79.

Internet-Drafts are working documents of the Internet Engineering Task Force (IETF). Note that other groups may also distribute working documents as Internet-Drafts. The list of current Internet-Drafts is at http://datatracker.ietf.org/drafts/current/.

Internet-Drafts are draft documents valid for a maximum of six months and may be updated, replaced, or obsoleted by other documents at any time. It is inappropriate to use Internet-Drafts as reference material or to cite them other than as “work in progress”.

This Internet-Draft will expire on May 22, 2014.

Copyright Notice

Copyright (c) 2013 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.

Editorial Note (To be removed by RFC Editor)

Discussion of this draft takes place on the XML2RFC mailing list (xml2rfc@ietf.org), which has its home page at <https://www.ietf.org/mailman/listinfo/xml2rfc>.


1. Introduction

This document describes version 2 ('v2') of the 'XML2RFC' vocabulary; an XML language ([XML]) used for writing RFCs ([RFCSTYLE]) and Internet Drafts ([IDGUIDE]).

It obsoletes the original version ("v1") [RFC2629], which contained the original language definition, and which was subsequently extended ("v2"). Furthermore, it discusses potential extensions in a future revision ("v3").

1.1. Syntax Notation

The vocabulary is defined in prose, based on the Relax NG schema ([RNC]) contained in Appendix C. Note that the schema can be used for automated validity checks, but certain constraints are only described in prose.

2. Elements

[rfc.comment.1: Need to fill in element and attribute descriptions.]

2.1. abstract

Contains the abstract of the document. The abstract ought to be self-contained and thus should not contain references or unexpanded abbreviations. See Section 4.3 of [RFCSTYLE] for more information.

This element appears as child element of: <front> (Section 2.19).

2.1.1. Contents

one or more <t> elements (Section 2.38)

2.2. address

Provides address information for the author.

This element appears as child element of: <author> (Section 2.6).

2.2.1. Contents

  1. one optional <postal> element (Section 2.27)
  2. one optional <phone> element (Section 2.26)
  3. one optional <facsimile> element (Section 2.16)
  4. one optional <email> element (Section 2.14)
  5. one optional <uri> element (Section 2.42)

2.3. annotation

This element appears as child element of: <reference> (Section 2.30).

2.3.1. Contents

In any order:

2.4. area

This element appears as child element of: <front> (Section 2.19).

2.4.1. Contents

text

2.5. artwork

This element appears as child element of: <figure> (Section 2.17).

2.5.1. Attributes

2.5.1.1. align

(optional)

Allowed values:

  • "left" (default)
  • "center"
  • "right"
2.5.1.2. alt

(optional)

2.5.1.3. height

(optional)

2.5.1.4. name

(optional)

2.5.1.5. src

(optional)

2.5.1.6. type

(optional)

2.5.1.7. width

(optional)

2.5.1.8. xml:space

(optional)

Allowed values:

  • "default"
  • "preserve" (default)

2.5.2. Contents

text

2.6. author

This element appears as child element of: <front> (Section 2.19).

2.6.1. Attributes

2.6.1.1. fullname

(optional)

2.6.1.2. initials

(optional)

2.6.1.3. role

(optional)

Allowed values:

  • "editor"
2.6.1.4. surname

(optional)

2.6.2. Contents

  1. one optional <organization> element (Section 2.25)
  2. one optional <address> element (Section 2.2)

2.7. back

This element appears as child element of: <rfc> (Section 2.33).

2.7.1. Contents

  1. optional <references> elements (Section 2.31)
  2. optional <section> elements (Section 2.34)

2.8. c

This element appears as child element of: <texttable> (Section 2.39).

2.8.1. Contents

In any order:

2.9. city

This element appears as child element of: <postal> (Section 2.27).

2.9.1. Contents

text

2.10. code

This element appears as child element of: <postal> (Section 2.27).

2.10.1. Contents

text

2.11. country

This element appears as child element of: <postal> (Section 2.27).

2.11.1. Contents

text

2.12. cref

This element appears as child element of: <annotation> (Section 2.3), <c> (Section 2.8), <postamble> (Section 2.28), <preamble> (Section 2.29), and <t> (Section 2.38).

2.12.1. Attributes

2.12.1.1. anchor

(optional)

2.12.1.2. source

(optional)

2.12.2. Contents

text

2.13. date

Provides information about the publication date.

Note that this element is used both for the boilerplate of the document being produced, and also inside bibliographic references.

In the first case, it defines the publication date, which, when producing internet drafts, will be used for computing the expiration date. When "year", "month" or "day" are left out, the processor will attempt to use the current system date if the attributes that are specified do match the system date. Note that month names need to match thee full (English) month name ("January", "February", "March", "April", "May, "June", "July", "August", "September", "October", "November", or "December") in order for expiration calculations to work.

In the second case, the date information will be embedded as-is into the reference text. Therefore, also vague dates ("ca. 2000"), date ranges etc. are allowed.

This element appears as child element of: <front> (Section 2.19).

2.13.1. Attributes

2.13.1.1. day

(optional)

2.13.1.2. month

(optional)

2.13.1.3. year

(optional)

2.14. email

This element appears as child element of: <address> (Section 2.2).

2.14.1. Contents

text

2.15. eref

This element appears as child element of: <annotation> (Section 2.3), <c> (Section 2.8), <postamble> (Section 2.28), <preamble> (Section 2.29), and <t> (Section 2.38).

2.15.1. Attributes

2.15.1.1. target

(mandatory)

2.15.2. Contents

text

2.16. facsimile

This element appears as child element of: <address> (Section 2.2).

2.16.1. Contents

text

2.17. figure

This element appears as child element of: <section> (Section 2.34), and <t> (Section 2.38).

2.17.1. Attributes

2.17.1.1. align

(optional)

Allowed values:

  • "left" (default)
  • "center"
  • "right"
2.17.1.2. alt

(optional)

2.17.1.3. anchor

(optional)

2.17.1.4. height

(optional)

2.17.1.5. src

(optional)

2.17.1.6. suppress-title

(optional)

Allowed values:

  • "true"
  • "false" (default)
2.17.1.7. title

(optional)

2.17.1.8. width

(optional)

2.17.2. Contents

  1. optional <iref> elements (Section 2.20)
  2. one optional <preamble> element (Section 2.29)
  3. one <artwork> element (Section 2.5)
  4. one optional <postamble> element (Section 2.28)

2.18. format

This element appears as child element of: <reference> (Section 2.30).

2.18.1. Attributes

2.18.1.1. octets

(optional)

2.18.1.2. target

(optional)

2.18.1.3. type

(mandatory)

2.19. front

This element appears as child element of: <reference> (Section 2.30), and <rfc> (Section 2.33).

2.19.1. Contents

  1. one <title> element (Section 2.40)
  2. one or more <author> elements (Section 2.6)
  3. one <date> element (Section 2.13)
  4. optional <area> elements (Section 2.4)
  5. optional <workgroup> elements (Section 2.44)
  6. optional <keyword> elements (Section 2.21)
  7. one optional <abstract> element (Section 2.1)
  8. optional <note> elements (Section 2.24)

2.20. iref

This element appears as child element of: <annotation> (Section 2.3), <c> (Section 2.8), <figure> (Section 2.17), <postamble> (Section 2.28), <preamble> (Section 2.29), <section> (Section 2.34), and <t> (Section 2.38).

2.20.1. Attributes

2.20.1.1. item

(mandatory)

2.20.1.2. primary

(optional)

Allowed values:

  • "true"
  • "false" (default)
2.20.1.3. subitem

(optional)

2.21. keyword

This element appears as child element of: <front> (Section 2.19).

2.21.1. Contents

text

2.22. list

This element appears as child element of: <t> (Section 2.38).

2.22.1. Attributes

2.22.1.1. counter

(optional)

2.22.1.2. hangIndent

(optional)

2.22.1.3. style

(optional)

2.22.2. Contents

one or more <t> elements (Section 2.38)

2.23. middle

This element appears as child element of: <rfc> (Section 2.33).

2.23.1. Contents

one or more <section> elements (Section 2.34)

2.24. note

This element appears as child element of: <front> (Section 2.19).

2.24.1. Attributes

2.24.1.1. title

(mandatory)

2.24.2. Contents

one or more <t> elements (Section 2.38)

2.25. organization

This element appears as child element of: <author> (Section 2.6).

2.25.1. Attributes

2.25.1.1. abbrev

(optional)

2.25.2. Contents

text

2.26. phone

This element appears as child element of: <address> (Section 2.2).

2.26.1. Contents

text

2.27. postal

This element appears as child element of: <address> (Section 2.2).

2.27.1. Contents

  1. one or more <street> elements (Section 2.37)
  2. In any order:

2.28. postamble

This element appears as child element of: <figure> (Section 2.17), and <texttable> (Section 2.39).

2.28.1. Contents

In any order:

2.29. preamble

This element appears as child element of: <figure> (Section 2.17), and <texttable> (Section 2.39).

2.29.1. Contents

In any order:

2.30. reference

This element appears as child element of: <references> (Section 2.31).

2.30.1. Attributes

2.30.1.1. anchor

(optional)

2.30.1.2. target

(optional)

2.30.2. Contents

  1. one <front> element (Section 2.19)
  2. optional <seriesInfo> elements (Section 2.35)
  3. optional <format> elements (Section 2.18)
  4. optional <annotation> elements (Section 2.3)

2.31. references

This element appears as child element of: <back> (Section 2.7).

2.31.1. Attributes

2.31.1.1. title

(optional)

2.31.2. Contents

one or more <reference> elements (Section 2.30)

2.32. region

This element appears as child element of: <postal> (Section 2.27).

2.32.1. Contents

text

2.33. rfc

This is the root element of the xml2rfc vocabulary.

Processors distinguish between RFC mode ("number" attribute being present) and Internet-Draft mode ("docname" attribute being present). It is invalid to specify both. Setting neither can be useful for producing other types of document (but is out-of-scope for this specification).

2.33.1. Attributes

2.33.1.1. category

(optional)

Document category (see Appendix A.1).

Allowed values:

  • "std"
  • "bcp"
  • "info"
  • "exp"
  • "historic"
2.33.1.2. consensus

(optional)

Affects the generated boilerplate.

See [RFC5741] for more information.

Allowed values:

  • "no"
  • "yes"
2.33.1.3. docName

(optional)

For Internet Drafts, this specifies the draft name (which appears below the title).

Note that the file extension is not part of the draft, so in general it should end with the current draft number ("-", plus two digits).

Furthermore, it is good practice to disambiguate current editor copies from submitted drafts (for instance, by replacing the draft number with the string "latest").

See Section 7 of [IDGUIDE] for further information.

2.33.1.4. ipr

(optional)

Represents the Intellectual Property status of the document. See Appendix A.2 for details.

Allowed values:

  • "full2026"
  • "noDerivativeWorks2026"
  • "none"
  • "full3667"
  • "noModification3667"
  • "noDerivatives3667"
  • "full3978"
  • "noModification3978"
  • "noDerivatives3978"
  • "trust200811"
  • "noModificationTrust200811"
  • "noDerivativesTrust200811"
  • "trust200902"
  • "noModificationTrust200902"
  • "noDerivativesTrust200902"
  • "pre5378Trust200902"
2.33.1.5. iprExtract

(optional)

Identifies a Section within the document for which extraction "as-is" is explicitly allowed (only relevant for historic values of the "ipr" attribute).

2.33.1.6. number

(optional)

The number of the RFC to be produced.

2.33.1.7. obsoletes

(optional)

A comma-separated list of RFC numbers or Internet-Draft names.

2.33.1.8. seriesNo

(optional)

When producing a document within document series (such as "STD"): the number within that series.

2.33.1.9. submissionType

(optional)

The document stream.

See Section 2 of [RFC5741] for details.

Allowed values:

  • "IETF" (default)
  • "IAB"
  • "IRTF"
  • "independent"
2.33.1.10. updates

(optional)

A comma-separated list of RFC numbers or Internet-Draft names.

2.33.1.11. xml:lang

(optional)

The natural language used in the document (defaults to "en").

See Section 2.12 of [XML] for more information.

2.33.2. Contents

  1. one <front> element (Section 2.19)
  2. one <middle> element (Section 2.23)
  3. one optional <back> element (Section 2.7)

2.34. section

This element appears as child element of: <back> (Section 2.7), <middle> (Section 2.23), and <section> (Section 2.34).

2.34.1. Attributes

2.34.1.1. anchor

(optional)

2.34.1.2. title

(mandatory)

2.34.1.3. toc

(optional)

Allowed values:

  • "include"
  • "exclude"
  • "default" (default)

2.34.2. Contents

  1. In any order:
  2. optional <section> elements (Section 2.34)

2.35. seriesInfo

Names the document series in which this document appears, and also specifies an identifier within that series.

This element appears as child element of: <reference> (Section 2.30).

2.35.1. Attributes

2.35.1.1. name

(mandatory)

The name of the series.

The following names trigger specific processing (such as for auto-generating links, and adding descriptions such as "work in progress"): "BCP", "FYI", "Internet-Draft", "RFC", and "STD".

2.35.1.2. value

(mandatory)

The identifier within the series specified by the "name" attribute.

For BCPs, FYIs, RFCs, and STDs this is the number within the series. For Internet Drafts, it is the full draft name (ending with the two-digit version number).

2.36. spanx

This element appears as child element of: <annotation> (Section 2.3), <c> (Section 2.8), <postamble> (Section 2.28), <preamble> (Section 2.29), and <t> (Section 2.38).

2.36.1. Attributes

2.36.1.1. style

(optional)

2.36.1.2. xml:space

(optional)

Allowed values:

  • "default"
  • "preserve" (default)

2.36.2. Contents

text

2.37. street

This element appears as child element of: <postal> (Section 2.27).

2.37.1. Contents

text

2.38. t

This element appears as child element of: <abstract> (Section 2.1), <list> (Section 2.22), <note> (Section 2.24), and <section> (Section 2.34).

2.38.1. Attributes

2.38.1.1. anchor

(optional)

2.38.1.2. hangText

(optional)

2.38.2. Contents

In any order:

2.39. texttable

This element appears as child element of: <section> (Section 2.34).

2.39.1. Attributes

2.39.1.1. align

(optional)

Allowed values:

  • "left"
  • "center" (default)
  • "right"
2.39.1.2. anchor

(optional)

2.39.1.3. style

(optional)

Allowed values:

  • "all"
  • "none"
  • "headers"
  • "full" (default)
2.39.1.4. suppress-title

(optional)

Allowed values:

  • "true"
  • "false" (default)
2.39.1.5. title

(optional)

2.39.2. Contents

  1. one optional <preamble> element (Section 2.29)
  2. one or more <ttcol> elements (Section 2.41)
  3. optional <c> elements (Section 2.8)
  4. one optional <postamble> element (Section 2.28)

2.40. title

This element appears as child element of: <front> (Section 2.19).

2.40.1. Attributes

2.40.1.1. abbrev

(optional)

2.40.2. Contents

text

2.41. ttcol

This element appears as child element of: <texttable> (Section 2.39).

2.41.1. Attributes

2.41.1.1. align

(optional)

Allowed values:

  • "left" (default)
  • "center"
  • "right"
2.41.1.2. width

(optional)

2.41.2. Contents

text

2.42. uri

This element appears as child element of: <address> (Section 2.2).

2.42.1. Contents

text

2.43. vspace

This element appears as child element of: <t> (Section 2.38).

2.43.1. Attributes

2.43.1.1. blankLines

(optional)

2.44. workgroup

This element appears as child element of: <front> (Section 2.19).

2.44.1. Contents

text

2.45. xref

This element appears as child element of: <annotation> (Section 2.3), <c> (Section 2.8), <postamble> (Section 2.28), <preamble> (Section 2.29), and <t> (Section 2.38).

2.45.1. Attributes

2.45.1.1. format

(optional)

Allowed values:

  • "counter"
  • "title"
  • "none"
  • "default" (default)
2.45.1.2. pageno

(optional)

Allowed values:

  • "true"
  • "false" (default)
2.45.1.3. target

(mandatory)

2.45.2. Contents

text

3. IANA Considerations

[rfc.comment.2: Register application/xml2rfc+xml.]

4. Acknowledgments

We thank Marshall T. Rose for both the original design and the reference implementation of the "xml2rfc" formatter.

5. References

5.1. Normative References

[XML]
Maler, E., Yergeau, F., Paoli, J., Sperberg-McQueen, M., and T. Bray, “Extensible Markup Language (XML) 1.0 (Fifth Edition)”, W3C Recommendation REC-xml-20081126, November 2008, <http://www.w3.org/TR/2008/REC-xml-20081126/>.
Latest version available at <http://www.w3.org/TR/xml>.

Appendix A. Front Page Generation

A.1. The /rfc/@category Attribute

For RFCs, the category determines the "maturity level" (see Section 4 of [RFC2026]). The allowed values are "std" for "Standards Track", "bcp" for "BCP", "info" for "Informational", "exp" for "Experimental", and "historic" for - surprise - "Historic".

For Internet Drafts, the category attribute is not needed, but will appear on the front page ("Intended Status"). Supplying this information can be useful, because reviewers may want to know.

A.2. The /rfc/@ipr Attribute

As of the time of this writing, this attribute value can take a long list of values. As frequently, this is not the result of a grand plan, but simply for historic reasons. Of these values, only a few are currently in use; all others are supported by the various tools for backwards compatibility with old source files.

Disclaimer: THIS ONLY PROVIDES IMPLEMENTATION INFORMATION. IF YOU NEED LEGAL ADVICE, PLEASE CONTACT A LAWYER. For further information, refer to <http://trustee.ietf.org/docs/IETF-Copyright-FAQ.pdf>.

Finally, for the current "Status Of This Memo" text, the submissionType attribute determines whether a statement about "Code Components" is inserted (this is the case for the value "IETF", which also happens to be the default). Other values, such as "independent", suppress this part of the text.

A.2.1. Current Values: '*trust200902'

The name for these values refers to the "TLP" ("IETF TRUST Legal Provisions Relating to IETF Documents"), on effect February 15, 2009 ([TLP2.0]). Updates to this document were published on September 12, 2009 ([TLP3.0]) and on December 28, 2009 ([TLP4.0]), modifying the license for code components (see <http://trustee.ietf.org/license-info/> for further information). The actual text is located in Section 6 ("Text To Be Included in IETF Documents") of these documents.

The tools will automatically produce the "right" text depending on the document's date information (see above):

TLPstarting with publication date
[TLP3.0]2009-11-01
[TLP4.0]2010-04-01
A.2.1.1. trust200902

This should be the default, unless one of the more specific '*trust200902' values is a better fit. It produces the text in Sections 6.a and 6.b of the TLP.

A.2.1.2. noModificationTrust200902

This produces the additional text from Section 6.c.i of the TLP:

This document may not be modified, and derivative works of it may not be created, except to format it for publication as an RFC or to translate it into languages other than English.

A.2.1.3. noDerivativesTrust200902

This produces the additional text from Section 6.c.ii of the TLP:

This document may not be modified, and derivative works of it may not be created, and it may not be published except as an Internet-Draft.

A.2.1.4. pre5378Trust200902

This produces the additional text from Section 6.c.iii of the TLP, frequently called the "pre-5378 escape clause":

This document may contain material from IETF Documents or IETF Contributions published or made publicly available before November 10, 2008. The person(s) controlling the copyright in some of this material may not have granted the IETF Trust the right to allow modifications of such material outside the IETF Standards Process. Without obtaining an adequate license from the person(s) controlling the copyright in such materials, this document may not be modified outside the IETF Standards Process, and derivative works of it may not be created outside the IETF Standards Process, except to format it for publication as an RFC or to translate it into languages other than English.

See Section 4 of <http://trustee.ietf.org/docs/IETF-Copyright-FAQ.pdf> for further information about when to use this value.

A.2.2. Historic Values

A.2.2.1. Historic Values: '*trust200811'

The attribute values "trust200811", "noModificationTrust200811" and "noDerivativesTrust200811" are similar to their "trust200902" counterparts, except that they use text specified in <http://trustee.ietf.org/license-info/archive/IETF-Trust-License-Policy_11-10-08.pdf>.

A.2.2.2. Historic Values: '*3978'

The attribute values "full3978", "noModification3978" and "noDerivatives3978" are similar to their counterparts above, except that they use text specified in RFC 3978 (March 2005).

A.2.2.3. Historic Values: '*3667'

The attribute values "full3667", "noModification3667" and "noDerivatives3667" are similar to their counterparts above, except that they use text specified in RFC 3667 (February 2004).

A.2.2.4. Historic Values: '*2026'

The attribute values "full2026" and "noDerivativeWorks2026" are similar to their counterparts above, except that they use text specified in RFC 2026 (October 1996).

The special value "none" was also used back then, and denied the IETF any rights beyond publication as Internet Draft.

Appendix B. Changes from RFC 2629 ('v1')

B.1. Removed Elements

The <appendix> element has been removed; to generate an appendix, place a <section> inside <back>.

B.2. Changed Defaults

Many attributes have lost their "default" value; this is to avoid having document semantics differ based on whether a DTD was specified and evaluated. Processors will handle absent values the way the default value was specified before.

B.3. Changed Elements

<artwork>: Has a set of new attributes: "name", "type", "src", "align", "alt", "width", and "height". (Section 2.5)

<author>: The <organization> element is now optional. The "role" attribute was added. (Section 2.6)

<date>: All attributes are now optional. (Section 2.13)

<figure>: Has a set of new attributes: "suppress-title", "src", "align", "alt", "width", and "height". (Section 2.17)

<iref>: Has a new "primary" attribute. (Section 2.20)

<list>: The "style" attribute isn't restricted to a set of enumerated values anymore. The "hangIndent" and "counter" attributes have been added. (Section 2.22)

<rfc>: The "ipr" attribute has gained additional values. The attributes "consensus", "iprExtract", "submissionType", and "xml:lang" have been added. (Section 2.33)

<reference>: <annotation> allows adding prose to a reference. (Section 2.30)

<references>: Can now appear multiple times, and carry a "title" attribute (so that normative and informative references can be split). (Section 2.31)

<section>: The new "toc" attribute controls whether it will appear in the Table Of Contents. <iref> can now appear as direct child element. (Section 2.34)

<t>: The "anchor" attribute can now be used as well, however there are restrictions on how they can be referred to. (Section 2.38)

B.4. New Elements

The following elements have been added: <annotation> (Section 2.3), <c> (Section 2.8), <cref> (Section 2.12), <format> (Section 2.18), <spanx> (Section 2.36), <texttable> (Section 2.39).

Appendix C. Relax NG Schema

namespace a = "http://relaxng.org/ns/compatibility/annotations/1.0"

NUMBER = string
NUMBERS = string
DAY = string
MONTH = string
YEAR = string
URI = string
ATEXT = string
CTEXT = text
TEXT = text
rfc =
  element rfc {
    attribute number { NUMBER }?,
    [ a:defaultValue = "" ] attribute obsoletes { NUMBERS }?,
    [ a:defaultValue = "" ] attribute updates { NUMBERS }?,
    attribute category { "std" | "bcp" | "info" | "exp" | "historic" 
}?,
    attribute consensus { "no" | "yes" }?,
    attribute seriesNo { NUMBER }?,
    attribute ipr {
      "full2026"
      | "noDerivativeWorks2026"
      | "none"
      | "full3667"
      | "noModification3667"
      | "noDerivatives3667"
      | "full3978"
      | "noModification3978"
      | "noDerivatives3978"
      | "trust200811"
      | "noModificationTrust200811"
      | "noDerivativesTrust200811"
      | "trust200902"
      | "noModificationTrust200902"
      | "noDerivativesTrust200902"
      | "pre5378Trust200902"
    }?,
    attribute iprExtract { xsd:IDREF }?,
    [ a:defaultValue = "IETF" ]
    attribute submissionType {
      "IETF" | "IAB" | "IRTF" | "independent"
    }?,
    attribute docName { ATEXT }?,
    [ a:defaultValue = "en" ] attribute xml:lang { ATEXT }?,
    front,
    middle,
    back?
  }
front =
  element front {
    title, author+, date, area*, workgroup*, keyword*, abstract?, 
note*
  }
title =
  element title {
    attribute abbrev { ATEXT }?,
    CTEXT
  }
author =
  element author {
    attribute initials { ATEXT }?,
    attribute surname { ATEXT }?,
    attribute fullname { ATEXT }?,
    attribute role { "editor" }?,
    organization?,
    address?
  }
organization =
  element organization {
    attribute abbrev { ATEXT }?,
    CTEXT
  }
address = element address { postal?, phone?, facsimile?, email?, 
uri? }
postal = element postal { street+, (city | region | code | country)* 
}
street = element street { CTEXT }
city = element city { CTEXT }
region = element region { CTEXT }
code = element code { CTEXT }
country = element country { CTEXT }
phone = element phone { CTEXT }
facsimile = element facsimile { CTEXT }
email = element email { CTEXT }
uri = element uri { CTEXT }
date =
  element date {
    attribute day { DAY }?,
    attribute month { MONTH }?,
    attribute year { YEAR }?,
    empty
  }
area = element area { CTEXT }
workgroup = element workgroup { CTEXT }
keyword = element keyword { CTEXT }
abstract = element abstract { t+ }
note =
  element note {
    attribute title { ATEXT },
    t+
  }
middle = element middle { section+ }
section =
  element section {
    attribute anchor { xsd:ID }?,
    attribute title { ATEXT },
    [ a:defaultValue = "default" ]
    attribute toc { "include" | "exclude" | "default" }?,
    (t | figure | texttable | iref)*,
    section*
  }
t =
  element t {
    attribute anchor { xsd:ID }?,
    attribute hangText { ATEXT }?,
    (TEXT
     | \list
     | figure
     | xref
     | eref
     | iref
     | cref
     | spanx
     | vspace)*
  }
\list =
  element list {
    attribute style { ATEXT }?,
    attribute hangIndent { NUMBER }?,
    attribute counter { ATEXT }?,
    t+
  }
xref =
  element xref {
    attribute target { xsd:IDREF },
    [ a:defaultValue = "false" ] attribute pageno { "true" | "false" 
}?,
    [ a:defaultValue = "default" ]
    attribute format { "counter" | "title" | "none" | "default" }?,
    CTEXT
  }
eref =
  element eref {
    attribute target { URI },
    CTEXT
  }
iref =
  element iref {
    attribute item { ATEXT },
    [ a:defaultValue = "" ] attribute subitem { ATEXT }?,
    [ a:defaultValue = "false" ]
    attribute primary { "true" | "false" }?,
    empty
  }
cref =
  element cref {
    attribute anchor { xsd:ID }?,
    attribute source { ATEXT }?,
    CTEXT
  }
spanx =
  element spanx {
    [ a:defaultValue = "preserve" ]
    attribute xml:space { "default" | "preserve" }?,
    [ a:defaultValue = "emph" ] attribute style { ATEXT }?,
    CTEXT
  }
vspace =
  element vspace {
    [ a:defaultValue = "0" ] attribute blankLines { NUMBER }?,
    empty
  }
figure =
  element figure {
    attribute anchor { xsd:ID }?,
    [ a:defaultValue = "" ] attribute title { ATEXT }?,
    [ a:defaultValue = "false" ]
    attribute suppress-title { "true" | "false" }?,
    attribute src { URI }?,
    [ a:defaultValue = "left" ]
    attribute align { "left" | "center" | "right" }?,
    [ a:defaultValue = "" ] attribute alt { ATEXT }?,
    [ a:defaultValue = "" ] attribute width { ATEXT }?,
    [ a:defaultValue = "" ] attribute height { ATEXT }?,
    iref*,
    preamble?,
    artwork,
    postamble?
  }
preamble =
  element preamble { (TEXT | xref | eref | iref | cref | spanx)* }
artwork =
  element artwork {
    [ a:defaultValue = "preserve" ]
    attribute xml:space { "default" | "preserve" }?,
    [ a:defaultValue = "" ] attribute name { ATEXT }?,
    [ a:defaultValue = "" ] attribute type { ATEXT }?,
    attribute src { URI }?,
    [ a:defaultValue = "left" ]
    attribute align { "left" | "center" | "right" }?,
    [ a:defaultValue = "" ] attribute alt { ATEXT }?,
    [ a:defaultValue = "" ] attribute width { ATEXT }?,
    [ a:defaultValue = "" ] attribute height { ATEXT }?,
    TEXT*
  }
postamble =
  element postamble { (TEXT | xref | eref | iref | cref | spanx)* }
texttable =
  element texttable {
    attribute anchor { xsd:ID }?,
    [ a:defaultValue = "" ] attribute title { ATEXT }?,
    [ a:defaultValue = "false" ]
    attribute suppress-title { "true" | "false" }?,
    [ a:defaultValue = "center" ]
    attribute align { "left" | "center" | "right" }?,
    [ a:defaultValue = "full" ]
    attribute style { "all" | "none" | "headers" | "full" }?,
    preamble?,
    ttcol+,
    c*,
    postamble?
  }
ttcol =
  element ttcol {
    attribute width { ATEXT }?,
    [ a:defaultValue = "left" ]
    attribute align { "left" | "center" | "right" }?,
    CTEXT
  }
c = element c { (TEXT | xref | eref | iref | cref | spanx)* }
back = element back { references*, section* }
references =
  element references {
    [ a:defaultValue = "References" ] attribute title { ATEXT }?,
    reference+
  }
reference =
  element reference {
    attribute anchor { xsd:ID }?,
    attribute target { URI }?,
    front,
    seriesInfo*,
    format*,
    annotation*
  }
seriesInfo =
  element seriesInfo {
    attribute name { ATEXT },
    attribute value { ATEXT },
    empty
  }
format =
  element format {
    attribute target { URI }?,
    attribute type { ATEXT },
    attribute octets { NUMBER }?,
    empty
  }
annotation =
  element annotation { (TEXT | xref | eref | iref | cref | spanx)* }
start = rfc

Appendix D. Proposed Future Changes for 'v3'

[rfc.comment.3: The list below is just a starting point.]

Allow multiple paragraphs in list items; eliminating the need to use <vspace> (see <http://greenbytes.de/tech/webdav/rfc2629xslt/rfc2629xslt.html#ext.element.lt>).

Make the <date> element optional; all of its content is optional already.

Deprecate or remove the <format> element; right now it's not used for the generation of the plain text document anyway.

Allow <reference>s that identify a document set such as a BCP.

Allow overriding the "anchor" attribute of an included <reference> element.

Add a way to add prose to a reference that avoids abuse of <seriesInfo>.

Extend <xref> so that subsection/anchors can be specified (see <http://greenbytes.de/tech/webdav/rfc2629xslt/rfc2629xslt.html#ext-rfc2629.xref>). Remove the "pageno" attribute which seems to be both undocumented and non-functional.

Extend <figure> to support different types of artwork (such as by specifying certain type attribute values, see <http://greenbytes.de/tech/webdav/rfc2629xslt/rfc2629xslt.html#artwork.types>), and also avoid having to markup code (such as ABNF) as "artwork". Also, it would be good if "code components" could be marked as such. Finally, even in preformatted text use of markup could be useful to support (a) references, or (b) highlighting the important bits (<http://greenbytes.de/tech/webdav/rfc2629xslt/rfc2629xslt.html#ext-rfc2629.artwork>).

If contact information is changed to allow non-ASCII characters: add a place for a ASCII fallback (probably just for the author names).

The content model for <postal> ought to be more strict to allow at most one of <city>, <region>, <code>, and <country>.

Cleanup the set of overlapping attributes between <figure> and <artwork>.

<spanx> has both a weird whitespace model ("preserve") and problematic styling. Consider to deprecate it in favor of elements such as <em> and <code>.

Extend the concept of language tagging to at least examples and contact information to address potential japanese/chinese font confusion.

Appendix E. Comparison Of Vocabularies (to be removed before publication as RFC)

With comments being stripped; using "diff -C100" to add change marks.

E.1. RFC 2629 ('v1') RelaxNG Grammar

(from Appendix B of [RFC2629], converted using "trang" into Relag NG Compact Notation [RNC])

  namespace a = "http://relaxng.org/ns/compatibility/annotations/1.0"
  
  NUMBER = string
  NUMBERS = string
  DAY = string
  MONTH = string
  YEAR = string
  URI = string
  ATEXT = string
  CTEXT = text
  TEXT = text
  rfc =
    element rfc {
      attribute number { NUMBER }?,
      [ a:defaultValue = "" ] attribute obsoletes { NUMBERS }?,
      [ a:defaultValue = "" ] attribute updates { NUMBERS }?,
-     [ a:defaultValue = "info" ]
      attribute category { "std" | "bcp" | "info" | "exp" | "historic" }?,
      attribute seriesNo { NUMBER }?,
!     attribute ipr { "full2026" | "noDerivativeWorks2026" | "none" }?,
      attribute docName { ATEXT }?,
      front,
      middle,
      back?
    }
  front =
    element front {
      title, author+, date, area*, workgroup*, keyword*, abstract?, note*
    }
  title =
    element title {
      attribute abbrev { ATEXT }?,
      CTEXT
    }
  author =
    element author {
      attribute initials { ATEXT }?,
      attribute surname { ATEXT }?,
      attribute fullname { ATEXT }?,
!     organization,
      address?
    }
  organization =
    element organization {
      attribute abbrev { ATEXT }?,
      CTEXT
    }
  address = element address { postal?, phone?, facsimile?, email?, uri? }
  postal = element postal { street+, (city | region | code | country)* }
  street = element street { CTEXT }
  city = element city { CTEXT }
  region = element region { CTEXT }
  code = element code { CTEXT }
  country = element country { CTEXT }
  phone = element phone { CTEXT }
  facsimile = element facsimile { CTEXT }
  email = element email { CTEXT }
  uri = element uri { CTEXT }
  date =
    element date {
      attribute day { DAY }?,
!     attribute month { MONTH },
!     attribute year { YEAR },
      empty
    }
  area = element area { CTEXT }
  workgroup = element workgroup { CTEXT }
  keyword = element keyword { CTEXT }
  abstract = element abstract { t+ }
  note =
    element note {
      attribute title { ATEXT },
      t+
    }
  middle = element middle { section+ }
  section =
    element section {
      attribute anchor { xsd:ID }?,
      attribute title { ATEXT },
!     (t | figure | section)*
    }
  t =
    element t {
      attribute hangText { ATEXT }?,
!     (TEXT | \list | figure | xref | eref | iref | vspace)*
    }
  \list =
    element list {
!     [ a:defaultValue = "empty" ]
!     attribute style { "numbers" | "symbols" | "hanging" | "empty" }?,
      t+
    }
  xref =
    element xref {
      attribute target { xsd:IDREF },
      [ a:defaultValue = "false" ] attribute pageno { "true" | "false" }?,
      CTEXT
    }
  eref =
    element eref {
      attribute target { URI },
      CTEXT
    }
  iref =
    element iref {
      attribute item { ATEXT },
      [ a:defaultValue = "" ] attribute subitem { ATEXT }?,
      empty
    }
  vspace =
    element vspace {
      [ a:defaultValue = "0" ] attribute blankLines { NUMBER }?,
      empty
    }
  figure =
    element figure {
      attribute anchor { xsd:ID }?,
      [ a:defaultValue = "" ] attribute title { ATEXT }?,
      preamble?,
      artwork,
      postamble?
    }
! preamble = element preamble { (TEXT | xref | eref | iref)* }
  artwork =
    element artwork {
      [ a:defaultValue = "preserve" ]
      attribute xml:space { "default" | "preserve" }?,
      TEXT*
    }
! postamble = element postamble { (TEXT | xref | eref | iref)* }
! back = element back { references?, section* }
! references = element references { reference+ }
  reference =
    element reference {
      attribute anchor { xsd:ID }?,
      attribute target { URI }?,
      front,
!     seriesInfo*
    }
  seriesInfo =
    element seriesInfo {
      attribute name { ATEXT },
      attribute value { ATEXT },
      empty
    }
  start = rfc

E.2. Current ('v2') RelaxNG Grammar

  namespace a = "http://relaxng.org/ns/compatibility/annotations/1.0"
  
  NUMBER = string
  NUMBERS = string
  DAY = string
  MONTH = string
  YEAR = string
  URI = string
  ATEXT = string
  CTEXT = text
  TEXT = text
  rfc =
    element rfc {
      attribute number { NUMBER }?,
      [ a:defaultValue = "" ] attribute obsoletes { NUMBERS }?,
      [ a:defaultValue = "" ] attribute updates { NUMBERS }?,
      attribute category { "std" | "bcp" | "info" | "exp" | "historic" }?,
+     attribute consensus { "no" | "yes" }?,
      attribute seriesNo { NUMBER }?,
!     attribute ipr {
!       "full2026"
!       | "noDerivativeWorks2026"
!       | "none"
!       | "full3667"
!       | "noModification3667"
!       | "noDerivatives3667"
!       | "full3978"
!       | "noModification3978"
!       | "noDerivatives3978"
!       | "trust200811"
!       | "noModificationTrust200811"
!       | "noDerivativesTrust200811"
!       | "trust200902"
!       | "noModificationTrust200902"
!       | "noDerivativesTrust200902"
!       | "pre5378Trust200902"
!     }?,
!     attribute iprExtract { xsd:IDREF }?,
!     [ a:defaultValue = "IETF" ]
!     attribute submissionType {
!       "IETF" | "IAB" | "IRTF" | "independent"
!     }?,
      attribute docName { ATEXT }?,
+     [ a:defaultValue = "en" ] attribute xml:lang { ATEXT }?,
      front,
      middle,
      back?
    }
  front =
    element front {
      title, author+, date, area*, workgroup*, keyword*, abstract?, note*
    }
  title =
    element title {
      attribute abbrev { ATEXT }?,
      CTEXT
    }
  author =
    element author {
      attribute initials { ATEXT }?,
      attribute surname { ATEXT }?,
      attribute fullname { ATEXT }?,
!     attribute role { "editor" }?,
!     organization?,
      address?
    }
  organization =
    element organization {
      attribute abbrev { ATEXT }?,
      CTEXT
    }
  address = element address { postal?, phone?, facsimile?, email?, uri? }
  postal = element postal { street+, (city | region | code | country)* }
  street = element street { CTEXT }
  city = element city { CTEXT }
  region = element region { CTEXT }
  code = element code { CTEXT }
  country = element country { CTEXT }
  phone = element phone { CTEXT }
  facsimile = element facsimile { CTEXT }
  email = element email { CTEXT }
  uri = element uri { CTEXT }
  date =
    element date {
      attribute day { DAY }?,
!     attribute month { MONTH }?,
!     attribute year { YEAR }?,
      empty
    }
  area = element area { CTEXT }
  workgroup = element workgroup { CTEXT }
  keyword = element keyword { CTEXT }
  abstract = element abstract { t+ }
  note =
    element note {
      attribute title { ATEXT },
      t+
    }
  middle = element middle { section+ }
  section =
    element section {
      attribute anchor { xsd:ID }?,
      attribute title { ATEXT },
!     [ a:defaultValue = "default" ]
!     attribute toc { "include" | "exclude" | "default" }?,
!     (t | figure | texttable | iref)*,
!     section*
    }
  t =
    element t {
+     attribute anchor { xsd:ID }?,
      attribute hangText { ATEXT }?,
!     (TEXT
!      | \list
!      | figure
!      | xref
!      | eref
!      | iref
!      | cref
!      | spanx
!      | vspace)*
    }
  \list =
    element list {
!     attribute style { ATEXT }?,
!     attribute hangIndent { NUMBER }?,
!     attribute counter { ATEXT }?,
      t+
    }
  xref =
    element xref {
      attribute target { xsd:IDREF },
      [ a:defaultValue = "false" ] attribute pageno { "true" | "false" }?,
+     [ a:defaultValue = "default" ]
+     attribute format { "counter" | "title" | "none" | "default" }?,
      CTEXT
    }
  eref =
    element eref {
      attribute target { URI },
      CTEXT
    }
  iref =
    element iref {
      attribute item { ATEXT },
      [ a:defaultValue = "" ] attribute subitem { ATEXT }?,
+     [ a:defaultValue = "false" ]
+     attribute primary { "true" | "false" }?,
      empty
    }
+ cref =
+   element cref {
+     attribute anchor { xsd:ID }?,
+     attribute source { ATEXT }?,
+     CTEXT
+   }
+ spanx =
+   element spanx {
+     [ a:defaultValue = "preserve" ]
+     attribute xml:space { "default" | "preserve" }?,
+     [ a:defaultValue = "emph" ] attribute style { ATEXT }?,
+     CTEXT
+   }
  vspace =
    element vspace {
      [ a:defaultValue = "0" ] attribute blankLines { NUMBER }?,
      empty
    }
  figure =
    element figure {
      attribute anchor { xsd:ID }?,
      [ a:defaultValue = "" ] attribute title { ATEXT }?,
+     [ a:defaultValue = "false" ]
+     attribute suppress-title { "true" | "false" }?,
+     attribute src { URI }?,
+     [ a:defaultValue = "left" ]
+     attribute align { "left" | "center" | "right" }?,
+     [ a:defaultValue = "" ] attribute alt { ATEXT }?,
+     [ a:defaultValue = "" ] attribute width { ATEXT }?,
+     [ a:defaultValue = "" ] attribute height { ATEXT }?,
+     iref*,
      preamble?,
      artwork,
      postamble?
    }
! preamble =
!   element preamble { (TEXT | xref | eref | iref | cref | spanx)* }
  artwork =
    element artwork {
      [ a:defaultValue = "preserve" ]
      attribute xml:space { "default" | "preserve" }?,
+     [ a:defaultValue = "" ] attribute name { ATEXT }?,
+     [ a:defaultValue = "" ] attribute type { ATEXT }?,
+     attribute src { URI }?,
+     [ a:defaultValue = "left" ]
+     attribute align { "left" | "center" | "right" }?,
+     [ a:defaultValue = "" ] attribute alt { ATEXT }?,
+     [ a:defaultValue = "" ] attribute width { ATEXT }?,
+     [ a:defaultValue = "" ] attribute height { ATEXT }?,
      TEXT*
    }
! postamble =
!   element postamble { (TEXT | xref | eref | iref | cref | spanx)* }
! texttable =
!   element texttable {
!     attribute anchor { xsd:ID }?,
!     [ a:defaultValue = "" ] attribute title { ATEXT }?,
!     [ a:defaultValue = "false" ]
!     attribute suppress-title { "true" | "false" }?,
!     [ a:defaultValue = "center" ]
!     attribute align { "left" | "center" | "right" }?,
!     [ a:defaultValue = "full" ]
!     attribute style { "all" | "none" | "headers" | "full" }?,
!     preamble?,
!     ttcol+,
!     c*,
!     postamble?
!   }
! ttcol =
!   element ttcol {
!     attribute width { ATEXT }?,
!     [ a:defaultValue = "left" ]
!     attribute align { "left" | "center" | "right" }?,
!     CTEXT
!   }
! c = element c { (TEXT | xref | eref | iref | cref | spanx)* }
! back = element back { references*, section* }
! references =
!   element references {
!     [ a:defaultValue = "References" ] attribute title { ATEXT }?,
!     reference+
!   }
  reference =
    element reference {
      attribute anchor { xsd:ID }?,
      attribute target { URI }?,
      front,
!     seriesInfo*,
!     format*,
!     annotation*
    }
  seriesInfo =
    element seriesInfo {
      attribute name { ATEXT },
      attribute value { ATEXT },
      empty
    }
+ format =
+   element format {
+     attribute target { URI }?,
+     attribute type { ATEXT },
+     attribute octets { NUMBER }?,
+     empty
+   }
+ annotation =
+   element annotation { (TEXT | xref | eref | iref | cref | spanx)* }
  start = rfc

Index

A B C D E F H I K L M N O P R S T U V W X Y

Author's Address

Julian F. Reschke
greenbytes GmbH
Hafenweg 16
Muenster, NW 48155
Germany
Email: julian.reschke@greenbytes.de
URI: http://greenbytes.de/tech/webdav/