<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE spec PUBLIC "-//W3C//DTD Specification V2.1//EN"
               "../xmlspec-v21/xmlspec.dtd" [
	<!-- ================================================================ -->
	<!ENTITY draft.day "17">
	<!ENTITY draft.month "07">
	<!ENTITY draft.monthname "July">
	<!ENTITY draft.year "2006">
	<!ENTITY iso6.doc.date "&draft.year;-&draft.month;-&draft.day;">
	<!ENTITY basename "http://www.w3.org/2001/tag/doc/versioning">
	<!ENTITY draftname "&basename;-&draft.year;&draft.month;&draft.day;">
]>
<spec w3c-doctype="other">
	<?CVS $Id$?>
	<header>
		<title>[Editorial Draft] Extending and Versioning Languages Part 1</title>
		<w3c-designation>&basename;-&iso6.doc.date;</w3c-designation>
		<w3c-doctype>Draft TAG Finding</w3c-doctype>
		<pubdate>
			<day>&draft.day;</day>
			<month>&draft.monthname;</month>
			<year>&draft.year;</year>
		</pubdate>
		<publoc>
			<loc href="&draftname;.html">&draftname;.html</loc>  ( <loc href="&draftname;.xml">xml</loc> )
		</publoc>
		<latestloc>
			<loc href="http://www.w3.org/2001/tag/doc/versioning">http://www.w3.org/2001/tag/doc/versioning</loc>
		</latestloc>
		<prevlocs>
			 Unapproved Editors Drafts:       <loc href="http://www.w3.org/2001/tag/doc/versioning-20060710.html">http://www.w3.org/2001/tag/doc/versioning-20060710.html</loc>, <loc href="http://www.w3.org/2001/tag/doc/versioning-20031003.html">http://www.w3.org/2001/tag/doc/versioning-20031003.html</loc>
		</prevlocs>
		<authlist>
			<author>
				<name>David Orchard</name>
				<affiliation>BEA Systems, Inc.</affiliation>
				<email href="mailto:David.Orchard@BEA.com">David.Orchard@BEA.com</email>
			</author>
			<author>
				<name>Norman Walsh</name>
				<affiliation>Sun Microsystems, Inc.</affiliation>
				<email href="mailto:Norman.Walsh@Sun.COM">Norman.Walsh@Sun.COM</email>
			</author>
		</authlist>
		<copyright>
			<p>
				<loc href="http://www.w3.org/Consortium/Legal/ipr-notice-20000612#Copyright">Copyright</loc> &#xA9; 2003
<loc href="http://www.w3.org/">W3C</loc>
				<sup>&#xAE;</sup>
(<loc href="http://www.lcs.mit.edu/">MIT</loc>,
<loc href="http://www.inria.fr/">INRIA</loc>,
<loc href="http://www.keio.ac.jp/">Keio</loc>),
All Rights Reserved. W3C
<loc href="http://www.w3.org/Consortium/Legal/ipr-notice-20000612#Legal_Disclaimer">liability</loc>,
<loc href="http://www.w3.org/Consortium/Legal/ipr-notice-20000612#W3C_Trademarks">trademark</loc>,
<loc href="http://www.w3.org/Consortium/Legal/copyright-documents-19990405">document use</loc>, and
<loc href="http://www.w3.org/Consortium/Legal/copyright-software-19980720">software licensing</loc>
rules apply.
</p>
		</copyright>
		<abstract>
			<p>This document provides terminology for discussing language versioning, a number of questions that language designers must answer, and a variety of version identification strategies.  A separate document contains schema language specific discussion.</p>
		</abstract>
		<status>
			<p>This document has been developed for discussion by the
<loc href="/2001/tag/">W3C Technical Architecture Group</loc>. It does
not yet represent the consensus opinion of the TAG.</p>
			<p>Publication of this finding does not imply endorsement by the W3C
Membership. This is a draft document and may be updated, replaced or
obsoleted by other documents at any time.</p>
			<p>
				<loc href="/2001/tag/findings">Additional TAG findings</loc>, both
approved and in draft state, may also be available. The TAG expects to
incorporate this and other findings into a Web Architecture Document
that will be published according to the process of the <loc href="/Consortium/Process-20010719/tr#Recs">W3C Recommendation
Track</loc>.</p>
			<p>Please send comments on this finding to the publicly archived TAG
mailing list <loc href="mailto:www-tag@w3.org">www-tag@w3.org</loc>
(<loc href="http://lists.w3.org/Archives/Public/www-tag/">archive</loc>).</p>
		</status>
		<pubstmt>
			<p>Chicago, Vancouver, Mountain View, et al.: World-Wide Web Consortium,
Draft TAG Finding, 2003.</p>
		</pubstmt>
		<sourcedesc>
			<p>Created in electronic form.</p>
		</sourcedesc>
		<langusage>
			<language id="EN">English</language>
		</langusage>
		<revisiondesc>
			<slist>
				<sitem>2003-07-29: Published draft</sitem>
			</slist>
		</revisiondesc>
	</header>
	<body>
		<div1 id="introduction">
			<head>Introduction</head>
			<p>The inevitable evolution of languages by adding, deleting, or 
changing syntax or semantics is called versioning. Making versioning work in
practice is one of the most difficult problems in computing. Arguably,
the Web rose dramatically in popularity because evolution and
versioning were built into HTML and HTTP. Both systems provide
explicit extensibility points and rules for understanding extensions
that enable their decentralized extension and versioning.</p>
			<p>This finding describes general problems and techniques in evolving systems in compatible and incompatible ways. These
techniques are designed to allow compatible changes with or without
schema propagation. A number of questions, design patterns and rules
are discussed with a focus towards enabling versioning in XML
vocabularies, making use of XML Namespaces and XML Schema constructs.
This includes not only general rules, but also rules for working with
languages that provide an extensible container model, notably
SOAP.</p>
			<div2 id="terminology">
				<head>Terminology</head>
				<!--				<p>Let us consider an example.  Two systems need to exchange name information.  Both systems agree that a name consists of a given and a family.  The vocabulary terms are name, given, family.  In order to identify these terms, a namespace is assigned to the terms, the "namens".  The language takes these 3 terms and specifies the constraints, which are that a name consists of a given and a family.  This constraint can be written in a language such as XML Schema.  The language could consist of terms from other vocabularies, such as Dublin Core or UBL.  These vocabularies each have their own namespaces, illustrating that a language can comprise multiple namespaces.  An instance of the Name Language is a set of 
The language is considered extensible if instance of the name can include terms from other vocabularies that do not comprise the language, again such as Dublin core or UBL.  </p> -->
				<p>The terminology for describing languages, producers, consumers, information, constraints, syntax, evolvability etc. follows.   Let us consider an example.  Two or more systems need to exchange name information.   Names may not be the perfect choice of example because of internationalization reasons, but it resonates strongly with a very large audience.  The Name Language is created to be exchanged.    
					<termdef id="dt-producer" term="producer">A <term>producer</term> is an agent that creates text.  </termdef> Continuing our example, Fred is a producer of Name Language text.
					<termdef id="dt-production" term="production">An <term>Act of Production</term> is the creation of text.</termdef>.  A producer produces text for the intent of conveying information.   When Fred does the actual creation of the text, that is an act of production.  <termdef id="dt-consumer" term="consumer">A <term>consumer</term>
is an agent that consumes text.</termdef>  We will use Barney and Wilma as consumers of text.  
					<termdef id="dt-consumption" term="consumption">An <term>Act of Consumption</term> is the processing of text of a language.</termdef>  Wilma and Barney consume the text separately from each other, each of these being a consumption event.  A consumer is impacted by the instance that it consumes. That is, it interprets that instance and bases future processing, in part, on the information that it believes was present in that instance.  Text can be consumed many times, by many consumers, and have many different impacts.</p>
				<p>
					<termdef id="dt-language" term="language">A <term>Language</term> consists of a set of text, any syntactic constraints on the text, a set of information, any semantic constraints on the information, and the mapping between texts and information.  </termdef>
					<termdef id="text" term="Text">
						<term>Text</term> is a specific, discrete sequence of characters</termdef>.   Given that there are constraints on a language, any particular text may or may not have membership in a language.  Indeed, a particular string of characters may be a member of many languages, and there may be many different strings of characters  that are members of a given language.  The text of the language are the units of exchange.  Documents are texts of a language.  The Name Language consists of text set that have 3 terms and specifies syntactic constraints: that a name consists of a given and a family. <termdef id="constraints" term="constraints">A language has a set of <term>constraints</term> that apply to the set of strings in the language. </termdef> These constraints can be defined in machine processable syntactic constraint languages such as XML Schema, microformats, human readable textual descriptions such as HTML descriptions, or are embodied in software.  Languages may or may not be defined by a schema in any particular schema language.   The constraints on a language determine the strings that qualify for membership in the language.    Vocabulary terms contribute to the set of strings, but they are not the only source of characters to the set of strings in a given language.  The language strings may include characters outside of terms, such as punctuation.  One reason for additional characters is to distinguish or separate terms, such as whitespace and markup.    </p>
				<p>
					<example>
						<head>Name examples.  </head>
						<eg><![CDATA[<name>
  <given>Dave</given>
  <family>Orchard</family>
</name>

name="Dave Orchard" 

<span class="fn">Dave Orchard</span>

urn:nameschem:given:Dave:family:Orchard]]></eg>
					</example>
				</p>
				<p>The set of information in a language almost always has semantics.  In the Name Language, given and family have the semantics of given and family names of people.  The language also has the binding from the items in the information set to the text set.  Any potential act of interpretation, that is any consumption or production, conveys information from text according to the language's binding. The language is designed for acts of interpretation, that being the purpose of languages.  In our example, this mapping is obvious and trivial, but many languages it is not.  Two languages may have the exact same strings but different meanings for them.   In general, the intended meaning of a vocabulary term is scoped by the language in which the term is found.  However, there is some expectation that terms drawn from a given vocabulary will have a consistent meaning across all languages in which they are used.   Confusion often arises when terms have inconsistent meaning across language.  The Name terms might be used in other languages, but it is generally expected that they will still be "the same" in some meaningful sense.</p>
				<p>These terms and their relationships are shown below</p>
				<graphic source="ext-vers-generic-uml-v4.png" alt="Diagram of language terms"/>
				<p>We say that Fred engages in an Act of Production that results a Name Instance with respect to Name Language V1.  The Name Instance is in the set of Name V1 Strings, that is the set of strings in the Name Language V1.  The production of the Name Instance has the intent of conveying Information, which we call Information 1.  This is shown below:</p>
				<graphic source="ext-vers-object-prod-v4.png" alt="Production instance"/>
				<p>We say that Barney engages in an Act of Consumption of a Name Instance with respect to Name Language V1.  The consumption of the Name Instance has the impact of conveying Information 1.  This is shown below:</p>
				<graphic source="ext-vers-object-prod-cons-v4.png" alt="Production and consumption instance"/>
				<p>Versioning is an issue that effects almost all applications
