Internet Architecture Board (IAB) P. Hoffman
Request for Comments: 7991 ICANN
Obsoletes: 7749 December 2016
Category: Informational
ISSN: 2070-1721
The "xml2rfc" Version 3 Vocabulary
Abstract
This document defines the "xml2rfc" version 3 vocabulary: an
XML-based language used for writing RFCs and Internet-Drafts. It is
heavily derived from the version 2 vocabulary that is also under
discussion. This document obsoletes the v2 grammar described in
RFC 7749.
Status of This Memo
This document is not an Internet Standards Track specification; it is
published for informational purposes.
This document is a product of the Internet Architecture Board (IAB)
and represents information that the IAB has deemed valuable to
provide for permanent record. It represents the consensus of the
Internet Architecture Board (IAB). Documents approved for
publication by the IAB are not a candidate for any level of Internet
Standard; see Section 2 of RFC 7841.
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/rfc7991.
Copyright Notice
Copyright (c) 2016 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.
Introduction
This document describes version 3 ("v3") of the "xml2rfc" vocabulary:
an XML-based language ("Extensible Markup Language" [XML]) used for
writing RFCs RFC7322 and Internet-Drafts [IDGUIDE].
This document obsoletes the version 2 vocabulary ("v2") RFC7749,
which contains the extended language definition. That document in
turn obsoletes the original version ("v1") RFC2629. This document
directly copies the material from RFC7749 where possible.
The v3 format will be used as part of the new RFC Series format
described in RFC6949. The new format will be handled by one or
more new tools for preparing the XML and converting it to other
representations. Features of the expected tools are described in
Appendix B. That section defines some terms used throughout this
document, such as "prep tool" and "formatter".
Note that the vocabulary contains certain constructs that might not
be used when generating the final text; however, they can provide
useful data for other uses (such as index generation, populating a
keyword database, or syntax checks).
In this document, the term "format" is used when describing types of
documents, primarily XML and HTML. The term "representation" is used
when talking about a specific instantiation of a format, such as an
XML document or an HTML document that was created by an XML document.
Expected Updates to the Specification
Non-interoperable changes in later versions of this specification are
likely based on experience gained in implementing the new publication
toolsets. Revised documents will be published capturing those
changes as the toolsets are completed. Other implementers must not
expect those changes to remain backwards-compatible with the details
described in this document.
Design Criteria for the Changes in v3
The design criteria of the changes from v2 to v3 are as follows:
o The intention is that starting and editing a v3 document will be
easier than for a v2 document.
o There will be good v2-to-v3 conversion tools for when an author
wants to change versions.
o There are no current plans to make v3 XML the required submission
format for drafts or RFCs. That might happen eventually, but it
is likely to be years away.
There is a desire to keep as much of the v2 grammar as makes sense
within the above design criteria and not to make gratuitous changes
to the v2 grammar. Another way to say this is "we would rather
encourage backwards compatibility but not be constrained by it."
Still, the goal of starting and editing a v3 document being easier
than for a v2 document is more important than backwards compatibility
with v2, given the latter two design criteria.
v3 is upwards compatible with v2, meaning that a v2 document is meant
to be a valid v3 document as well. However, some features of v2 are
deprecated in v3 in favor of new elements. Deprecated features are
listed in Section 1.3.3 and are described in RFC7749.
Differences from v2 to v3
This is a (hopefully) complete list of all the technical changes
between RFC7749 and this document.
New Elements in v3
o Add
, , and as new ways to make lists. This is a
significant change from v2 in that the child under these elements
is - , not <t>.
- has a model of either containing one or
more <t> elements, or containing the flowing text normally found
in <t>. These lists are children of <section>s and other lists
instead of <t>.
o Add , , , , and for character
formatting.
o Add <aside> for incidental text that will be indented when
displayed.
o Add <sourcecode> to differentiate from <artwork>.
o Add , <thead>, <tbody>, <tfoot>, ,
, and | to
give table functionality like that in HTML.
o Add <boilerplate> to hold the automatically generated boilerplate
text.
o Add to indicate a quotation as in a paragraph-like
format.
o Add <name> to sections, notes, figures, and texttables to allow
character formatting (fixed-width font) in their titles and to
allow references in the names.
o Add <postalLine>, free text that represents one line of the
address.
o Add <displayreference> to allow display of more mnemonic anchor
names for automatically included references.
o Add <refcontent> to allow better control of text in a reference.
o Add <referencegroup> to allow referencing multi-RFC documents such
as STDs and BCPs.
o Add <relref> to allow referencing specific sections or anchors in
references.
o Add <link> to point to a resource related to the RFC.
o Add to allow line breaks (but not blank lines) in the
generated output for table cells.
o Add <svg> to allow easy inclusion of SVG drawings in <artwork>.
New Attributes for Existing Elements
o Add "sortRefs", "symRefs", "tocDepth", and "tocInclude" attributes
to <rfc> to cover Processing Instructions (PIs) that were in v2
that are still needed in the grammar. Add "prepTime" to indicate
the time that the XML went through a preparation step. Add
"version" to indicate the version of xml2rfc vocabulary used in
the document. Add "scripts" to indicate which scripts are needed
to render the document. Add "expiresDate" when an Internet-Draft
expires.
o Add "ascii" attributes to <email>, <organization>, <street>,
<city>, <region>, <country>, and . Also add
"asciiFullname", "asciiInitials", and "asciiSurname" to <author>.
This allows an author to specify their information in their native
scripts as the primary entry and still allow the ASCII-equivalent
values to appear in the processed documents.
o Add "anchor" attributes to many block elements to allow them to be
linked with <relref> and <xref>.
o Add the "section", "relative", and "sectionFormat" attributes to
<xref>.
o Add the "numbered" and "removeInRFC" attributes to <section>.
o Add the "removeInRFC" attribute to <note>.
o Add "pn" to <artwork>, <aside>,
, <boilerplate>, - ,
<figure>, <iref>,
- ,
<xi:include> can be used anywhere an XML element could be used (but
not where free text is used). For example, if three Internet-Drafts
are all including a particular paragraph or section verbatim, that
text can be kept either in a file or somewhere on the web and can be
included with <xi:include>. An example of pulling something from the
local disk would be:
<x:include href="file://home/chris/ietf/drafts/commontext.xml"/>
In general, XInclude should be used instead of ENTITY references and
XML Processing Instructions (PIs) that allow external inclusions.
B.2. Anchors and IDs
People writing and reading Internet-Drafts and RFCs often want to
make reference to specific locations in those documents. In the case
of RFC authors, it is common to want to reference another part of
their document, such as "see Section 3.2 of this document." Readers,
on the other hand, want to reference parts of documents that they
didn't write, such as "see Section 3.2 of RFC 6949." The XML
vocabulary in this document attempts to support both sets of people.
Authors can leave anchors in a document that can later be used for
references with the "anchor" attribute. Anchors can be included in
the numerous elements. The author can then refer to that anchor in
the "target" attribute of the <xref> element.
Readers can refer to any element that has an "anchor" attribute by
that attribute. Note, however, that most of the time, elements won't
have anchors. In the common case, the reader wants to refer to an
element that does not have an "anchor" attribute, but that element
has a "pn" attribute.
Processing tools add the "pn" attribute to many elements during
processing. This attribute and its value are automatically generated
by the tool if the attribute is not there; if the attribute is
already there, the tool may replace the value.
B.2.1. Overlapping Values
In the HTML representation of this XML vocabulary, both anchors and
"pn" attributes will be used in the "id" attributes of elements.
Thus, there can be no overlap between the names entered in "anchor"
attributes, in "slugifiedName" attributes, and those that are
generated for the "pn" attributes. Also, there are some values for
the "anchor" values that are reserved for sections, and those
sections can only have those anchor values.
The following rules prevent this overlap:
o "pn" for regular sections always has the format "s-nnn", where
"nnn" is the section number, or the appendix identifier (which
starts with a letter). For example, this would be "s-2.1.3" for
Section 2.1.3 and "s-a" for Appendix A. For the <abstract>
element, it is always "s-abstract". For the <note> element, it is
always "s-note-nnn", where "nnn" is a sequential value. For
sections in the <boilerplate> element, it is always
"s-boilerplate-nnn", where "nnn" is a sequential value.
o "pn" for <references> elements has the format "s-nnn". It is
important to note that "nnn" is a number, not letters, even though
the <references> appear in the back. It is the number that is one
higher than the highest top-level section number in <middle>. If
there are two or more <references>, "nnn" will include a dot as if
the <references> are a subsection of a section that is numbered
one higher than the highest top-level section number in <middle>.
o "pn" for <figure> elements always has the format "f-nnn", where
"nnn" is the figure number. For example, this would be "f-5" for
Figure 5.
o "pn" for <iref> elements always has the format "i-ttt-nnn", where
"ttt" is the slugified item (plus a hyphen and the slugified
subitem if there is a subitem), and "nnn" is the instance of that
item/subitem pair. For example, this would be "i-foo-1" for
"<iref item='foo'>" and "i-foo-bar-1" for "<iref item='foo'
subitem='bar'>".
o "pn" for elements always has the format "t-nnn", where
"nnn" is the table number. For example, this would be "t-5" for
Table 5.
o "pn" for all elements not listed above always has the format
"p-nnn-mmm", where "nnn" is the section number and "mmm" is the
relative position in the section. For example, this would be
"p-2.1.3-7" for the seventh part number in Section 2.1.3.
o "slugifiedName" always has the format "n-ttt", where "ttt" is the
text of the name after slugification. For example, this would be
"n-protocol-overview" for the name "Protocol Overview". The
actual conversions done in slugification will be specified at a
later time.
o Anchors must never overlap with any of the above. The easiest way
to assure that is to not pick an anchor name that starts with a
single letter followed by a hyphen. If an anchor does overlap
with one of the types of names above, the processing tool will
reject the document.
B.3. Attributes Controlled by the Prep Tool
Many elements in the v3 vocabulary have new attributes whose role is
to hold values generated by the prep tool. These attributes can
exist in documents that are input to the prep tool; however, any of
these attributes might be added, removed, or changed by the prep
tool. Thus, it is explicitly unsafe for a document author to include
these attributes and expect that their values will survive processing
by the prep tool.
The attributes that are controlled by the prep tool are:
o The "pn" attribute in any element -- The number for this item
within the section. The numbering is shared with other elements
of a section. The "pn" attribute is added to many block-level
elements inside sections.
o <artwork> originalSrc -- This attribute is filled with the
original value of the "src" attribute if that attribute is removed
by the prep tool.
o <figure> originalSrc -- This attribute is filled with the original
value of the "src" attribute if that attribute is removed by the
prep tool.
o <name> "slugifiedName" attribute -- This attribute is filled with
a "slugified" version of the text in the element. This attribute
can be used in the output formats for elements that have both
names and numbers.
o <relref> "derivedLink" attribute -- This attribute is filled with
the link that is derived from combining the URI from the reference
and the relative part that is either a copy of the "relative"
attribute or a section number derived from the "section"
attribute.
o <rfc> "expiresDate" attribute -- This attribute is filled with the
date that an Internet-Draft expires. The date is in the format
yyyy-mm-dd.
o <rfc> "mode" attribute -- This attribute is filled with a string
that indicates what mode the prep tool was in when it processed
the XML, such as whether it was processing a file to become an
Internet-Draft or an RFC.
o <rfc> "scripts" attribute -- This attribute is filled with a list
of scripts needed to render this document. The list is comma-
separated, with no spaces allowed. The order is unimportant. The
names come from [UAX24]. For example, if the document has Chinese
characters in it, the value might be "Common,Latin,Han".
o <sourcecode> "originalSrc" attribute -- This attribute is filled
with the original value of the "src" attribute if that attribute
is removed by the prep tool.
o <xref> "derivedContent" attribute -- This attribute is filled in
if there is no content in the <xref> element. The value for this
attribute is based on the value in the "displayFormat" attribute.
Examples of how this value is filled can be found in
Section 2.66.1.
In addition, note that the contents of the <boilerplate> element are
controlled by the prep tool.
Appendix C. RELAX NG Schema
The following is the RELAX NG schema for the v3 format.
namespace a = "http://relaxng.org/ns/compatibility/annotations/1.0"
- xml2rfc Version 3 grammar
rfc =
element rfc {
attribute xml:base { text }?,
attribute xml:lang { text }?,
attribute number { text }?,
[ a:defaultValue = "" ] attribute obsoletes { text }?,
[ a:defaultValue = "" ] attribute updates { text }?,
attribute category { text }?,
attribute mode { text }?,
[ a:defaultValue = "false" ]
attribute consensus { "no" | "yes" | "false" | "true" }?,
attribute seriesNo { text }?,
attribute ipr { text }?,
attribute iprExtract { xsd:IDREF }?,
[ a:defaultValue = "IETF" ]
attribute submissionType {
"IETF" | "IAB" | "IRTF" | "independent"
}?,
attribute docName { text }?,
[ a:defaultValue = "false" ]
attribute sortRefs { "true" | "false" }?,
[ a:defaultValue = "true" ]
attribute symRefs { "true" | "false" }?,
[ a:defaultValue = "true" ]
attribute tocInclude { "true" | "false" }?,
[ a:defaultValue = "3" ] attribute tocDepth { text }?,
attribute prepTime { text }?,
[ a:defaultValue = "true" ]
attribute indexInclude { "true" | "false" }?,
attribute version { text }?,
[ a:defaultValue = "Common,Latin" ] attribute scripts { text }?,
attribute expiresDate { text }?,
link*,
front,
middle,
back?
}
link =
element link {
attribute xml:base { text }?,
attribute xml:lang { text }?,
attribute href { text },
attribute rel { text }?
}
front =
element front {
attribute xml:base { text }?,
attribute xml:lang { text }?,
title,
seriesInfo*,
author+,
date?,
area*,
workgroup*,
keyword*,
abstract?,
note*,
boilerplate?
}
title =
element title {
attribute xml:base { text }?,
attribute xml:lang { text }?,
attribute abbrev { text }?,
attribute ascii { text }?,
text
}
author =
element author {
attribute xml:base { text }?,
attribute xml:lang { text }?,
attribute initials { text }?,
attribute asciiInitials { text }?,
attribute surname { text }?,
attribute asciiSurname { text }?,
attribute fullname { text }?,
attribute role { "editor" }?,
attribute asciiFullname { text }?,
organization?,
address?
}
organization =
element organization {
attribute xml:base { text }?,
attribute xml:lang { text }?,
attribute abbrev { text }?,
attribute ascii { text }?,
text
}
address =
element address {
attribute xml:base { text }?,
attribute xml:lang { text }?,
postal?,
phone?,
facsimile?,
email?,
uri?
}
postal =
element postal {
attribute xml:base { text }?,
attribute xml:lang { text }?,
((city | code | country | region | street)* | postalLine+)
}
street =
element street {
attribute xml:base { text }?,
attribute xml:lang { text }?,
attribute ascii { text }?,
text
}
city =
element city {
attribute xml:base { text }?,
attribute xml:lang { text }?,
attribute ascii { text }?,
text
}
region =
element region {
attribute xml:base { text }?,
attribute xml:lang { text }?,
attribute ascii { text }?,
text
}
code =
element code {
attribute xml:base { text }?,
attribute xml:lang { text }?,
attribute ascii { text }?,
text
}
country =
element country {
attribute xml:base { text }?,
attribute xml:lang { text }?,
attribute ascii { text }?,
text
}
postalLine =
element postalLine {
attribute xml:base { text }?,
attribute xml:lang { text }?,
attribute ascii { text }?,
text
}
phone =
element phone {
attribute xml:base { text }?,
attribute xml:lang { text }?,
text
}
facsimile =
element facsimile {
attribute xml:base { text }?,
attribute xml:lang { text }?,
text
}
email =
element email {
attribute xml:base { text }?,
attribute xml:lang { text }?,
attribute ascii { text }?,
text
}
uri =
element uri {
attribute xml:base { text }?,
attribute xml:lang { text }?,
text
}
date =
element date {
attribute xml:base { text }?,
attribute xml:lang { text }?,
attribute day { text }?,
attribute month { text }?,
attribute year { text }?,
empty
}
area =
element area {
attribute xml:base { text }?,
attribute xml:lang { text }?,
text
}
workgroup =
element workgroup {
attribute xml:base { text }?,
attribute xml:lang { text }?,
text
}
keyword =
element keyword {
attribute xml:base { text }?,
attribute xml:lang { text }?,
text
}
abstract =
element abstract {
attribute xml:base { text }?,
attribute xml:lang { text }?,
attribute anchor { xsd:ID }?,
attribute pn { text }?,
(dl | ol | t | ul)+
}
note =
element note {
attribute xml:base { text }?,
attribute xml:lang { text }?,
attribute title { text }?,
attribute pn { text }?,
[ a:defaultValue = "false" ]
attribute removeInRFC { "true" | "false" }?,
name?,
(dl | ol | t | ul)+
}
boilerplate =
element boilerplate {
attribute xml:base { text }?,
attribute xml:lang { text }?,
section+
}
middle =
element middle {
attribute xml:base { text }?,
attribute xml:lang { text }?,
section+
}
section =
element section {
attribute xml:base { text }?,
attribute xml:lang { text }?,
attribute anchor { xsd:ID }?,
attribute pn { text }?,
attribute title { text }?,
[ a:defaultValue = "true" ]
attribute numbered { "true" | "false" }?,
[ a:defaultValue = "default" ]
attribute toc { "include" | "exclude" | "default" }?,
[ a:defaultValue = "false" ]
attribute removeInRFC { "true" | "false" }?,
name?,
(artwork
| aside
| blockquote
| dl
| figure
| iref
| ol
| sourcecode
| t
| table
| texttable
| ul)*,
section*
}
name =
element name {
attribute xml:base { text }?,
attribute xml:lang { text }?,
attribute slugifiedName { text }?,
(text | cref | eref | relref | tt | xref)*
}
t =
element t {
attribute xml:base { text }?,
attribute xml:lang { text }?,
attribute anchor { xsd:ID }?,
attribute pn { text }?,
attribute hangText { text }?,
[ a:defaultValue = "false" ]
attribute keepWithNext { "false" | "true" }?,
[ a:defaultValue = "false" ]
attribute keepWithPrevious { "false" | "true" }?,
(text
| bcp14
| cref
| em
| eref
| iref
| \list
| relref
| spanx
| strong
| sub
| sup
| tt
| vspace
| xref)*
}
aside =
element aside {
attribute xml:base { text }?,
attribute xml:lang { text }?,
attribute anchor { xsd:ID }?,
attribute pn { text }?,
(artwork | dl | figure | iref | \list | ol | t | table | ul)*
}
blockquote =
element blockquote {
attribute xml:base { text }?,
attribute xml:lang { text }?,
attribute anchor { xsd:ID }?,
attribute pn { text }?,
attribute cite { text }?,
attribute quotedFrom { text }?,
((artwork | dl | figure | ol | sourcecode | t | ul)+
| (text
| bcp14
| cref
| em
| eref
| iref
| relref
| strong
| sub
| sup
| tt
| xref)+)
}
\list =
element list {
attribute xml:base { text }?,
attribute xml:lang { text }?,
[ a:defaultValue = "empty" ] attribute style { text }?,
attribute hangIndent { text }?,
attribute counter { text }?,
attribute pn { text }?,
t+
}
ol =
element ol {
attribute xml:base { text }?,
attribute xml:lang { text }?,
attribute anchor { xsd:ID }?,
[ a:defaultValue = "1" ] attribute type { text }?,
[ a:defaultValue = "1" ] attribute start { text }?,
attribute group { text }?,
[ a:defaultValue = "normal" ]
attribute spacing { "normal" | "compact" }?,
attribute pn { text }?,
li+
}
ul =
element ul {
attribute xml:base { text }?,
attribute xml:lang { text }?,
attribute anchor { xsd:ID }?,
[ a:defaultValue = "normal" ]
attribute spacing { "normal" | "compact" }?,
([ a:defaultValue = "false" ]
attribute empty { "false" | "true" },
attribute pn { text }?)?,
li+
}
li =
element li {
attribute xml:base { text }?,
attribute xml:lang { text }?,
attribute anchor { xsd:ID }?,
attribute pn { text }?,
((artwork | dl | figure | ol | sourcecode | t | ul)+
| (text
| bcp14
| cref
| em
| eref
| iref
| relref
| strong
| sub
| sup
| tt
| xref)+)
}
dl =
element dl {
attribute xml:base { text }?,
attribute xml:lang { text }?,
attribute anchor { xsd:ID }?,
[ a:defaultValue = "normal" ]
attribute spacing { "normal" | "compact" }?,
[ a:defaultValue = "true" ]
attribute hanging { "false" | "true" }?,
attribute pn { text }?,
(dt, dd)+
}
dt =
element dt {
attribute xml:base { text }?,
attribute xml:lang { text }?,
attribute anchor { xsd:ID }?,
attribute pn { text }?,
(text
| bcp14
| cref
| em
| eref
| iref
| relref
| strong
| sub
| sup
| tt
| xref)*
}
dd =
element dd {
attribute xml:base { text }?,
attribute xml:lang { text }?,
attribute anchor { xsd:ID }?,
attribute pn { text }?,
((artwork | dl | figure | ol | sourcecode | t | ul)+
| (text
| bcp14
| cref
| em
| eref
| iref
| relref
| strong
| sub
| sup
| tt
| xref)+)
}
xref =
element xref {
attribute xml:base { text }?,
attribute xml:lang { text }?,
attribute target { xsd:IDREF },
[ a:defaultValue = "false" ]
attribute pageno { "true" | "false" }?,
[ a:defaultValue = "default" ]
attribute format { "default" | "title" | "counter" | "none" }?,
attribute derivedContent { text }?,
text
}
relref =
element relref {
attribute xml:base { text }?,
attribute xml:lang { text }?,
attribute target { xsd:IDREF },
[ a:defaultValue = "of" ]
attribute displayFormat { "of" | "comma" | "parens" | "bare" }?,
attribute section { text },
attribute relative { text }?,
attribute derivedLink { text }?,
text
}
eref =
element eref {
attribute xml:base { text }?,
attribute xml:lang { text }?,
attribute target { text },
text
}
iref =
element iref {
attribute xml:base { text }?,
attribute xml:lang { text }?,
attribute item { text },
[ a:defaultValue = "" ] attribute subitem { text }?,
[ a:defaultValue = "false" ]
attribute primary { "true" | "false" }?,
attribute pn { text }?,
empty
}
cref =
element cref {
attribute xml:base { text }?,
attribute xml:lang { text }?,
attribute anchor { xsd:ID }?,
attribute source { text }?,
[ a:defaultValue = "true" ]
attribute display { "true" | "false" }?,
(text | em | eref | relref | strong | sub | sup | tt | xref)*
}
tt =
element tt {
attribute xml:base { text }?,
attribute xml:lang { text }?,
(text
| bcp14
| cref
| em
| eref
| iref
| relref
| strong
| sub
| sup
| xref)*
}
strong =
element strong {
attribute xml:base { text }?,
attribute xml:lang { text }?,
(text
| bcp14
| cref
| em
| eref
| iref
| relref
| sub
| sup
| tt
| xref)*
}
em =
element em {
attribute xml:base { text }?,
attribute xml:lang { text }?,
(text
| bcp14
| cref
| eref
| iref
| relref
| strong
| sub
| sup
| tt
| xref)*
}
sub =
element sub {
attribute xml:base { text }?,
attribute xml:lang { text }?,
(text
| bcp14
| cref
| em
| eref
| iref
| relref
| strong
| tt
| xref)*
}
sup =
element sup {
attribute xml:base { text }?,
attribute xml:lang { text }?,
(text
| bcp14
| cref
| em
| eref
| iref
| relref
| strong
| tt
| xref)*
}
spanx =
element spanx {
attribute xml:base { text }?,
attribute xml:lang { text }?,
[ a:defaultValue = "preserve" ]
attribute xml:space { "default" | "preserve" }?,
[ a:defaultValue = "emph" ] attribute style { text }?,
text
}
vspace =
element vspace {
attribute xml:base { text }?,
attribute xml:lang { text }?,
[ a:defaultValue = "0" ] attribute blankLines { text }?,
empty
}
figure =
element figure {
attribute xml:base { text }?,
attribute xml:lang { text }?,
attribute anchor { xsd:ID }?,
attribute pn { text }?,
[ a:defaultValue = "" ] attribute title { text }?,
[ a:defaultValue = "false" ]
attribute suppress-title { "true" | "false" }?,
attribute src { text }?,
attribute originalSrc { text }?,
[ a:defaultValue = "left" ]
attribute align { "left" | "center" | "right" }?,
[ a:defaultValue = "" ] attribute alt { text }?,
[ a:defaultValue = "" ] attribute width { text }?,
[ a:defaultValue = "" ] attribute height { text }?,
name?,
iref*,
preamble?,
(artwork | sourcecode)+,
postamble?
}
table =
element table {
attribute xml:base { text }?,
attribute xml:lang { text }?,
attribute anchor { xsd:ID }?,
attribute pn { text }?,
name?,
iref*,
thead?,
tbody+,
tfoot?
}
preamble =
element preamble {
attribute xml:base { text }?,
attribute xml:lang { text }?,
(text
| bcp14
| cref
| em
| eref
| iref
| relref
| spanx
| strong
| sub
| sup
| tt
| xref)*
}
artwork =
element artwork {
attribute xml:base { text }?,
attribute xml:lang { text }?,
attribute anchor { xsd:ID }?,
attribute pn { text }?,
attribute xml:space { text }?,
[ a:defaultValue = "" ] attribute name { text }?,
[ a:defaultValue = "" ] attribute type { text }?,
attribute src { text }?,
[ a:defaultValue = "left" ]
attribute align { "left" | "center" | "right" }?,
[ a:defaultValue = "" ] attribute alt { text }?,
[ a:defaultValue = "" ] attribute width { text }?,
[ a:defaultValue = "" ] attribute height { text }?,
attribute originalSrc { text }?,
(text* | svg)
}
- https://www.rfc-editor.org/materials/format/SVG-1.2-RFC.rnc
sourcecode =
element sourcecode {
attribute xml:base { text }?,
attribute xml:lang { text }?,
attribute anchor { xsd:ID }?,
attribute pn { text }?,
[ a:defaultValue = "" ] attribute name { text }?,
[ a:defaultValue = "" ] attribute type { text }?,
attribute src { text }?,
attribute originalSrc { text }?,
text
}
thead =
element thead {
attribute xml:base { text }?,
attribute xml:lang { text }?,
attribute anchor { xsd:ID }?,
tr+
}
tbody =
element tbody {
attribute xml:base { text }?,
attribute xml:lang { text }?,
attribute anchor { xsd:ID }?,
tr+
}
tfoot =
element tfoot {
attribute xml:base { text }?,
attribute xml:lang { text }?,
attribute anchor { xsd:ID }?,
tr+
}
tr =
element tr {
attribute xml:base { text }?,
attribute xml:lang { text }?,
attribute anchor { xsd:ID }?,
(td | th)+
}
td =
element td {
attribute xml:base { text }?,
attribute xml:lang { text }?,
attribute anchor { xsd:ID }?,
[ a:defaultValue = "0" ] attribute colspan { text }?,
[ a:defaultValue = "0" ] attribute rowspan { text }?,
[ a:defaultValue = "left" ]
attribute align { "left" | "center" | "right" }?,
((artwork | dl | figure | ol | sourcecode | t | ul)+
| (text
| bcp14
| br
| cref
| em
| eref
| iref
| relref
| strong
| sub
| sup
| tt
| xref)*)
}
th =
element th {
attribute xml:base { text }?,
attribute xml:lang { text }?,
attribute anchor { xsd:ID }?,
[ a:defaultValue = "0" ] attribute colspan { text }?,
[ a:defaultValue = "0" ] attribute rowspan { text }?,
[ a:defaultValue = "left" ]
attribute align { "left" | "center" | "right" }?,
((artwork | dl | figure | ol | sourcecode | t | ul)+
| (text
| bcp14
| br
| cref
| em
| eref
| iref
| relref
| strong
| sub
| sup
| tt
| xref)*)
}
postamble =
element postamble {
attribute xml:base { text }?,
attribute xml:lang { text }?,
(text | cref | eref | iref | spanx | xref)*
}
texttable =
element texttable {
attribute xml:base { text }?,
attribute xml:lang { text }?,
attribute anchor { xsd:ID }?,
[ a:defaultValue = "" ] attribute title { text }?,
[ 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" }?,
name?,
preamble?,
ttcol+,
c*,
postamble?
}
ttcol =
element ttcol {
attribute xml:base { text }?,
attribute xml:lang { text }?,
attribute width { text }?,
[ a:defaultValue = "left" ]
attribute align { "left" | "center" | "right" }?,
(cref | eref | iref | xref | text)*
}
c =
element c {
attribute xml:base { text }?,
attribute xml:lang { text }?,
(text | cref | eref | iref | spanx | xref)*
}
bcp14 =
element bcp14 {
attribute xml:base { text }?,
attribute xml:lang { text }?,
text
}
br =
element br {
attribute xml:base { text }?,
attribute xml:lang { text }?,
empty
}
back =
element back {
attribute xml:base { text }?,
attribute xml:lang { text }?,
displayreference*,
references*,
section*
}
displayreference =
element displayreference {
attribute xml:base { text }?,
attribute xml:lang { text }?,
attribute target { xsd:IDREF },
attribute to { text }
}
references =
element references {
attribute xml:base { text }?,
attribute xml:lang { text }?,
attribute pn { text }?,
attribute anchor { xsd:ID }?,
attribute title { text }?,
name?,
(reference | referencegroup)*
}
reference =
element reference {
attribute xml:base { text }?,
attribute xml:lang { text }?,
attribute anchor { xsd:ID },
attribute target { text }?,
[ a:defaultValue = "true" ]
attribute quoteTitle { "true" | "false" }?,
front,
(annotation | format | refcontent | seriesInfo)*
}
referencegroup =
element referencegroup {
attribute xml:base { text }?,
attribute xml:lang { text }?,
attribute anchor { xsd:ID },
reference+
}
seriesInfo =
element seriesInfo {
attribute xml:base { text }?,
attribute xml:lang { text }?,
attribute name { text },
attribute value { text },
attribute asciiName { text }?,
attribute asciiValue { text }?,
attribute status { text }?,
[ a:defaultValue = "IETF" ]
attribute stream { "IETF" | "IAB" | "IRTF" | "independent" }?,
empty
}
format =
element format {
attribute xml:base { text }?,
attribute xml:lang { text }?,
attribute target { text }?,
attribute type { text },
attribute octets { text }?,
empty
}
annotation =
element annotation {
attribute xml:base { text }?,
attribute xml:lang { text }?,
(text
| bcp14
| cref
| em
| eref
| iref
| relref
| spanx
| strong
| sub
| sup
| tt
| xref)*
}
refcontent =
element refcontent {
attribute xml:base { text }?,
attribute xml:lang { text }?,
(text | bcp14 | em | strong | sub | sup | tt)*
}
start |= rfc
Appendix D. Schema Differences from v2
The following is a non-normative comparison of the v3 format to the
v2 format. A "-" indicates lines removed from the v2 schema, and a
"+" indicates lines added to the v3 schema.
namespace a =
"http://relaxng.org/ns/compatibility/annotations/1.0"
+ # xml2rfc Version 3 grammar
rfc =
element rfc {
+ attribute xml:base { text }?,
+ attribute xml:lang { text }?,
attribute number { text }?,
[ a:defaultValue = "" ] attribute obsoletes { text }?,
[ a:defaultValue = "" ] attribute updates { text }?,
- attribute category { "std" | "bcp" | "info" | "exp" |
- "historic" }?,
- attribute consensus { "no" | "yes" }?,
+ attribute category { text }?,
+ attribute mode { text }?,
+ [ a:defaultValue = "false" ]
+ attribute consensus { "no" | "yes" | "false" | "true" }?,
attribute seriesNo { text }?,
- attribute ipr {
- "full2026"
- | "noDerivativeWorks2026"
- | "none"
- | "full3667"
- | "noModification3667"
- | "noDerivatives3667"
- | "full3978"
- | "noModification3978"
- | "noDerivatives3978"
- | "trust200811"
- | "noModificationTrust200811"
- | "noDerivativesTrust200811"
- | "trust200902"
- | "noModificationTrust200902"
- | "noDerivativesTrust200902"
- | "pre5378Trust200902"
- }?,
+ attribute ipr { text }?,
attribute iprExtract { xsd:IDREF }?,
[ a:defaultValue = "IETF" ]
attribute submissionType {
"IETF" | "IAB" | "IRTF" | "independent"
}?,
attribute docName { text }?,
- [ a:defaultValue = "en" ] attribute xml:lang { text }?,
+ [ a:defaultValue = "false" ]
+ attribute sortRefs { "true" | "false" }?,
+ [ a:defaultValue = "true" ]
+ attribute symRefs { "true" | "false" }?,
+ [ a:defaultValue = "true" ]
+ attribute tocInclude { "true" | "false" }?,
+ [ a:defaultValue = "3" ] attribute tocDepth { text }?,
+ attribute prepTime { text }?,
+ [ a:defaultValue = "true" ]
+ attribute indexInclude { "true" | "false" }?,
+ attribute version { text }?,
+ [ a:defaultValue = "Common,Latin" ] attribute scripts { text
+ }?,
+ attribute expiresDate { text }?,
+ link*,
front,
middle,
back?
}
+ link =
+ element link {
+ attribute xml:base { text }?,
+ attribute xml:lang { text }?,
+ attribute href { text },
+ attribute rel { text }?
+ }
front =
element front {
- title, author+, date, area*, workgroup*, keyword*, abstract?,
- note*
+ attribute xml:base { text }?,
+ attribute xml:lang { text }?,
+ title,
+ seriesInfo*,
+ author+,
+ date?,
+ area*,
+ workgroup*,
+ keyword*,
+ abstract?,
+ note*,
+ boilerplate?
}
title =
element title {
+ attribute xml:base { text }?,
+ attribute xml:lang { text }?,
attribute abbrev { text }?,
+ attribute ascii { text }?,
text
}
author =
element author {
+ attribute xml:base { text }?,
+ attribute xml:lang { text }?,
attribute initials { text }?,
+ attribute asciiInitials { text }?,
attribute surname { text }?,
+ attribute asciiSurname { text }?,
attribute fullname { text }?,
attribute role { "editor" }?,
+ attribute asciiFullname { text }?,
organization?,
address?
}
organization =
element organization {
+ attribute xml:base { text }?,
+ attribute xml:lang { text }?,
attribute abbrev { text }?,
+ attribute ascii { text }?,
+ text
+ }
+ address =
+ element address {
+ attribute xml:base { text }?,
+ attribute xml:lang { text }?,
+ postal?,
+ phone?,
+ facsimile?,
+ email?,
+ uri?
+ }
+ postal =
+ element postal {
+ attribute xml:base { text }?,
+ attribute xml:lang { text }?,
+ ((city | code | country | region | street)* | postalLine+)
+ }
+ street =
+ element street {
+ attribute xml:base { text }?,
+ attribute xml:lang { text }?,
+ attribute ascii { text }?,
+ text
+ }
+ city =
+ element city {
+ attribute xml:base { text }?,
+ attribute xml:lang { text }?,
+ attribute ascii { text }?,
+ text
+ }
+ region =
+ element region {
+ attribute xml:base { text }?,
+ attribute xml:lang { text }?,
+ attribute ascii { text }?,
+ text
+ }
+ code =
+ element code {
+ attribute xml:base { text }?,
+ attribute xml:lang { text }?,
+ attribute ascii { text }?,
+ text
+ }
+ country =
+ element country {
+ attribute xml:base { text }?,
+ attribute xml:lang { text }?,
+ attribute ascii { text }?,
+ text
+ }
+ postalLine =
+ element postalLine {
+ attribute xml:base { text }?,
+ attribute xml:lang { text }?,
+ attribute ascii { text }?,
+ text
+ }
+ phone =
+ element phone {
+ attribute xml:base { text }?,
+ attribute xml:lang { text }?,
+ text
+ }
+ facsimile =
+ element facsimile {
+ attribute xml:base { text }?,
+ attribute xml:lang { text }?,
+ text
+ }
+ email =
+ element email {
+ attribute xml:base { text }?,
+ attribute xml:lang { text }?,
+ attribute ascii { text }?,
+ text
+ }
+ uri =
+ element uri {
+ attribute xml:base { text }?,
+ attribute xml:lang { text }?,
text
}
- address = element address { postal?, phone?, facsimile?, email?,
- uri? }
- postal = element postal { street+, (city | region | code |
- country)* }
- street = element street { text }
- city = element city { text }
- region = element region { text }
- code = element code { text }
- country = element country { text }
- phone = element phone { text }
- facsimile = element facsimile { text }
- email = element email { text }
- uri = element uri { text }
date =
element date {
+ attribute xml:base { text }?,
+ attribute xml:lang { text }?,
attribute day { text }?,
attribute month { text }?,
attribute year { text }?,
empty
}
- area = element area { text }
- workgroup = element workgroup { text }
- keyword = element keyword { text }
- abstract = element abstract { t+ }
+ area =
+ element area {
+ attribute xml:base { text }?,
+ attribute xml:lang { text }?,
+ text
+ }
+ workgroup =
+ element workgroup {
+ attribute xml:base { text }?,
+ attribute xml:lang { text }?,
+ text
+ }
+ keyword =
+ element keyword {
+ attribute xml:base { text }?,
+ attribute xml:lang { text }?,
+ text
+ }
+ abstract =
+ element abstract {
+ attribute xml:base { text }?,
+ attribute xml:lang { text }?,
+ attribute anchor { xsd:ID }?,
+ attribute pn { text }?,
+ (dl | ol | t | ul)+
+ }
note =
element note {
- attribute title { text },
- t+
+ attribute xml:base { text }?,
+ attribute xml:lang { text }?,
+ attribute title { text }?,
+ attribute pn { text }?,
+ [ a:defaultValue = "false" ]
+ attribute removeInRFC { "true" | "false" }?,
+ name?,
+ (dl | ol | t | ul)+
+ }
+ boilerplate =
+ element boilerplate {
+ attribute xml:base { text }?,
+ attribute xml:lang { text }?,
+ section+
+ }
+ middle =
+ element middle {
+ attribute xml:base { text }?,
+ attribute xml:lang { text }?,
+ section+
}
- middle = element middle { section+ }
section =
element section {
+ attribute xml:base { text }?,
+ attribute xml:lang { text }?,
attribute anchor { xsd:ID }?,
- attribute title { text },
+ attribute pn { text }?,
+ attribute title { text }?,
+ [ a:defaultValue = "true" ]
+ attribute numbered { "true" | "false" }?,
[ a:defaultValue = "default" ]
attribute toc { "include" | "exclude" | "default" }?,
- (t | figure | texttable | iref)*,
+ [ a:defaultValue = "false" ]
+ attribute removeInRFC { "true" | "false" }?,
+ name?,
+ (artwork
+ | aside
+ | blockquote
+ | dl
+ | figure
+ | iref
+ | ol
+ | sourcecode
+ | t
+ | table
+ | texttable
+ | ul)*,
section*
}
+ name =
+ element name {
+ attribute xml:base { text }?,
+ attribute xml:lang { text }?,
+ attribute slugifiedName { text }?,
+ (text | cref | eref | relref | tt | xref)*
+ }
t =
element t {
+ attribute xml:base { text }?,
+ attribute xml:lang { text }?,
attribute anchor { xsd:ID }?,
+ attribute pn { text }?,
attribute hangText { text }?,
+ [ a:defaultValue = "false" ]
+ attribute keepWithNext { "false" | "true" }?,
+ [ a:defaultValue = "false" ]
+ attribute keepWithPrevious { "false" | "true" }?,
(text
- | \list
- | figure
- | xref
+ | bcp14
+ | cref
+ | em
| eref
| iref
- | cref
+ | \list
+ | relref
| spanx
- | vspace)*
+ | strong
+ | sub
+ | sup
+ | tt
+ | vspace
+ | xref)*
+ }
+ aside =
+ element aside {
+ attribute xml:base { text }?,
+ attribute xml:lang { text }?,
+ attribute anchor { xsd:ID }?,
+ attribute pn { text }?,
+ (artwork | dl | figure | iref | \list | ol | t | table | ul)*
+ }
+ blockquote =
+ element blockquote {
+ attribute xml:base { text }?,
+ attribute xml:lang { text }?,
+ attribute anchor { xsd:ID }?,
+ attribute pn { text }?,
+ attribute cite { text }?,
+ attribute quotedFrom { text }?,
+ ((artwork | dl | figure | ol | sourcecode | t | ul)+
+ | (text
+ | bcp14
+ | cref
+ | em
+ | eref
+ | iref
+ | relref
+ | strong
+ | sub
+ | sup
+ | tt
+ | xref)+)
}
\list =
element list {
- attribute style { text }?,
+ attribute xml:base { text }?,
+ attribute xml:lang { text }?,
+ [ a:defaultValue = "empty" ] attribute style { text }?,
attribute hangIndent { text }?,
attribute counter { text }?,
+ attribute pn { text }?,
t+
}
+ ol =
+ element ol {
+ attribute xml:base { text }?,
+ attribute xml:lang { text }?,
+ attribute anchor { xsd:ID }?,
+ [ a:defaultValue = "1" ] attribute type { text }?,
+ [ a:defaultValue = "1" ] attribute start { text }?,
+ attribute group { text }?,
+ [ a:defaultValue = "normal" ]
+ attribute spacing { "normal" | "compact" }?,
+ attribute pn { text }?,
+ li+
+ }
+ ul =
+ element ul {
+ attribute xml:base { text }?,
+ attribute xml:lang { text }?,
+ attribute anchor { xsd:ID }?,
+ [ a:defaultValue = "normal" ]
+ attribute spacing { "normal" | "compact" }?,
+ ([ a:defaultValue = "false" ]
+ attribute empty { "false" | "true" },
+ attribute pn { text }?)?,
+ li+
+ }
+ li =
+ element li {
+ attribute xml:base { text }?,
+ attribute xml:lang { text }?,
+ attribute anchor { xsd:ID }?,
+ attribute pn { text }?,
+ ((artwork | dl | figure | ol | sourcecode | t | ul)+
+ | (text
+ | bcp14
+ | cref
+ | em
+ | eref
+ | iref
+ | relref
+ | strong
+ | sub
+ | sup
+ | tt
+ | xref)+)
+ }
+ dl =
+ element dl {
+ attribute xml:base { text }?,
+ attribute xml:lang { text }?,
+ attribute anchor { xsd:ID }?,
+ [ a:defaultValue = "normal" ]
+ attribute spacing { "normal" | "compact" }?,
+ [ a:defaultValue = "true" ]
+ attribute hanging { "false" | "true" }?,
+ attribute pn { text }?,
+ (dt, dd)+
+ }
+ dt =
+ element dt {
+ attribute xml:base { text }?,
+ attribute xml:lang { text }?,
+ attribute anchor { xsd:ID }?,
+ attribute pn { text }?,
+ (text
+ | bcp14
+ | cref
+ | em
+ | eref
+ | iref
+ | relref
+ | strong
+ | sub
+ | sup
+ | tt
+ | xref)*
+ }
+ dd =
+ element dd {
+ attribute xml:base { text }?,
+ attribute xml:lang { text }?,
+ attribute anchor { xsd:ID }?,
+ attribute pn { text }?,
+ ((artwork | dl | figure | ol | sourcecode | t | ul)+
+ | (text
+ | bcp14
+ | cref
+ | em
+ | eref
+ | iref
+ | relref
+ | strong
+ | sub
+ | sup
+ | tt
+ | xref)+)
+ }
xref =
element xref {
+ attribute xml:base { text }?,
+ attribute xml:lang { text }?,
attribute target { xsd:IDREF },
- [ a:defaultValue = "false" ] attribute pageno { "true" |
- "false" }?,
+ [ a:defaultValue = "false" ]
+ attribute pageno { "true" | "false" }?,
[ a:defaultValue = "default" ]
- attribute format { "counter" | "title" | "none" | "default"
+ attribute format { "default" | "title" | "counter" | "none"
+ }?,
+ attribute derivedContent { text }?,
+ text
+ }
+ relref =
+ element relref {
+ attribute xml:base { text }?,
+ attribute xml:lang { text }?,
+ attribute target { xsd:IDREF },
+ [ a:defaultValue = "of" ]
+ attribute displayFormat { "of" | "comma" | "parens" | "bare"
}?,
+ attribute section { text },
+ attribute relative { text }?,
+ attribute derivedLink { text }?,
text
}
eref =
element eref {
+ attribute xml:base { text }?,
+ attribute xml:lang { text }?,
attribute target { text },
text
}
iref =
element iref {
+ attribute xml:base { text }?,
+ attribute xml:lang { text }?,
attribute item { text },
[ a:defaultValue = "" ] attribute subitem { text }?,
[ a:defaultValue = "false" ]
attribute primary { "true" | "false" }?,
+ attribute pn { text }?,
empty
}
cref =
element cref {
+ attribute xml:base { text }?,
+ attribute xml:lang { text }?,
attribute anchor { xsd:ID }?,
attribute source { text }?,
- text
+ [ a:defaultValue = "true" ]
+ attribute display { "true" | "false" }?,
+ (text | em | eref | relref | strong | sub | sup | tt | xref)*
+ }
+ tt =
+ element tt {
+ attribute xml:base { text }?,
+ attribute xml:lang { text }?,
+ (text
+ | bcp14
+ | cref
+ | em
+ | eref
+ | iref
+ | relref
+ | strong
+ | sub
+ | sup
+ | xref)*
+ }
+ strong =
+ element strong {
+ attribute xml:base { text }?,
+ attribute xml:lang { text }?,
+ (text
+ | bcp14
+ | cref
+ | em
+ | eref
+ | iref
+ | relref
+ | sub
+ | sup
+ | tt
+ | xref)*
+ }
+ em =
+ element em {
+ attribute xml:base { text }?,
+ attribute xml:lang { text }?,
+ (text
+ | bcp14
+ | cref
+ | eref
+ | iref
+ | relref
+ | strong
+ | sub
+ | sup
+ | tt
+ | xref)*
+ }
+ sub =
+ element sub {
+ attribute xml:base { text }?,
+ attribute xml:lang { text }?,
+ (text
+ | bcp14
+ | cref
+ | em
+ | eref
+ | iref
+ | relref
+ | strong
+ | tt
+ | xref)*
+ }
+ sup =
+ element sup {
+ attribute xml:base { text }?,
+ attribute xml:lang { text }?,
+ (text
+ | bcp14
+ | cref
+ | em
+ | eref
+ | iref
+ | relref
+ | strong
+ | tt
+ | xref)*
}
spanx =
element spanx {
+ attribute xml:base { text }?,
+ attribute xml:lang { text }?,
[ a:defaultValue = "preserve" ]
attribute xml:space { "default" | "preserve" }?,
[ a:defaultValue = "emph" ] attribute style { text }?,
text
}
vspace =
element vspace {
+ attribute xml:base { text }?,
+ attribute xml:lang { text }?,
[ a:defaultValue = "0" ] attribute blankLines { text }?,
empty
}
figure =
element figure {
+ attribute xml:base { text }?,
+ attribute xml:lang { text }?,
attribute anchor { xsd:ID }?,
+ attribute pn { text }?,
[ a:defaultValue = "" ] attribute title { text }?,
[ a:defaultValue = "false" ]
attribute suppress-title { "true" | "false" }?,
attribute src { text }?,
+ attribute originalSrc { text }?,
[ a:defaultValue = "left" ]
attribute align { "left" | "center" | "right" }?,
[ a:defaultValue = "" ] attribute alt { text }?,
[ a:defaultValue = "" ] attribute width { text }?,
[ a:defaultValue = "" ] attribute height { text }?,
+ name?,
iref*,
preamble?,
- artwork,
+ (artwork | sourcecode)+,
postamble?
}
+ table =
+ element table {
+ attribute xml:base { text }?,
+ attribute xml:lang { text }?,
+ attribute anchor { xsd:ID }?,
+ attribute pn { text }?,
+ name?,
+ iref*,
+ thead?,
+ tbody+,
+ tfoot?
+ }
preamble =
- element preamble { (text | xref | eref | iref | cref | spanx)* }
+ element preamble {
+ attribute xml:base { text }?,
+ attribute xml:lang { text }?,
+ (text
+ | bcp14
+ | cref
+ | em
+ | eref
+ | iref
+ | relref
+ | spanx
+ | strong
+ | sub
+ | sup
+ | tt
+ | xref)*
+ }
artwork =
element artwork {
- [ a:defaultValue = "preserve" ]
- attribute xml:space { "default" | "preserve" }?,
+ attribute xml:base { text }?,
+ attribute xml:lang { text }?,
+ attribute anchor { xsd:ID }?,
+ attribute pn { text }?,
+ attribute xml:space { text }?,
[ a:defaultValue = "" ] attribute name { text }?,
[ a:defaultValue = "" ] attribute type { text }?,
attribute src { text }?,
[ a:defaultValue = "left" ]
attribute align { "left" | "center" | "right" }?,
[ a:defaultValue = "" ] attribute alt { text }?,
[ a:defaultValue = "" ] attribute width { text }?,
[ a:defaultValue = "" ] attribute height { text }?,
- text*
+ attribute originalSrc { text }?,
+ (text* | svg)
+ }
+ # https://www.rfc-editor.org/materials/format/SVG-1.2-RFC.rnc
+ sourcecode =
+ element sourcecode {
+ attribute xml:base { text }?,
+ attribute xml:lang { text }?,
+ attribute anchor { xsd:ID }?,
+ attribute pn { text }?,
+ [ a:defaultValue = "" ] attribute name { text }?,
+ [ a:defaultValue = "" ] attribute type { text }?,
+ attribute src { text }?,
+ attribute originalSrc { text }?,
+ text
+ }
+ thead =
+ element thead {
+ attribute xml:base { text }?,
+ attribute xml:lang { text }?,
+ attribute anchor { xsd:ID }?,
+ tr+
+ }
+ tbody =
+ element tbody {
+ attribute xml:base { text }?,
+ attribute xml:lang { text }?,
+ attribute anchor { xsd:ID }?,
+ tr+
+ }
+ tfoot =
+ element tfoot {
+ attribute xml:base { text }?,
+ attribute xml:lang { text }?,
+ attribute anchor { xsd:ID }?,
+ tr+
+ }
+ tr =
+ element tr {
+ attribute xml:base { text }?,
+ attribute xml:lang { text }?,
+ attribute anchor { xsd:ID }?,
+ (td | th)+
+ }
+ td =
+ element td {
+ attribute xml:base { text }?,
+ attribute xml:lang { text }?,
+ attribute anchor { xsd:ID }?,
+ [ a:defaultValue = "0" ] attribute colspan { text }?,
+ [ a:defaultValue = "0" ] attribute rowspan { text }?,
+ [ a:defaultValue = "left" ]
+ attribute align { "left" | "center" | "right" }?,
+ ((artwork | dl | figure | ol | sourcecode | t | ul)+
+ | (text
+ | bcp14
+ | br
+ | cref
+ | em
+ | eref
+ | iref
+ | relref
+ | strong
+ | sub
+ | sup
+ | tt
+ | xref)*)
+ }
+ th =
+ element th {
+ attribute xml:base { text }?,
+ attribute xml:lang { text }?,
+ attribute anchor { xsd:ID }?,
+ [ a:defaultValue = "0" ] attribute colspan { text }?,
+ [ a:defaultValue = "0" ] attribute rowspan { text }?,
+ [ a:defaultValue = "left" ]
+ attribute align { "left" | "center" | "right" }?,
+ ((artwork | dl | figure | ol | sourcecode | t | ul)+
+ | (text
+ | bcp14
+ | br
+ | cref
+ | em
+ | eref
+ | iref
+ | relref
+ | strong
+ | sub
+ | sup
+ | tt
+ | xref)*)
}
postamble =
- element postamble { (text | xref | eref | iref | cref | spanx)*
+ element postamble {
+ attribute xml:base { text }?,
+ attribute xml:lang { text }?,
+ (text | cref | eref | iref | spanx | xref)*
}
texttable =
element texttable {
+ attribute xml:base { text }?,
+ attribute xml:lang { text }?,
attribute anchor { xsd:ID }?,
[ a:defaultValue = "" ] attribute title { text }?,
[ 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" }?,
+ name?,
preamble?,
ttcol+,
c*,
postamble?
}
ttcol =
element ttcol {
+ attribute xml:base { text }?,
+ attribute xml:lang { text }?,
attribute width { text }?,
[ a:defaultValue = "left" ]
attribute align { "left" | "center" | "right" }?,
+ (cref | eref | iref | xref | text)*
+ }
+ c =
+ element c {
+ attribute xml:base { text }?,
+ attribute xml:lang { text }?,
+ (text | cref | eref | iref | spanx | xref)*
+ }
+ bcp14 =
+ element bcp14 {
+ attribute xml:base { text }?,
+ attribute xml:lang { text }?,
text
}
- c = element c { (text | xref | eref | iref | cref | spanx)* }
- back = element back { references*, section* }
+ br =
+ element br {
+ attribute xml:base { text }?,
+ attribute xml:lang { text }?,
+ empty
+ }
+ back =
+ element back {
+ attribute xml:base { text }?,
+ attribute xml:lang { text }?,
+ displayreference*,
+ references*,
+ section*
+ }
+ displayreference =
+ element displayreference {
+ attribute xml:base { text }?,
+ attribute xml:lang { text }?,
+ attribute target { xsd:IDREF },
+ attribute to { text }
+ }
references =
element references {
- [ a:defaultValue = "References" ] attribute title { text }?,
- reference+
+ attribute xml:base { text }?,
+ attribute xml:lang { text }?,
+ attribute pn { text }?,
+ attribute anchor { xsd:ID }?,
+ attribute title { text }?,
+ name?,
+ (reference | referencegroup)*
}
reference =
element reference {
+ attribute xml:base { text }?,
+ attribute xml:lang { text }?,
attribute anchor { xsd:ID },
attribute target { text }?,
+ [ a:defaultValue = "true" ]
+ attribute quoteTitle { "true" | "false" }?,
front,
- seriesInfo*,
- format*,
- annotation*
+ (annotation | format | refcontent | seriesInfo)*
+ }
+ referencegroup =
+ element referencegroup {
+ attribute xml:base { text }?,
+ attribute xml:lang { text }?,
+ attribute anchor { xsd:ID },
+ reference+
}
seriesInfo =
element seriesInfo {
+ attribute xml:base { text }?,
+ attribute xml:lang { text }?,
attribute name { text },
attribute value { text },
+ attribute asciiName { text }?,
+ attribute asciiValue { text }?,
+ attribute status { text }?,
+ [ a:defaultValue = "IETF" ]
+ attribute stream { "IETF" | "IAB" | "IRTF" | "independent" }?,
empty
}
format =
element format {
+ attribute xml:base { text }?,
+ attribute xml:lang { text }?,
attribute target { text }?,
attribute type { text },
attribute octets { text }?,
empty
}
annotation =
- element annotation { (text | xref | eref | iref | cref |
- spanx)* }
- start = rfc
+ element annotation {
+ attribute xml:base { text }?,
+ attribute xml:lang { text }?,
+ (text
+ | bcp14
+ | cref
+ | em
+ | eref
+ | iref
+ | relref
+ | spanx
+ | strong
+ | sub
+ | sup
+ | tt
+ | xref)*
+ }
+ refcontent =
+ element refcontent {
+ attribute xml:base { text }?,
+ attribute xml:lang { text }?,
+ (text | bcp14 | em | strong | sub | sup | tt)*
+ }
+ start |= rfc
IAB Members at the Time of Approval
The IAB members at the time this memo was approved were
(in alphabetical order):
Jari Arkko
Ralph Droms
Ted Hardie
Joe Hildebrand
Russ Housley
Lee Howard
Erik Nordmark
Robert Sparks
Andrew Sullivan
Dave Thaler
Martin Thomson
Brian Trammell
Suzanne Woolf
Acknowledgements
Thanks to everybody who reviewed this document and provided feedback
and/or specification text. Thanks especially go to Julian Reschke
for editing RFC7749 and those who provided feedback on that
document.
We also thank Marshall T. Rose for both the original design and the
reference implementation of the "xml2rfc" processor.
Author's Address
Paul Hoffman
ICANN
Email: [email protected]
|
---|