eventually. Whether it's a processor styling
documents in batch to produce PDF files, Web services engaged in
financial transactions, HTML browsers, the language and instances will likely change over time.  The versioning policies for a language, particularly whether the language is mutable or immutable, should be specified by the language owner.   Versioning is closely related to extensibility as extensible languages may allow different versions of instances than those known by the language designer.  Applications may receive versions of a
language that they aren't expecting.  </p>
				<p>If a Name Language V2 exists, with its set of strings and Information set, Wilma may consume the same Name Instance but with respect to the Name Language V2 and have impact of Information 2.  Name Language V2 relates to V1 by relationship r2, which is forwards compatible comparing language V1 to V2 instances, and backwards compatible comparing language V2 to V1 instances.  Similarly, Information 2 - as conveyed by Consumption 2 - relates to Information 1 - as conveyed by Consumption 1 - by relationship r1. </p>
				<graphic source="ext-vers-object-full-v4.png" alt="Production and 2 Consumptions Instance"/>
				<p>Extensibility is a property that enables evolvability of software.
It is perhaps the biggest contributor to loose coupling in systems as
it enables the independent and potentially compatible evolution of
languages. Languages are defined to be <termdef id="dt-extensibile" term="extensibile">
						<term>Extensible</term> if the syntax of a language allows information that is not defined in the current version of the language.</termdef>.  The Name Language is extensible if it can include terms that aren't defined in the language, like a new middle term.  
				</p>
				<p>As languages evolve, it becomes possible to speak of both backwards
and forwards compatibility. We base our definitions of backwards and
forwards compatibility on the <bibref ref="FOLDOC"/> definitions.
There are two aspects of compatibility that are called out:
software compatibility and schema compatibility. While it is often the
case that they are directly related, sometimes they are not.</p>
				<p>
					<termdef id="dt-backwards-compatible" term="backwards compatible">A language change is
<term>backwards compatible</term> if newer processors can process all instances of the old language. </termdef>
Backwards compatibility means that a newer version of a
consumer can be rolled out in a way that does not break existing producers. A
producer can send an older version of a message to a consumer that understands
the new version and still have the message successfully processed. A software example is a word processor at version 5 being able to
read and process version 4 documents. A schema example is a schema at version 5 being able to
validate version 4 documents.  This means that a
producer can send an old version of a message to a consumer that
understands the new version and still have the message successfully
processed.  In the case of Web services, this means that
new Web services consumers, ones designed for the new version, will be
able to process all instances of the old language. </p>
				<p>
					<termdef id="dt-forwards-compatible" term="forwards compatible">A language change is
<term>forwards compatible</term> if older processors can process all instances of the newer language.</termdef>
 Forwards
compatibility means that a newer version of a producer can be deployed in a
way that does not break existing consumers. Of course the older consumer will
not implement any new behavior, but a producer can send a newer version of an
instance and still have the instance successfully processed.  An example is a word processing software at version 4 being able to read and process version 5 documents. 
 A schema example is a schema at version 4 being able to validate version 5 documents.  This means that a producer
can send a newer version of a message to an existing consumer and still
have the message successfully processed.  In the case of Web services,
this means that existing Web service consumers,
designed for a previous version of the language, will be able to
process all instances of the new language.  </p>
				<p>In general, backwards compatibility means that existing
documents can be used by updated consumers, and forwards compatibility
means that newer documents can be used by existing consumers. Another
way of thinking of this is in terms of message exchanges. Backwards
compatibility is where the consumer is updated and forwards
compatibility is where the producer is updated, as shown below:</p>
				<example id="fig-evolution">
					<head>Evolution of Producers and/or Consumers</head>
					<graphic source="vers-v2.gif" alt="Versioning Graphic"/>
				</example>
				<p>In broad terms, backwards compatibility means that newer producers
can continue to use existing services, and forwards compatibility
means that existing producers can use newer services</p>
				<p>One form of compatibility is with respect to the strings, that is whether all the strings in one language are also strings in another language.  Another form of compatibility is with respect to the information conveyed, that is whether the information conveyed by the strings in one language is conveyed by the same strings in another language.  The strings could be compatible but the information conveyed is not compatible.  </p>
				<p>Compatibility is defined for the producer and consumer of an
individual document instance. Most messaging specifications, such as Web Services,
provide inputs and outputs. Using these definitions of
compatibility, a Web service that updates its output message is
considered a newer producer because it is sending a newer version of the message. Conversely, updating the
input message makes the service a newer consumer because it is consuming a newer version of the message.  All systems of inputs and outputs must
consider both when making changes and determining compatibility.   For full compatibility, any output messages changes must be forwards compatible (for the older receivers aka consumers) and any input message changes must be backwards compatible (for the older senders aka producers).</p>
				<p>Compatibility can be defined in terms of the information and syntax sets.  Any document that contains only V1 information set in the V1 syntax will be processable by V2, so V2 is backwards compatible with V1.  Note the constraint that it is the V1 information set items in V1 syntax.  If there was an extension to a language then that language is no longer V1.  The compatibility guarantees are only for V1 and V2, not for other versions.  More formally:</p>
				<p role="principle">Language V2 is backwards compatible with Language V1 if Language V2 Information set > (superset) Language V1 Information set.</p>
				<p>Because V1 syntax set is larger than (superset of) V2 syntax, a V1 processor can process all V2 documents, so we say that V2 is forwards compatible with V1.  More formally:</p>
				<p role="principle">Language V2 is forwards compatible with Language V1 if Language V1 Syntax > (superset) Language V2 Syntax.</p>
				<p>These 2 principles can be combined together into:</p>
				<p role="principle">Language V2 is compatible with Language V1 if Language V1 Syntax > Language V2 Syntax > Language V2 Information Set > Language V1 Information set.</p>
				<p>We have shown that forwards and backwards compatibility is only achievable through extensibility, and the process of compatible versioning is gradually narrowing the extensibility gap between the information set and the syntax set.  The cost of changes that are not backward or forward compatible is
often very high. All the software that uses the language must be
updated to the newer version. The magnitude of that cost is directly
related to whether the system in question is open or closed.</p>
				<p>
					<termdef id="dt-closed-system" term="closed sytem">A <term>closed
system</term> is one in which all of the producers and consumers are
more-or-less tightly connected and under the control of a single
organization.</termdef> Closed systems can often provide integrity
constraints across the entire system. A traditional database is a good
example of a closed system: all of the database schemas are known at
once, all of the tables are known to conform to the appropriate
schema, and all of the elements in the each row are known to be valid
for the schema to which the table conforms.</p>
				<p>From a versioning perspective, it might be practical in a closed
system to say that a new version of a particular language is being
introduced into the system at such and such a time and all of the data
that conforms to the previous version of the schema will be migrated
to the new schema.</p>
				<p>
					<termdef id="dt-open-system" term="open system">An <term>open
system</term> is one in which some producers and consumers are loosely
connected or are not controlled by the same organization. The internet
is a good example of an open system.</termdef>
				</p>
				<p>In an open system, it's simply not practical to handle language
evolution with universal, simultaneous, atomic upgrades to all of the
affected software components. Existing producers and receivers outside the
immediate control of the organization that has publishing a changed
language will continue to use the previous version for some
(possibly long) period of time.</p>
				<p>Finally, it's important to remember that systems evolve
over time and have different requirements at different stages in their
life cycle. During development, when the first version of a language
is under active development, it may be valuable to persue a much more
aggressive, draconian versioning strategy. After a system is in production and
there is an expectation of stability in the language, it may be
necessary to proceed with more caution. Being prepared to move forward
in a backwards and forwards compatible manner is the strongest
argument for worrying about versioning at the very beginning of a project.</p>
			</div2>
			<div2>
				<head>XML Terminology</head>
				<p>There are many different systems for exchanging texts in languages, such as SQL, Java, XML, ECMAScript, C#.  We will briefly describe some key refinements to our lexicon for XML.  An XML language has a vocabulary that may use terms from one or more XML Namespaces (or none), each of which has a namespace name.
  <termdef id="dt-xml-language" term="xmllanguage">An <term>XML language</term> is an identifiable set of vocabulary terms with defined XML syntactic and semantic constraints. </termdef>   By XML language, we mean the set of elements and attributes, or instances, used by a particular application.     The Name Language - consisting of name, given, family terms -  has a namespace for the terms.  We use the prefix "namens" to refer to that namespace.  The Name Language could consist of terms from other vocabularies, such as Dublin Core or UBL.  These terms each have their own namespaces, illustrating that a language can comprise vocabularies from multiple namespaces. An XML Namespace is a convenient container for collecting terms
that are intended to be used together within a language or across languages. It provides a mechanism for creating globally unique names.  </p>
				<p>We shall use the term <termref def="instance">instance</termref> when speaking of sequences of characters (aka text) in XML.    <termdef id="instance" term="instance">An <term>instance</term> is a specific, discrete Text in XML format.</termdef>   Documents are instances of a language.  In XML, they must have a root element.   A name document might have a name element as the root element.   Alternatively, the name vocabulary may be used by a language such as purchase orders.  The purchase order documents may contain name elements.  Thus instances of a language are always part of a document and also may be the entire document.  XML instances (and all other instances of markup languages) consist of markup and content.  In the name example, the given and family elements including the end markers are the markup.  The values between the start and end markers are the content.  An instance has an information model.  There are a variety of data models within and without the W3C, and the one standardized by the W3C is the XML infoset.</p>
				<p>The XML related terms and their relationships are shown below</p>
				<graphic source="ext-vers-xml-uml.png" alt="UML diagram of XML terms"/>
				<p/>
				<p>A stylesheet processor is a
consumer of the XML document that it is processing (the producer isn't
mentioned); in the Web services context the roles of producer and
consumer alternate as messages are passed back and forth.Note that most Web service specifications provide definitions of
inputs and outputs. By our definitions, a Web service
that updates its output schema is considered a new producer. A service
that updates its input schema is a new consumer.  </p>
			</div2>
			<div2 id="whyworry">
				<head>Why Worry About Extensibility and Versioning?</head>
				<p>As documents, or messages, are exchanged between applications, they
are processed. Most applications are designed to discriminate between
valid and invalid inputs. In order to have any sort of
interoperability, a language must be defined or described in some
normative way so that the terms <quote>invalid</quote> and
<quote>valid</quote> have meaning.</p>
				<p>There are a variety of tools that might be employed for this
purpose (DTDs, W3C XML Schema, RELAX NG, Schematron, etc.). These
tools might be augmented with normative prose documentation or even
some application-specific validation logic.  In many cases, the schema language is the only validation logic that is available.</p>
				<p>It is almost unheard of for a single version of a language to be
deployed without requiring some kind of augmentation. Invariably, the
original language designer did not include certain terms and
constraints. In fact, good designers should not try to define all the
possible terms and constraints. This is sometimes called
<quote>boiling the ocean</quote>. Knowing that a language will not be
all things to all people, a language designer can allow parties to
extend instances of the language or the language itself. Typically the
tools will allow the language designer to specify where extensions in
the instance and extensions in the language are allowed. Of note, we
do not call extending an instances of a language
a new version. This limits our discussion of versioning to
changes in a language, not changes to instances.</p>
				<p>Whether you've deployed ten services, or a hundred, or a million,
if you change a language in such a way that all those services will
consider instances of the new language invalid, you've introduced
a versioning problem with real costs.</p>
				<p>Once a language is used outside of its development environment,
there will be some cost associated with changing it: software, user
expectations, and documentation may have to be updated to accomodate the
change. Once a language is used in environments outside of a single
realm of control, any changes made will introduce multiple versions of
the language.</p>
			</div2>
			
			<div2 id="whyversion">
				<head>Why Do Languages Change?</head>
				<p>There are many reasons why a different version of a language may
be needed. A few of them include:</p>
				<olist>
					<item>
						<p>Bugs may need to be fixed. Production use may reveal defects
or oversights that need to be fixed. This may involve changes to components
of the language or changes to the semantics of existing components.

</p>
					</item>
					<item>
						<p>Changing requirements may motivate changes in the schema design.
For example, a callback may be added to a service that performs some processing
so that it is able to notify the caller when processing has completed.
</p>
					</item>
					<item>
						<p>Different flavors of a schema may be desirable. For example, the
XHTML 1.0 Recommendation defines strict, transitional, and frameset
schemas. All three of those schemas purport to define the same namespace,
but they describe very different languages.</p>
						<p>And additional schemas may be defined by other specifications, such
as the XHTML Basic Recommendation.
</p>
					</item>
				</olist>
				<p>Whatever the cause, over time, different versions of the language
exist and designing applications to deal with this change in a
predictable, useful way requires a <emph>versioning</emph>
strategy.</p>
			</div2>
			<div2 id="whyextend">
				<head>Why Extend languages?</head>
				<p>The primary motivation to allow instances of a language to be
extended is to decentralize the task of designing, maintaining,
and implementing extensions. It allows
producers to change the instances without going through a centralized
authority. It means that changes can occur at the producer or consumer
without the language owner approving of them. Consider the effort that
the HTML Working Group put into modularity of HTML. Without some decentralized
process for extension, every single variant of HTML would have to be called
something else <emph>or</emph> the HTML Working Group would have to agree
to include it in the next revision of HTML.</p>
			</div2>
			<div2 id="howchange">
				<head>How Do Languages Change?</head>
				<p>At the most basic level, languages can change in only a few ways:</p>
				<ulist>
					<item>
						<p>
							<emph>Content</emph>: The allowable content can evolve through addition or deletion.  In XML, this becomes</p>
						<ulist>
							<item>
								<p>
									<emph>Elements</emph>New elements can be added, existing elements can
be removed, or the acceptable number of occurences of an element can change.
In addition, the content of an element could change from element only content
to mixed content, or vice versa.</p>
								<p>For elements with simple content, the type or range of values that are
acceptable can change.</p>
							</item>
							<item>
								<p>
									<emph>Attributes</emph>: New attributes can be added, existing attributes
can be removed, or the type or range of values that are acceptable can change.
</p>
							</item>
						</ulist>
					</item>
					<item>
						<p>
							<emph>Semantics</emph>: The meaning of a an existing term
can change.</p>
					</item>
				</ulist>
				<p>Of course, the difference between two versions of a language can
be an arbitrary number of these changes.</p>
				<p>One of the most important aspects of a change is whether or not it is
backwards or forwards compatible. </p>
				<p>Some typical backwards- and forwards-compatible changes:</p>
				<ulist>
					<item>
						<p>adding optional components (elements and/or attributes)</p>
					</item>
					<item>
						<p>adding optional content, for example extending an enumeration</p>
					</item>
				</ulist>
				<p>Some typical forwards-compatible changes:</p>
				<ulist>
					<item>
						<p>Decreasing the maximum allowed number of occurrences of a component but not to less than the minimum</p>
					</item>
					<item>
						<p>Decreasing the allowed range of a component</p>
					</item>
				</ulist>
				<p>Some typical backwards-compatible changes:</p>
				<ulist>
					<item>
						<p>Increasing the maximum allowed number of occurrences of a component</p>
					</item>
					<item>
						<p>Increasing the allowed range of a component</p>
					</item>
				</ulist>
				<p>Some typical incompatible changes:</p>
				<ulist>
					<item>
						<p>changing the meaning or semantics of existing components</p>
					</item>
					<item>
						<p>adding required components</p>
					</item>
					<item>
						<p>removing required components</p>
					</item>
					<item>
						<p>restricting a components content model,
such as changing a choice to a sequence</p>
					</item>
				</ulist>
			</div2>
			<div2 id="vocabkind">
				<head>Kinds of Languages</head>
				<p>Ultimately, there are different kinds of languages. The
versioning approaches and strategies that are appropriate for one kind
of language may not be appropriate for another. Among the various kinds
of vocabulares, we find:</p>
				<ulist>
					<item>
						<p>
							<emph>Just Names</emph>: some languages don't actually identify elements
or attributes, they're just lists of names. Using QNames to identify words
in the WordNet database, for example, or the names of functions and operators
in XPath2 are examples of <quote>just name</quote> languages.
</p>
					</item>
					<item>
						<p>
							<emph>Standalone</emph>: languages designed to be used
more-or-less by themselves, for example XHTML, DocBook, or The TEI.</p>
					</item>
					<item>
						<p>
							<emph>Containers</emph>: languages designed to be used as a
wrapper or framework for some other language or payload, for example
SOAP or WSDL.
</p>
					</item>
					<item>
						<p>
							<emph>Container Extensions</emph>: languages designed to extend
or augment a particular class of container. Specifications that extend SOAP by defining SOAP
header blocks, for example, to provide security, asynchrony or reliable messaging
are examples of container extension languages.
</p>
						<p>There are a couple types of XML extension languages, element extension and attribute extension.

<ulist>
								<item>
									<p>
										<emph>Element Extension</emph>.  Languages that are elements.  SOAP, etc. are element extensions.  </p>
								</item>
								<item>
									<p>
										<emph>Attribute or type Extensions</emph>.  Langages that are types or attributes.  These languages must exist in the context of an element.  Sometimes called "parasite" languages as they require a "host" element.  XLink is an example.</p>
								</item>
							</ulist>
						</p>
					</item>
					<item>
						<p>
							<emph>Mixtures</emph>: languages designed for, or often used for,
encapsulating some semantics inside another language. For example, MathML
might be mixed inside of another language.
</p>
					</item>
				</ulist>
				<p>This is by no means an exhaustive list. Nor are these categories
completely clear cut. MathML can certainly be used standalone, for
example, and languages like SVG are a combination of standalone,
containers, and mixtures.</p>
			</div2>
		</div1>
		<div1 id="questions">
			<head>Language Questions</head>
			<p>Given the definitions of compatibility described above, what questions
must the language designer consider?</p>
			<div2>
				<head>Can 3rd parties extend the language?</head>
				<p>It is rarely desirable to prevent 3rd parties from extending
languages, but it does happen. An example may be a tightly constrained
security environment where distributed authoring is considered a “bug”
rather than a feature.</p>
			</div2>
			<div2>
				<head>Can 3rd parties extend the language in a compatible way?</head>
				<p>If so, a substitution mechanism is required for forwards compatibility.
If an older consumer has no mechanism for dealing with new content, then
forwards-compatible evolution isn't possible. One simple substitution
mechanism is simply ignoring the unrecognized components.</p>
			</div2>
			<div2>
				<head>Can 3rd parties extend the language in an incompatible way?</head>
				<p>If so, and if compatible extensions are also possible, then
it must be possible to identify incompatible changes so that
they can override the substitution mechanism used for extensible
changes.</p>
				<p>In environments where unrecognized components are ignored, a
“must understand” component can be added to identify incompatible
changes.</p>
				<p>If compatible changes are not possible, then incompatible changes
simply become the default. For example, WS-Security mandates that 3rd
parties can only provide incompatible extensions. Unlike most
languages, a security language has unique requirements where the
consequences of ignored data can be severe. WS-Security accomplished
this by specifying that all extensions are required to be understood
and there is no substitution mechanism.</p>
			</div2>
			<div2>
				<head>Can the designer extend the language in a compatible way?</head>
				<p>As with 3rd parties compatible extensions, a substitution mechanism
for the designer’s extensions is required for forwards
compatibility.</p>
			</div2>
			<div2>
				<head>Can the designer
extend the language in an incompatible way?</head>
				<p>In XML, the designer can always
do this by using new namespace names, element names or version
numbers.  In other languages, this may not be possible because there is no mechanism for indicating the incompatible change.</p>
			</div2>
			<div2>
				<head>Is the vocabulary a stand-alone language or an extension of
another vocabulary?</head>
				<p>A part of this question is whether the language depends on another
language. That determines which, if any, facilities are provided for
the containing language and what must be provided by a contained
language.</p>
				<p>SOAP is an example of a container language. The SOAP processing
model applies uniformly to all headers, which may employ
<code>soap:mustUnderstand</code> to identify incompatible changes,
even though the contents of the SOAP headers are languages independent
from SOAP.</p>
			</div2>
			<div2>
				<head>What language form</head>
				<p>Languages can be expressed in text, comma separted values, XML, SGML, binary, source code, and almost any kind of form.  See the Architecture of the World-Wide Web section on data formats for more information - http://www.w3.org/TR/2004/REC-webarch-20041215/#formats.</p>
			</div2>
			<div2>
				<head>What Schema language(s)?</head>
				<p>Choosing a schema language or languages guides the language design
in many ways. Some features, particularly extensibility, must be
anticipated in the first version of a language in order to take
advantage of the features of some schema languages.</p>
				<p>In addition, various features may be incompatible across different
languages. For example, writing a V2 compatible schema in W3C XML
Schema requires special design, which is not required in a schema
language such as RELAX NG. Some of the language design choices
mandated by W3C XML Schema are discussed in other sections of this
Finding.</p>
			</div2>
			<div2>
				<head>Should extensions or versions be expressible in the Schema
language?</head>
				<p>The ability to write a schema for extensions or versions is
directly affected by the schema design and the compatibility
desires.</p>
			</div2>
		</div1>
		<div1 id="decisions">
			<head>Language Decisions</head>
			<p>Upon answering these questions, there are some key
decisions that a language developer makes, whether they are consciously made or
not.</p>
			<div2>
				<head>Schema language design choices or constraints.</head>
				<p>If the language can be extended in a compatible way, then a few
specific schema design choices must be followed.</p>
				<p>Wildcards are used to provide extensibility in XML Schema. If
revisions to the Schema are to support substitution, specific schema
designs must be used in conjunction with the wildcard. The main
choices are: provide wildcards, provide Extension elements, or provide
delimiter elements. Extension and delimiter elements are described in
the new components in existing or new namespaces section.   If
Extension/delimiter elements are not provided, then a compatible V2
Schema cannot be written.</p>
			</div2>
			<div2>
				<head>Substitution Mechanism.</head>
				<p>Forwards compatibility can only be achieved by providing a
substitution mechanism for Version 2 instances or Version 1 extensions
to V1 without knowledge of V2.  A V1 consumer must be able to
transform any instances, such as V1 + extensions, to a V1 instance in
order to process the instance. The “Must Ignore unknown” rule is a
simple substitution mechanism. This rule says that any extensions are
“ignored”. Using it, a V1 + extensions document is transform into a V1
document by ignoring the extensions. Others substitution mechanisms
exist, such as the fallback model in XSLT.</p>
			</div2>
			<div2>
				<head>Component identification</head>
				<p>The identification of components into language versions or
extensions has a variety of general mechanisms related to namespaces.
These are detailed in the Versioning section.</p>
			</div2>
			<div2>
				<head>Identification of incompatible extensions</head>
				<p>The identification of versions is covered by language
identification, but 3rd parties cannot arbitrarily change
versions or change namespaces. They may need a mechanism to indicate
that an extension is an incompatible change. A couple of mechanisms
are a “Must Understand” identifier (such as a flag or list of required
namespaces) or requiring that extensions are in substitution
groups.</p>
			</div2>
		</div1>
		<div1 id="identify">
			<head>Identifying and Extending Languages</head>
			<p>Designing extensibility into languages typically results
in systems that are more loosely coupled.  Extensibility allows authors to
change instances without going through a centralized authority, and may allow
the centralized authority greater opportunities for versioning.  The common
characteristic of a compatible change is the use of extensibility.</p>
			<p>A supreme example of the benefits of extensibility is
HTML.  The first version of HTML was designed for extensibility; it said that
“unknown markup” may be encountered.  An example of this in action is the
addition of the IMG tag by the Mosaic browser team.  </p>
			<p>The first rule introduced in this Finding relating to
extensibility is:</p>
			<p role="practice">
Allow Extensibility rule: Languages SHOULD be designed for
extensibility.</p>
			<p>A fundamental requirement for extensibility is to be able to
determine the language of elements and attributes. XML Namespaces
[<loc href="#xmlns">13</loc>] provide a mechanism for associating a
URI with an XML element or attribute name, thus specifying the
language of the name. This also serves to prevent name collisions.</p>
			<p>HTML did not have the ability to distinguish between the languages
of extensions.  This meant that authors could produce the same element
name but with different interpretations, and software would have no way of
determining which interpretation was applicable.  This is a great part of the
motivation to move from HTML to the XML vocabulary of HTML, XHTML.</p>
			<p>W3C XML Schema [<loc href="#xmlschema">14</loc>] provides a
mechanism called a wildcard, &lt;xs:any&gt;,
for controlling where elements from certain namespaces are allowed.  The
wildcard indicates that elements in specified namespaces are allowed in
instance documents where the wildcard occurs.  This allows extension
in a well-defined manner. A consumer of extended documents can
identify and, depending upon its processing model, safely ignore the extensions
it doesn't understand.</p>
			<p>&lt;xs:any&gt; uses the namespace attribute to control what namespaces
extension elements can come from. The most interesting values for this
attribute are: ##any, which means one can
extend the schema using an element from any possible namespace; ##other, which only allows extension elements from
namespaces other than the target namespace of the schema; and ##targetnamespace, which only allows extension
elements from the target namespace of the schema.</p>
			<p>&lt;xs:any&gt; uses the processContents attribute to control how a XML
parser validates extended elements.   Permissible methods include “lax” - validate
any elements from supported namespaces but ignore all other elements,
“strict”—validate all elements, and “skip”—validate no elements. This Finding
recommends “lax” validation, as it is the most flexible and is the typical
choice for Web services specifications.</p>
			<p>RDF/OWL and RelaxNG are 2 other popular technologies for schema design.  They have different mechanisms for allowing and controlling schema evolution.</p>
		</div1>
		<div1 id="example">
			<head>Example</head>
			<p>Suppose that you have designed a language for handling personal
information consisting of a single “Name” element.
The first version of the Name contains a “given” and a “family” element.
There are a variety of strategies for extensibility and versioning, detailed later.  This example will simply show the "new components in new namespace" strategy.</p>
			<example>
				<head>New components in new namespace(s) schema Version 1</head>
				<eg><![CDATA[<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
      targetNamespace="http://www.example.org/name/1" 
      xmlns:name="http://www.example.org/name/1"> 

  <xs:complexType name="name">
    <xs:sequence>
      <xs:element name="given" type="xs:string"/>
      <xs:element name="family" type="xs:string"/>
      <xs:element name="middle" type="xs:string" minOccurs="0"/>
      <xs:any namespace="##other" processContents="lax" 
              minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
    <xs:anyAttribute/>
  </xs:complexType>
</xs:schema>]]></eg>
			</example>
			<p>The language designer and 3rd parties can now
use different namespaces for their versions.  The language designer makes a variety of choices, particularly the schema language, that affect their strategy for namespaces.  Thus the first rule for namespaces covers all language choices, but is open to extension based upon other design choices.First the rule for namespaces:</p>
			<p role="practice">Allow Extensions in Other Namespace rule: The
extensibility point SHOULD at least allow for extension in other
namespaces.</p>
			<p>The rule for allowing extensibility:</p>
			<p role="practice">Full Extensibility rule: All XML Elements
SHOULD allow for element extensibility after element definitions, and
allow any attributes.</p>
			<p>In general, an extension can be defined by a new
specification that makes a normative reference to the earlier specification and
then defines the new element. No permission should be needed from the authors
of the specification to make such an extension. In fact, the major design
point of XML namespaces is to allow decentralized extensions. The corollary is
that permission is required for extensions in the same namespace. A namespace
has an owner; non-owners changing the meaning of something can be harmful.</p>
			<p>Attribute extensions do not have non-determinism issues
because the attributes are always unordered and the model group for attributes
uses a different mechanism for associating attributes with schema types than
the model group for elements.</p>
		</div1>
		<div1 id="understanding">
			<head>Understanding Extensions</head>
			<p>Ideally, producers should be able to extend existing XML documents
with new elements without consumers having to change existing
implementations. Extensibility is one step towards this goal, but
achieving compatibility also requires a processing model for the
extensions.  The behavior of software when it encounters an extension
should be clear. For this, we introduce the next rule: </p>
			<p role="practice">Provide Processing Model Rule: Languages SHOULD
specify a processing model for dealing with extensions.</p>
			<p>Achieving forwards-compatible evolution requires that the processing model must be a substitution mechanism.  The instance containing the extension, which isn't known by the consumer, must be transformed into an instance which is of a type known by the consumer.  </p>
			<p role="practice">Provide Substitution model: Languages MUST provide a substitution model for forwards-compatible evolution.</p>
			<p> The simplest substitution model that enables compatible
changes is to ignore content that is not understood. This rule is:</p>
			<p role="practice">Must Ignore Rule: Document consumers MUST ignore
any XML attributes or elements in a valid XML document that they do
not recognize.</p>
			<p>This rule does not require that the elements be physically removed;
only ignored for processing purposes. There is a great deal of
historic usage of the Must Ignore rule. HTML 1, 2 and 3.2 follow the
Must Ignore rule as they specify that any unknown start tags or end
tags are mapped to nothing during tokenization. HTTP 1.1 [<loc href="#rfc2616">7</loc>] specifies that a consumer should ignore any
headers it doesn't understand: "Unrecognized header fields SHOULD be
ignored by the recipient and MUST be forwarded by transparent
proxies." The Must Ignore rule for XML was first standardized in the
WebDAV specification RFC 2518 [<loc href="#rfc2518">6</loc>] section
14 and later separately published as the Flexible XML Processing
Profile [<loc href="#fxpp">3</loc>].</p>
			<p>There are two broad types of Must Ignore rules for
dealing with extensions, either ignoring the entire tree or just the unknown
element. The rule for ignoring the entire tree is:</p>
			<p role="practice">Must Ignore All Rule: The Must Ignore
rule applies to unrecognized elements and their descendents in
data-oriented formats.</p>
			<p>For example, if a message is received with unrecognized
elements in a SOAP header block, they must be ignored unless marked as “Must
Understand” (see Rule 10 below). Note that this rule is not broken if the
unrecognized elements are written to a log file. That is, “ignored” doesn’t
mean that unrecognized extensions can’t be processed; only that they can’t be
the grounds for failure to process.</p>
			<p>Other applications may need a different rule as the
application will typically want to retain the content of an unknown element,
perhaps for display purposes. The rule for ignoring the element only is:</p>
			<p role="practice">Must Ignore Container Rule: The Must Ignore rule
applies only to unrecognized elements in presentation-oriented
formats.</p>
			<p>This retains the element descendents in the processing model so
that they can still affect interpretation of the document, such as for
display purposes.</p>
			<p>Ignoring content is a simple solution to the problem of
substitution. In order to achieve a compatible evolution, the newer instances
of a language must be transformable (or substitutable) into older instances. 
Object systems typically call this “polymorphism”, where a new type can behave
as the old type.</p>
			<p>Other substitution models have been successfully
deployed. One such model is a fallback model, where alternate elements are
provided if the consumer does not understand the extension. XSLT 2.0 provides
such a model. Another model is that a transform from the new type to the old
type is made available, either by value or reference.</p>
			<p>As desirable as compatible evolution often is, sometimes
a language may not want to allow it. In this model, a consumer will generate a
fault if it finds a component it doesn’t understand. An example might be a
security specification where a consumer must understand each and every
extension. This suffers from the significant drawback that it does not allow
compatible changes to occur in the language, as any changes require both
consumer and producer to change.</p>
		</div1>
		<div1 id="versioning">
			<head>Versioning</head>
			<p>A language designer decides how new versions of their language, as
well as extensions, are related to previous versions. They decide how
to use namespace names, component names for their language, as well as
possibly introducing versioning-specific components such as version
identifiers and incompatible extension identifiers. When a new version
of a language is required, the author must make a decision about the
namespace name for names in the new language.</p>
			<p>Version identification has traditionally been done with a
decimal separating the major versions from the minor versions, ie “8.1”,
“1.0”. Often the definition of a “major” change is that it is incompatible,
and the definition of a “minor” change is that it is forwards- and/or backwards
- compatible. Usually the first broadly available version starts at “1.0”. A
compatible version change from 1.0 might be identified as “1.1” and an
incompatible change as “2.0”. It should be noted that this is idealistic as
there abundant cases where this system does not hold. New major version
identifiers are often aligned with product releases, or incompatible changes
identified as a “minor” change. A good example of an incompatible changed
identified as a minor change is XML 1.1. XML 1.0 processors cannot process all
XML 1.1 documents because XML 1.1 extended XML 1.0 where XML 1.0 does not allow
such extension.</p>
			<div2 id="strategies">
				<head>Versioning Strategies</head>
				<p>Versioning is a broad and complex issue. Different communities have
different notions about what constitutes a version, what constitutes a
reasonable policy, and what the appropriate behavior is in the face of
deviations from that policy. Historically, it has always proved more
complicated in practice than in theory.</p>
				<p>In broad terms, the approaches to versioning fall into a number of
classes ranging from <quote>none</quote> to a <quote>big bang</quote>:
</p>
				<ulist>
					<item>
						<p>
							<emph>None.</emph> No distinction is made
between versions of the language. Applications are either expected
not to care, or they are expected to cope with any version they
encounter.</p>
					</item>
					<item>
						<p>
							<emph>Compatible.</emph> Designers are expected to limit changes to
those that are either backwards or forwards compatible, or both.</p>
						<ulist>
							<item>
								<p>
									<emph>Backwards compatibility.</emph> Applications
are expected to behave properly if they receive an instance document of the 
<quote>older</quote> version of a language.  Backwards
compatible changes allow applications to behave properly if they receive
an <quote>older</quote> version of the language. </p>
							</item>
							<item>
								<p>
									<emph>Forwards compatibility.</emph> Applications
are expected to behave properly if they receive an instance document of the 
<quote>newer</quote> version of a language. Forwards compatible
changes allow existing applications to behave properly if they receive
a <quote>newer</quote> version of the language.</p>
							</item>
						</ulist>
					</item>
					<item>
						<p>
							<emph>Flavors.</emph> Applications are expected to behave
properly if they receive one of a set of flavors of the document type.
</p>
					</item>
					<item>
						<p>
							<emph>Big bang.</emph> Applications are expected to
abort if they see an unexpected version.</p>
					</item>
				</ulist>
				<p>There's no single approach that's always correct. Different
application domains will choose different approaches. But by the same
token, the approaches that are available depend on other choices,
especially with respect to namespaces. This dependency makes it
imperative to plan for versioning from the start. If you don't plan
for versioning from the start, when you do decide to adopt a plan for
versioning, you may be constrained in the available approaches by decisions that you've already made.</p>
				<p>A language commonly goes through a lifecycle of iterative development followed by deployment followed by deployment of new versions.  The point in the lifecycle will affect the selection of the versioning strategy for the language</p>
				<p>Just as there are a number of approaches, there are a number of
strategies for implementing an approach.  The internet - including MIME, markup languages, and XML languages have succesfully used various strategies, either singly or in combination.  Summaries of strategies and requirements have been produced for earlier technologies and guided XML Namespaces and Schema, such as <bibref ref="Note-extlang"/>.</p>
				<p> For any given
approach, some strategies may be more appropriate than others.  Among
the strategies we find:</p>
				<ulist>
					<item>
						<p>
							<emph>Must Understand.</emph> consumers must understand all of the
elements and attributes received and are expected to abort processing
if they do not. SOAP processors must understand headers that are
explicitly identified to be mandatory.
</p>
					</item>
					<item>
						<p>
							<emph>Must Ignore Unknown.</emph> consumers must ignore elements or
attributes that they do not understand. Sometimes the must understand
and must ignore approaches can be combined for more selective use.
SOAP processors must ignore headers they do not recognize unless the
header explicitly identifies itself as one that must be understood.
</p>
						<p>There are 2 variations of the Must Ignore strategy:</p>
						<ulist>
							<item>
								<p>
									<emph>Must Ignore All</emph> This variation on <emph>must
ignore</emph> requires the consumer to ignore an element or attribute it does not
understand and, in the case of elements, all of the descendents of that element. Most
data applications, such as Web services that use SOAP header blocks or WSDL extensions, adopt this approach to
dealing with unexpected markup. For XML, the Must Ignore all rule was
first standardized in the WebDAV specification RFC 2518 <bibref ref="rfc2518"/> section 14
and later separately published as the <bibref ref="FlexXMLP"/>.
</p>
							</item>
							<item>
								<p>
									<emph>Must Ignore Container.</emph> This variation on <emph>must
ignore</emph> requires the consumer to ignore an element or attribute
that it does not understand, but in the case of elements, to process
the children of that element. The Must Ignore Container practice was
described in <bibref ref="rfc1866"/>
								</p>
							</item>
						</ulist>
					</item>
					<item>
						<p>
							<emph>Explicit Fallback.</emph> A language can provide mechanisms for
explicit fallback if the extension is not supported. <bibref ref="rfc1521"/> provides multipart/alternative for equivalent, and hence fallback, representations of content.  <bibref ref="html40"/> uses this approach in the NOFRAMES element.  In XML, the XML Inclusions specification <bibref ref="Xinclude"/> provides a fallback
element to handle the case where the putatively included resource cannot be
retreived.  There are many variations on where the fallback content can be found.  For example, a schema language could specify that fallback content is found in an instance document, in a schema document, or even in the schema for the schema language.  
</p>
					</item>
					<item>
						<p>
							<emph>Explicit Testing.</emph> A language can provide a mechanism for
explicit testing. The XSLT Specification provides a conditional logic
element and a function to test for the existence of extension functions. This allows
designers of stylesheets to deal with different consumer capabilities in an
explicit fashion.  
</p>
					</item>
				</ulist>
				<p>Languages can choose a mixture of approaches. For example, XSLT provides
both an explicit fallback mechanism for some conditions and explicit testing
for others.  The SOAP specification, another example, specifies Must Ignore as the default strategy and the ability to dynamically mark components as being in the Must Understand strategy.</p>
			</div2>
			<div2 id="problems">
				<head>Why Have a Strategy?</head>
				<p>Different kinds of languages and different versioning strategies expose
different problems. If you don't have a strategy at all, you are effectively
choosing the <quote>no versioning</quote> strategy.</p>
				<p>It's probably obvious that attempting to deploy a system that
provides no versioning mechanism is frought with peril. Putting the
burden of version <quote>discovery</quote> on consumers is probably
impractical in anything except a closed system.</p>
				<p>At the other end of the spectrum is the "big bang" approach which
is also problematic.</p>
				<p>
					<quote>Big bang</quote> is a very coarse-grained approach to
versioning. It establishes a single version identifier, either a version number or namespace name, for an entire
document.</p>
				<p>The semantics of the "big bang" are that applications decide on the
basis of the document version whether or not they know how to process
that document. If the version isn't recognized, the entire document is
rejected.. Typically, when introducing a new version using the
<emph>big bang</emph> approach, all of the software that produces or
consumes the instance documents is updated in a sweeping overhaul in
which the entire system is brought down, the new software deployed and
the system is restarted. This <emph>big bang</emph> approach to versioning is
practical only in circumstances where there is a single controlling
authority, and even in that case, it carries with it all manner of
problems. The process can take a considerable amount of time, leaving
the system out of commission for hours if not days. This can result in
significant losses if the system is a key component of a revenue
generating business process and the cost of coordinating the system
overhaul can also be quite costly as well.</p>
				<p>The "big bang" approach is appropriate when the new version is
radically different from its predecessor. But in many cases, the
changes are incremental and often a consumer could, in practice, cope
with the new version. For example, it might be that there are many
messages that don't use any features of the new version or perhaps it
is appropriate to simply ignore elements that are not recognized.</p>
				<p>For example, consider two services exchanging messages. Imagine that some
future version of the language that they are using defines a new
<quote>priority</quote> element. Because producers and consumers are distributed,
it may happen that an old consumer, one unprepared for a priority element,
encounters a message sent by a newer producer.</p>
				<p>If big bang versioning is used, old systems will reject the new
message. However, if the versioning strategy allowed the old
consumer to simply ignore unrecognized content, it's quite possible
that other components of the system could simply adapt to the previous
behavior. In effect, the old system would ignore the priority element
and its descendents so it would <quote>see</quote> a message that
looks just like the old format it is expecting.</p>
				<p>For the producer, the result would be that the request is fulfilled,
though perhaps in a more or less timely fashion than expected. In many
cases this may be better behavior than receiving an error. In
particular, producers using the new format can be written to cope with
the possibility that they will be speaking to old consumers.</p>
				<p>If the new system needs to make sure that priority is respected,
then it can change the purchase order's name or namespace to indicate
that the new behavior is not considered backwards compatible.</p>
				<p>What is needed is some sort of middle ground solution. An evolving
system should be designed with backwards and forwards compatibility in mind.</p>

				<p>One approach to mitigate against a complete overhaul is to run multiple versions of the system.   One variant is offering both versions of the system, for example by using different URIs for the old and new resources.  The request to one resource gets mapped to the other resource behind the scenes using a proxy or gateway.   This "alternative" approach works when the intermediary can completely handle or generate the new information (for backwards compatibility) or ignore the new information (for forwards compatibility).  For example, adding SSL security to a resource changes the URI but a Web server can typically handle mapping the https: URI to the older http: URI.   If both URIs are maintained, then the addition is a compatible change.  Another example is where new information is required, such as  the priority, and the intermediary can apply a default value to provide the required priority.  However, this too has its costs as multiple versions of the software must be supported and maintained over time and there is the added cost of developing the proxy or gateway between the two environments.  Further, this does not work in scenarios where the intermediary cannot generate the new required content.  For example, if a middle name is required in V2, a middle cannot be generated from just a family and a given name.
</p>
				<p>Having multiple versions naturally leads to identifying versions.  One approach to version identification is to use version numbers, with a goal of using <quote>major
version</quote> changes for incompatible changes and
<quote>minor version</quote> changes for compatible ones.  The version numbers can be contained in the instance documents, in the protocol messages containing in the instance document, or the address for the protocol messages (ie http://example.com/foo/v2).</p>

				<p>Unfortunately, version numbers often wind up looking very similar to
the big bang approach.  In many approaches, each language is given a version identifier, almost always a
number, that's incremented each time the language changes. Although
it's possible to design a system with version numbers that enables
both backward and forward compatibility - for example XSLT - typically
a version change is treated as if that the new language is not backwards
compatible with the old language.</p>
				<p>Some efforts, such as HTTP, try to have the best of both worlds
by allowing for extensibility (in HTTP's case, via headers) as well as
version numbers that explicitly identify when a new version is
backwards compatible with an old version.</p>
				<p>One argument in favor of version numbers is that they allow one to
determine what is a 'new version' and what is an 'old version'. But in
practice this is not necessarily true. For example, RSS has 0.9x, 1.x,
and 2.x versions, all being actively developed in parallel. In effect
the version numbers, even though they appear to be ordered, are simply
opaque identifiers. Using version numbers does not gaurantee that
version 1+x has any particular relationship to version 1.</p>
				<p>The self-describing and extensible nature of XML markup, and the addition of XML
Namespaces, provide a much better framework for developing
languages that can evolve.</p>
			</div2>
		</div1>
		<div1 id="ident">
			<head>Version Identification Strategies</head>
			<p>There are a large variety of version identification designs. They range from many namespaces to only 1 namespace for all versions of a language.  A few
of the most common are listed below and described in more detail
later.</p>
			<olist>
				<item>
					<p>all components in new namespace(s) for each version</p>
					<p>ie
version 1 consists of namespaces a + b, version 1.1 consists of
namespaces c + d; or version 1 consists of namespace a, version 1.1
consists of namespace b.</p>
				</item>
				<item>
					<p>all new components in new namespace(s) for each compatible version</p>
					<p>ie version 1 consists of namespaces a +
b; version 1.1 consists of namespaces a + b + c; version 2.0 consists
of namespaces d + e.</p>
				</item>
				<item>
					<p>all new components in existing or new namespace(s) for each
compatible version</p>
					<p>ie version 1 consists of namespace a, version 1.1
consists of namespace a, version 2 consists of namespace b; or version
1 consists of namespace a, version 1.1 consists of namespace a +
b.</p>
				</item>
				<item>
					<p>all new components in existing or new namespace(s) for each
version and a version identifier</p>
					<p>ie version 1 consists of namespace a
+ b + version attribute “1”, version 2 consists of namespace c + d +
version attribute “2”.</p>
				</item>
				<item>
					<p>all components in existing namespace(s) for each
version (compatible and incompatible) and a version identifier</p>
					<p>ie version 1 consists of namespace a
+ version attribute “1.0”, version 1.1 consists of namespace a +
version attribute “1.1”, version 2.0 consists of namespace a + version attribute "2.0".</p>
				</item>
			</olist>
			<p>Whatever the design chosen, the language designer must
decide the component name, namespace name, and any version identifier for new
and all existing components. The trade-offs between the decisions relate to
the importance of:</p>
			<ulist>
				<item>
					<p>Supporting Compatible evolution.</p>
				</item>
				<item>
					<p>namespaces for identifying compatible components. 
Changing namespace names is typically a very invasive change</p>
				</item>
				<item>
					<p>A complete Schema for the language. We will see how
some designs preclude full Schema description</p>
				</item>
				<item>
					<p>Use of generic XML and namespace only (precluding vocabulary
specific versions) tools.  This itself is a trade-off because some generic XML tools (like XPath) are more difficult to use with multiple namespaces containing the same "thing", like XHTML's P element.</p>
				</item>

			</ulist>
			<p>Elaborating on these designs is illustrative.</p>
			<div2>
				<head>Version
Strategy: all components in new namespace(s) for each version
(#1)</head>
				<p>The following names would be valid:</p>
				<example>
					<head>All components in new namespace(s) instances</head>
					<eg><![CDATA[<name xmlns="http://www.example.org/name/1">
  <given>Dave</given>
  <family>Orchard</family>
</name>

<name xmlns="http://www.example.org/name/2">
  <given>Dave</given>
  <family>Orchard</family>
  <middle>Bryce</middle>
</name>

<name xmlns="http://www.example.org/name/3">
  <given>Dave</given>
  <family>Orchard</family>
  <mid:middle xmlns:mid="http://www.example.org/name/3/mid/1">Bryce</mid:middle>
</name>

<name xmlns="http://www.example.org/name/3">
  <given>Dave</given>
  <family>Orchard</family>
  <middiffdomain:middle xmlns:middiffdomain="http://www.example.com/mid/1">Bryce</middiffdomain:middle>
</name>]]></eg>
				</example>
				<p>The 2<sup>nd</sup> example shows all the components in the same new namespace. The 3rd and 4<sup>th</sup>
example show an additional middle element in 2 different namespace names. The 3rd example comes from a namespace name that is
in the same domain as the name element’s new namespace name.  One reason for 2 namespaces is to modularize the language. The 4<sup>th</sup>
example shows a namespace name from a different domain for the middle. It is
probable that the mid:middle was created by the name author, and the
middiffdomain:middle was created by a 3rd party.</p>
			</div2>
			<div2>
				<head>Version
Strategy: all new components in new namespace(s) for each compatible version
(#2)</head>
				<p>In this strategy, the following names would be valid:</p>
				<example>
					<head>New components in new namespace(s) instances</head>
					<eg><![CDATA[<name xmlns="http://www.example.org/name/1">
  <given>Dave</given>
  <family>Orchard</family>
</name>

<name xmlns="http://www.example.org/name/1">
  <given>Dave</given>
  <family>Orchard</family>
  <mid:middle xmlns:mid="http://www.example.org/name/mid/1">Bryce</mid:middle>
</name>

<name xmlns="http://www.example.org/name/1">
  <given>Dave</given>
  <family>Orchard</family>
  <middiffdomain:middle xmlns:middiffdomain="http://www.example.com/mid/1">Bryce</middiffdomain:middle>
</name>]]></eg>
				</example>
				<p>The 2<sup>nd</sup> and 3<sup>rd</sup>
example show an additional middle element in 2 different namespace names. The
first middle, the 2<sup>nd</sup> example, comes from a namespace name that is
in the same domain as the name element’s namespace name. The 3<sup>rd</sup>
example shows a complete different namespace name for the middle. It is
probable that the mid:middle was created by the name author, and the
middiffdomain:middle was created by a 3rd party.</p>
			</div2>
			<div2>
				<head>Version
Strategy: all new components in new or existing namespace(s) for each compatible version
(#3)</head>
				<p>In this strategy, the following names would be valid:</p>
				<example>
					<head>New components in new or existing namespace(s) instances</head>
					<eg><![CDATA[<name xmlns="http://www.example.org/name/1">
  <given>Dave</given>
  <family>Orchard</family>
</name>

<name xmlns="http://www.example.org/name/1">
  <given>Dave</given>
  <family>Orchard</family>
  <middle>Bryce</middle>
</name>

<name xmlns="http://www.example.org/name/1">
  <given>Dave</given>
  <family>Orchard</family>
  <mid:middle xmlns:mid="http://www.example.org/name/mid/1">Bryce</mid:middle>
</name>

<name xmlns="http://www.example.org/name/1">
  <given>Dave</given>
  <family>Orchard</family>
  <middiffdomain:middle xmlns:middiffdomain="http://www.example.com/mid/1">Bryce</middiffdomain:middle>
</name>]]></eg>
				</example>
				<p>The 2<sup>nd</sup> example shows the use of the optional
middle name in the name namespace. The 3<sup>rd</sup> and 4<sup>th</sup>
example show an additional middle element in 2 different namespace names. The
first middle, the 3rd example, comes from a namespace name that is
in the same domain as the name element’s namespace name. The 4<sup>th</sup>
example shows a complete different namespace name for the middle. It is
probable that the mid:middle was created by the name author, and the
middiffdomain:middle was created by a 3rd party.</p>
			</div2>
			<div2>
				<head>Version Strategy: all new
components in existing or new namespace(s) for each version and a version
identifier(#4)</head>
				<p>Using a version identifier, the name instances would
change to show the version of the name they use, such as:</p>
				<example>
					<head>New components in existing or new namespace(s)
with version identifier instances</head>
					<eg><![CDATA[<name xmlns="http://www.example.org/name/1" version="1.0">
  <given>Dave</given>
  <family>Orchard</family>
</name>

<name xmlns="http://www.example.org/name/1" version="1.1">
  <given>Dave</given>
  <family>Orchard</family>
  <middle>Bryce</middle>
</name>

<name xmlns="http://www.example.org/name/1" version="1.1">
  <given>Dave</given>
  <family>Orchard</family>
  <mid:middle xmlns:mid="http://www.example.org/name/mid/1">Bryce</mid:middle>
</name>

<name xmlns="http://www.example.org/name/1" version="1.0">
  <given>Dave</given>
  <family>Orchard</family>
  <mid:middle xmlns:mid="http://www.example.org/name/mid/1">Bryce</mid:middle>
</name>

<name xmlns="http://www.example.org/name/1" version="2.0">
  <given>Dave</given>
  <family>Orchard</family>
  <mid:middle xmlns:mid="http://www.example.org/name/mid/1">Bryce</mid:middle>
</name>

<name xmlns="http://www.example.org/name/2" version="2.0">
  <given>Dave</given>
  <family>Orchard</family>
  <middle>Bryce</middle>
</name>]]></eg>
				</example>
				<p>The last two examples show that the middle is now a mandatory
part of the name.   This is indicated by just the version number or a new namespace plus version number.</p>
				<p>A significant downside with using version identifiers is that
software that supports both versions of the name must perform special
processing on top of XML and namespaces. For example, many components
“bind” XML types into particular programming language types. Custom
software must process the version attribute before using any of the
“binding” software. In Web services, toolkits often take SOAP body
content, parse it into types and invoke methods on the types. There
are rarely “hooks” for the custom code to intercept processing between
the “SOAP” processing and the “name” processing. Further, if version
attributes are used by any 3rd party extensions—say
mid:middle has a version—then the schema cannot refer to the correct
middle.</p>
</div2>
			<div2>
				<head>Version Strategy: all
components in existing namespace(s) for each version and a version
identifier(#5)</head>
				<p>Using a version identifier, the name instances would
change to show the version of the name they use, such as:</p>
				<example>
					<head>New components in existing namespace(s)
with version identifier instances</head>
					<eg><![CDATA[<name xmlns="http://www.example.org/name/1" version="1.0">
  <given>Dave</given>
  <family>Orchard</family>
</name>

<name xmlns="http://www.example.org/name/1" version="1.1">
  <given>Dave</given>
  <family>Orchard</family>
  <middle>Bryce</middle>
</name>

<name xmlns="http://www.example.org/name/1" version="2.0">
  <given>Dave</given>
  <family>Orchard</family>
  <middle>Bryce</middle>
</name>]]></eg>
				</example>
				<p>The 2<sup>nd</sup> example shows that the middle is an optional part of the name.  The last example shows that the middle is a mandatory
part of the name. </p>
				<p>A downside with using new namespace names is that some tools, like XPath, can be harder to use in the face of new namespace names.  Software that extracts the given and family name based upon the expanded name will often break if a new namespace name is used. </p>

			</div2>
		</div1>
		<div1>
			<head>Indicating Incompatible changes</head>
			<p>Given adoption of the Must Ignore rule, it is often the
case that the creator of an extension or a new version wants to require that
the consumer understand the extension, overriding the Must Ignore rule. The
previous section showed how a version author could use new namespace names,
element names, or version numbers to indicate an incompatible change. An
extension author does not have these mechanisms available for indicating an
incompatible or mandatory extension. A language provider that wants to allow
extension authors to indicate incompatible extension must provide a mechanism
for indicating that consumers must understand the extension.</p>
			<p role="practice">Provide Must Understand Rule: Container languages
SHOULD provide a “Must Understand” model for indicating extensions that override a default Must Ignore Rule.</p>
			<p>This rule and the Must Ignore rule work together to
provide a stable and flexible processing model for extensions.</p>
			<p>Must Understand flag</p>
			<p>Arguably the simplest and most flexible over-ride
technique is a Must Understand flag that
indicates whether the item must be understood. The SOAP [<loc href="#soap11">8</loc>],
WSDL [<loc href="#wsdl11">9</loc>], and WS-Policy [<loc href="#wspolicy">10</loc>]
attributes and values for specifying understand are respectively: soap:mustUnderstand=”1”, wsdl:required=”1”,
wsp:Usage=”wsp:Required”. SOAP is probably
the most common case of a container that provides a Must
Understand model. The default value is 0,
which is effectively the Must Ignore rule.</p>
			<p>A language designer can re-use an existing Must
Understand model by constraining their language to an existing Must Understand
model. A number of Web services specifications have done this by specifying
that the components are SOAP header blocks, which explicitly brings in the SOAP
Must Understand model.</p>
			<p>A language designer can design a Must Understand model
into their language. A Must Understand flag allows the producer to insert
extensions into the container and use the Must Understand attribute to
over-ride the must
Ignore rule. This allows producers to extend instances without
changing the extension element’s parent’s namespace, retaining backwards
compatibility. Obviously the consumer must be extended to handle new extensions,
but there is now a loose coupling between the language’s processing model and
the extension’s processing model. A Must Understand flag is provided below:</p>
			<example>
				<head>New components in new namespace(s)
with Must Understand</head>
				<eg><![CDATA[<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
      targetNamespace="http://www.example.org/name/1" 
      xmlns:name="http://www.example.org/name/1"> 

  <xs:complexType name="name">
    <xs:sequence>
      <xs:element name="given" type="xs:string"/>
      <xs:element name="family" type="xs:string"/>
      <xs:any namespace="##other" processContents="lax" 
            minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
    <xs:attribute ref="name:mustUnderstand"/>
    <xs:anyAttribute/>
  </xs:complexType>

  <xs:attribute name="mustUnderstand" type="xs:boolean"/>
</xs:schema>]]></eg>
			</example>
			<p>An example of an instance of a 3rd party
indicating that a middle component is an incompatible change:</p>
			<example>
				<head>New components in existing or new namespace(s)
instance with Must Understand</head>
				<eg><![CDATA[<name xmlns="http://www.example.org/name/1">
  <given>Dave</given>
  <family>Orchard</family>
  <mid:middle xmlns:mid="http://www.example.org/name/mid/1"
                name:mustUnderstand="true">
      Bryce
  </mid:middle>
</name>]]></eg>
			</example>
			<p>Specification of a Must Understand flag must be treated
carefully as it can be computationally expensive. Typically a processor will
either: perform a scan for Must Understand components to ensure it can process
the entire document, or incrementally process the instance and is prepared to
rollback or undo any processing if an not understood Must Understand is found.</p>
			<p>There are other refinements related to Must Understand. 
One example is providing an element that indicates which extension namespaces
must be understood, which avoids the scan of the instance for Must Understand
flags.</p>
			<p>It is also possible to re-use the SOAP processing model with it's mustUnderstand.  </p>
			<example>
				<head>Using SOAP Must Understand</head>
				<eg><![CDATA[<soap:envelope>
  <soap:body>
    <name xmlns="http://www.example.org/name/1">
    <given>Dave</given>
    <family>Orchard</family>
   </name>
  </soap:body>
</soap:envelope>

<soap:envelope>
  <soap:header>
  <mid:middle xmlns:mid="http://www.example.org/name/mid/1"
                soap:mustUnderstand="true">
      Bryce
  </mid:middle>
  </soap:header>
  <soap:body>
    <name xmlns="http://www.example.org/name/1">
    <given>Dave</given>
    <family>Orchard</family>
   </name>
  </soap:body>
</soap:envelope>]]></eg>
			</example>
			<div2>
				<head>Type changes</head>
				<p>The various schema languages have a variety of defined mechanisms to indicate extensions that are incompatible.  For example, XML Schema provides Type Extension and Substitution Groups.  These mechanisms are described in Part 2.</p>
			</div2>
		</div1>
		<div1>
			<head>Extension versus Versioning</head>
			<p>The usage of namespace names for identifying components
has led to the interesting situation where the distinction between an extension
and a version can be quite blurred, depending upon the language designer’s choices. 
</p>
			<p>One rough way of thinking of these two concepts is that
extension is typically the addition of components over space; that is,
designers other than the language’s creator are adding components. Versioning
is typically the addition of components over time, under the designer’s
explicit control. In either case, a change to the language may be done in a
compatible or an incompatible way. The simple cases of extensions are
compatible decentralized additions and versions are compatible or incompatible
centralized changes are how we typically distinguish the terms. But these
break down depending upon how the language is designed.</p>
			<p>There are a couple of scenarios that illustrate the
ambiguity in these terms. Imagine that version 1.0 of a Name consists of
“First” and “Last” elements. A 3rd party author extends the Name
with a “middle” element in a new namespace which they control.</p>
			<p>In scenario 1, the Name author decides to formally
incorporate the middle name as an optional (and hence compatible) addition to
the name, producing version 1.1 of the Name type. They do this by referring to
the third party’s definition and namespace for middle names. This is typically
considered a new “version” of the Name and would probably result in a new
schema definition. If the Name author re-uses namespace names for compatible
revisions, there will be no difference in an instance document containing
middle that is of Version 1.0 or Version 1.1 type. The instance documents are
the same, and thus the distinction between a “version” and an “extension” is
meaningless for an individual document.</p>
			<p>In scenario 2, the middle author decides that the middle
name is a mandatory part of the Name type. They were provided a mechanism for
indicating an incompatible change and they use it. Now an instance of Name
with the middle is incompatible with version 1.0 of the Name. What “version”
of the Name is this middle, and is the middle an “extension” or a “version”? 
It isn’t 1.0. It’s probably more accurately thought of as a version defined by
the 3rd party. Again, the presence of the “extension” is actually
an incompatible change.</p>
			<p>These two examples—a 3rd party extension
being added into a compatible version and a 3rd party extension
resulting in an incompatible version—show the ability to specify
(in)compatibility has blurred the distinction between these two terms.   </p>
		</div1>
		<div1>
			<head>Conclusion</head>
			<p>This Finding is intended to motivate language designers to plan for versioning and
			extensibility in the languages from the very first version.  It details the downsides of 
			ignoring versioniong.  To help the language designer provide versioning in their language, 
			the finding describes a number of questions, decisions
and rules for using XML, XML Namespaces and schema languages in XML language
construction and extension. The main goal of the set of rules is to allow
language designers to know their options for language design, and ideally make backwards-
and forwards-compatible changes to their languages to achieve loose coupling
between systems.</p>
		</div1>
		<div1>
			<head>References</head>
			<blist>
				<bibl id="FOLDOC" href="http://wombat.doc.ic.ac.uk/foldoc/" key="FOLDOC">
					<titleref>Free Online Dictionary of Computing</titleref>.
</bibl>
				<bibl id="FlexXMLP" href="http://www.upnp.org/download/draft-goland-fxpp-01.txt" key="FlexXMLP">
					<titleref>Flexible XML Processing Profile</titleref>.
</bibl>
				<bibl id="rfc1521" href="http://www.ietf.org/rfc/rfc1521.txt" key="MIME">
					<titleref>RFC 1521, MIME</titleref>.
</bibl>
				<bibl id="rfc1866" href="http://www.ietf.org/rfc/rfc1866.txt" key="HTML 2.0">
					<titleref>RFC 1866, HTML 2.0</titleref>.
</bibl>
				<bibl id="WebDAVXMLIgnorePost" href="http://lists.w3.org/Archives/Public/w3c-dist-auth/1997AprJun/0190.html" key="WebDAV XMLIgnore post">Yaron Goland<titleref>XML Ignore proposed for WebDAV</titleref>
				</bibl>
				<bibl id="rfc2518" href="http://www.ietf.org/rfc/rfc2518.txt" key="WebDAV">
					<titleref>RFC 2518, WebDAV</titleref>
				</bibl>
				<bibl id="html40" href="http://www.w3.org/TR/1998/REC-html40-19980424/" key="HTML 4.0">
					<titleref>HTML 4.0</titleref>.
</bibl>
				<bibl id="TBL-MandExt" href="http://www.w3.org/DesignIssues/Mandatory.html" key="TBL Mandatory Extensions">Berners-Lee.
<titleref>Web Architecture: Mandatory extensions</titleref>.
</bibl>
				<bibl id="TBL-Extensible" href="http://www.w3.org/DesignIssues/Extensible.html" key="TBL Extensible languages">Berners-Lee.
<titleref>Web Architecture: Extensible languages</titleref>.
</bibl>
				<bibl id="TBL-Evolution" href="http://www.w3.org/DesignIssues/Evolution.html" key="TBL Evolution">Berners-Lee.
<titleref>Web Architecture: Evolvability</titleref>.
</bibl>
				<bibl id="Note-extlang" href="http://www.w3.org/TR/1998/NOTE-webarch-extlang-19980210" key="Web Architecture: Extensible Languages">Berners-Lee and Connolly, ed.
<titleref>Web Architecture: Extensible Languages</titleref>
World Wide Web Consortium, 1998.</bibl>
				<bibl id="WD-doctypes" href="http://www.w3.org/MarkUp/WD-doctypes" key="HTML Document types">Connolly, ed.
<titleref>HTML Document dialects</titleref>
World Wide Web Consortium, 1996.</bibl>
				<bibl id="SOAP1-2" href="http://www.w3.org/TR/SOAP/" key="SOAP 1.2">
					<titleref>W3C
Recommendation, SOAP 1.2 Part 1: Messaging Framework</titleref>
				</bibl>
				<bibl id="WSDL1-1" href="http://www.w3.org/TR/WSDL/" key="WSDL 1.1">
					<titleref>W3C Note, WSDL 1.1</titleref>
				</bibl>
				<bibl id="XML1-0" href="http://www.w3.org/TR/REC-xml" key="XML 1.0">
					<titleref>W3C Recommendation, XML 1.0</titleref>
				</bibl>
				<bibl id="Xinclude" href="http://www.w3.org/TR-Xinclude" key="XInclude">
					<titleref>W3C Working Draft, XML Inclusions</titleref>
				</bibl>
				<bibl id="XMLNamespaces" href="http://www.w3.org/TR/REC-xml-names" key="XML Namespaces">
					<titleref>W3C Recommendation, XML Namespaces</titleref>
				</bibl>
				<bibl id="XMLSchemaPart2" href="http://www.w3.org/TR/xmlschema-2" key="XML Schema Part 2">
					<titleref>W3C Recommendation, XML Schema, Part 2</titleref>
				</bibl>
				<bibl id="XMLSchemaWildcardTestCollection" href="http://www.w3.org/XML/2001/05/xmlschema-test-collection/result-ms-wildcards.htm" key="XML Schema Wildcard Test Collection">
					<titleref>XML Schema Wildcard Test collection</titleref>
				</bibl>
				<bibl id="XFrontSchemaBestPractices" href="http://www.xfront.com/BestPracticesHomepage.html" key="XFront Schema Best Practices">
					<titleref>XFront Schema Best Practices</titleref>
				</bibl>
				<bibl id="XMLDOTCOMSchemaDesignPatterns" href="http://www.xml.com/pub/a/2002/07/03/schema_design.html" key="XML.com Schema Design Patterns">Dare Obasanjo<titleref>XML.com Schema design patterns</titleref>
				</bibl>
				<bibl id="daveowritings" href="http://www.pacificspirit.com/Authoring/Compatibility" key="Dave Orchard writings on Extensibility and Versioning">
					<titleref>Dave Orchard writings on extensibility and versioning</titleref>
				</bibl>
			</blist>
		</div1>
		<div1 id="ack">
			<head>Acknowledgements</head>
			<p>The author thanks the many reviewers that have
contributed to the article, particularly David Bau, William Cox, Ed Dumbill,
Chris Ferris, Yaron Goland, Hal Lockhart, Mark Nottingham, Jeffrey Schlimmer,
Cliff Schmidt, and Norman Walsh.</p>
		</div1>
	</body>
</spec>
