<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE spec PUBLIC "-//W3C//DTD Specification V2.2+WSDL//EN" "xmlspec.dtd">
<!--
/*
 * Copyright © 2007 World Wide Web Consortium,
 *
 * (Massachusetts Institute of Technology, European Research Consortium for
 * Informatics and Mathematics, Keio University). All Rights Reserved. This
 * work is distributed under the W3C® Document License [1] in the hope that
 * it will be useful, but WITHOUT ANY WARRANTY; without even the implied
 * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 *
 * [1] http://www.w3.org/Consortium/Legal/2002/copyright-documents-20021231
 */
    -->
<!-- $Id: wsdl20.xml,v 1.1 2007/03/23 18:54:31 plehegar Exp $ -->
<?xml-stylesheet type='text/xsl' href='xmlspec-wsdl.xsl' ?><spec xmlns:z="http://www.w3.org/2004/zml" xmlns:xlink="http://www.w3.org/1999/xlink" w3c-doctype="wd" role="public">

<header>
  <title>Web Services Description Language (WSDL) Version 2.0 Part 1: Core Language</title>
  <w3c-designation>http://www.w3.org/TR/2007/WD-wsdl20-20070326</w3c-designation>
  <w3c-doctype>W3C Working Draft</w3c-doctype>
  <pubdate>
    <day>26</day>
    <month>March</month>
    <year>2007</year>
  </pubdate>
  <publoc>
    <loc href="http://www.w3.org/TR/2007/WD-wsdl20-20070326" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">http://www.w3.org/TR/2007/WD-wsdl20-20070326</loc>
  </publoc>
  <altlocs>
	<loc role="html" href="wsdl20-z.html" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">XHTML with Z Notation</loc>
	<loc role="pdf" href="wsdl20.pdf" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">PDF</loc>
	<loc role="postscript" href="wsdl20.ps" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">PostScript</loc>
	<loc role="xml" href="wsdl20.xml" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">XML</loc>
	<loc role="plain" href="wsdl20.txt" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">plain text</loc>
    </altlocs>
  <prevlocs>
    <loc href="http://www.w3.org/TR/2006/CR-wsdl20-20060327" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">http://www.w3.org/TR/2006/CR-wsdl20-20060327</loc>
  </prevlocs>
  <latestloc>
    <loc href="http://www.w3.org/TR/wsdl20" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">http://www.w3.org/TR/wsdl20</loc>
  </latestloc>
  
  <authlist>
    <author>
      <name>Roberto Chinnici</name>
      <affiliation>Sun Microsystems</affiliation>
    </author>
    <author>
      <name>Jean-Jacques Moreau</name>
      <affiliation>Canon</affiliation>
    </author>
    <author>
      <name>Arthur Ryman</name>
      <affiliation>IBM</affiliation>
    </author>
    <author>
      <name>Sanjiva Weerawarana</name>
      <affiliation>WSO2</affiliation>
    </author>
  </authlist>

    <abstract id="Abstract">
      <p>
	This document describes the Web Services Description Language
	Version 2.0 (WSDL 2.0), an XML language for describing Web
	services. This specification defines the core language which can
	be used to describe Web services based on an abstract model of
	what the service offers.
	It also defines the conformance criteria for documents in this language.
      </p>
    </abstract>    
    
<status id="Status">

  <p>
    <emph>This section describes the status of this document at the time
    of its publication. Other documents may supersede this document. A
    list of current W3C publications and the latest revision of this
    technical report can be found in the <loc href="http://www.w3.org/TR/" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">W3C technical reports index</loc> at
    http://www.w3.org/TR/.</emph>
  </p>

   <p>
      This is a <loc href="http://www.w3.org/2005/10/Process-20051014/tr.html#last-call" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">W3C
      Last Call Working</loc> of Web Services Description Language (WSDL) Version 2.0 Part 1: Core Language for review by W3C
      Members and other interested parties. It has been produced by
      the <loc href="http://www.w3.org/2002/ws/desc/" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">Web Services
      Description Working Group</loc>, which is part of the <loc href="http://www.w3.org/2002/ws/Activity" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">W3C Web Services
      Activity</loc>. This document is published to give an
      opportunity to the community to review the new namespace for
      WSDL 2.0. The Working Group plans to request to move to W3C
      Proposed Recommendation shortly after the end of the Last Call
      period.
   </p>
  
  <p>As a result of implementer and community feedback the Working
  Group made a number of changes since the <loc href="http://www.w3.org/TR/2006/CR-wsdl20-20060327/" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">Candidate
  Recommendation publication</loc>.  These changes include:</p>

  <ulist>
    <item><p>The namespace of the language specified in the document, and identifiers within it, have changed to a shorter, undated form.</p></item>
    <item><p>Numerous consistency and editorial improvements.</p></item>
    <item><p>Improved the granularity and orthogonality of test assertions within the document, and between the assertions and the normative schema, by variously adding, removing and factoring assertion markup.</p></item>
    <item><p>Clarifications on the visibility of XML Schema element declarations and type definitions from WSDL, including the built-in primitive XML Schema datatypes.</p></item>
    <item><p>Clarified how the component model is affected when an optional extension with required properties is engaged.</p></item>
    <item><p>Described the application/wsdl+xml media type fragment syntax as XPointers; defined a canonical form.</p></item>
    <item><p>Added constraints on the appearance of wsdl:input, wsdl:output, wsdl:infault, and wsdl:outfault elements for a particular MEP.</p></item>
    <item><p>Added content model controls for faults: #none, #any, #other.</p></item>
    <item><p>Removed wsdl:feature and wsdl:property</p></item>
  </ulist>

  <p>Individuals are invited to <loc href="http://www.w3.org/2005/10/Process-20051014/tr.html#last-call" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">send
    feedback</loc> on this document to the public <loc href="mailto:public-ws-desc-comments@w3.org" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">public-ws-desc-comments@w3.org</loc>
    mailing list (<loc href="http://lists.w3.org/Archives/Public/public-ws-desc-comments/" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">public
    archive</loc>) through 15 April 2007.
    </p>
   <p>
     The Working Group releases a test suite along with an <loc href="http://www.w3.org/2002/ws/desc/5/impl-report/" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">implementation
     report</loc>.
   </p>

    <p>
      Issues about this document are recorded in the <loc href="http://www.w3.org/Bugs/Public/buglist.cgi?product=WSDL" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">issues list</loc> maintained by the Working
      Group. A <loc href="wsdl20-diff.html" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">diff-marked
      version against the previous version of this document</loc> is
      available.
    </p>


    <!-- Boilerplate -->

    <p>
      Publication as a Working Draft 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. It is inappropriate to cite this document as other than
      work in progress.
    </p>

    <p>
      This document is governed by the <loc href="http://www.w3.org/TR/2002/NOTE-patent-practice-20020124" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">24
      January 2002 CPP</loc> as amended by the <loc href="http://www.w3.org/2004/02/05-pp-transition" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">W3C Patent
      Policy Transition Procedure</loc>. W3C maintains a <loc href="http://www.w3.org/2002/ws/desc/2/04/24-IPR-statements.html" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">public
      list of any patent disclosures</loc> made in connection with the
      deliverables of the group; that page also includes instructions
      for disclosing a patent. An individual who has actual knowledge
      of a patent which the individual believes contains <loc href="http://www.w3.org/Consortium/Patent-Policy-20040205/#def-essential" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">Essential
      Claim(s)</loc> must disclose the information in accordance with
      <loc href="http://www.w3.org/Consortium/Patent-Policy-20040205/#sec-Disclosure" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">section
      6 of the W3C Patent Policy</loc>.
    </p>

</status>


  <langusage>
    <language id="en">English</language>
  </langusage>
  <revisiondesc>
    <p>Last Modified: $Date: 2007/03/23 18:54:31 $</p>
  </revisiondesc>
</header>

<!-- ******************************************************************* -->

<body xml:space="preserve">

<div1 id="intro">
<head>Introduction</head>

<p>Web Services Description Language Version 2.0 (WSDL 2.0) provides a model and an
XML format for describing Web services. WSDL 2.0 enables one to separate
the description of the abstract functionality offered by a service
from concrete details of a service description such as “how” and
“where” that functionality is offered.</p>

<p>This specification defines a language for describing the abstract
functionality of a service as well as a framework for describing the
concrete details of a service description. 
It also defines the conformance criteria for documents in this language.</p>

<p>The companion specification, <emph>Web Services Description Language (WSDL) Version 2.0 Part 2: Adjuncts</emph> <bibref ref="WSDL-PART2"/>
describes 
extensions for message exchange patterns, operation safety,
operation styles and binding extensions (for SOAP <bibref ref="SOAP12-PART1"/> and HTTP <bibref ref="RFC2616"/>). </p>

<div2 id="intro_ws">
<head>Web Service</head>

<p>
WSDL 2.0 describes a Web service in two fundamental stages: one abstract
and one concrete. Within each stage, the description uses a number of
constructs to promote reusability of the description and to separate
independent design concerns.
</p>

<p>
At an abstract level, WSDL 2.0 describes a Web service in terms of the
messages it sends and receives; messages are described independent of
a specific wire format using a type system, typically XML Schema.
</p>

<p>
An <emph>operation</emph> associates a message exchange pattern with one or
more messages. A <emph>message exchange pattern</emph> identifies the sequence and
cardinality of messages sent and/or received as well as who they are
logically sent to and/or received from. An <emph>interface</emph>
groups together operations without any commitment to transport or wire
format.
</p>

<p>
At a concrete level, a <emph>binding</emph> specifies transport and
wire format details for one or more interfaces. An
<emph>endpoint</emph> associates a network address with a binding. And
finally, a <emph>service</emph> groups together endpoints that
implement a common interface.
</p>

</div2>

<!-- +++++++++ -->

<div2 id="markup">
<head>Document Conformance</head>

  <p>An <emph>element information item</emph> (as defined in <bibref ref="XMLInfoSet"/>)
  whose namespace name is <attval>http://www.w3.org/ns/wsdl</attval> and
  whose local part is <el>description</el> conforms to this
  specification if it is valid according to the XML Schema for that
  element as defined by this specification (<loc href="http://www.w3.org/2007/03/wsdl/wsdl20.xsd" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">http://www.w3.org/2007/03/wsdl/wsdl20.xsd</loc>) and
  additionally adheres to all the constraints contained in this
  specification family and conforms to the specifications of any
  extensions contained in it. Such a conformant <emph>element information item</emph> constitutes
  a <emph>WSDL 2.0 document</emph>.</p>

  <p>The definition of the WSDL 2.0 language is based on the XML Information
  Set <bibref ref="XMLInfoSet"/> but also imposes many semantic constraints
  over and above structural conformance to this XML Infoset. In order to precisely
  describe these  constraints, and as an aid in precisely defining the meaning
  of each WSDL 2.0 document, the WSDL 2.0 specification defines a component
  model <specref ref="component_model"/> as an additional layer of abstraction
  above the XML Infoset.
  Constraints and  meaning are defined in terms of this component model,
  and the definition of each component includes a mapping that specifies
  how values in the  component model are derived from corresponding items
  in the XML Infoset.</p>

   <p>
  	An XML 1.0 document that is valid with respect to the WSDL 2.0 XML
  	Schema and that maps to a valid WSDL 2.0 Component Model is
  	conformant to the WSDL 2.0 specification.
  </p>

</div2>

<!-- +++++++++ -->

<div2 id="meaning">
<head>The Meaning of a Service Description</head>

<p>A WSDL 2.0 service description indicates how potential clients are
intended to interact with the described service. It represents an
assertion that the described service fully implements and conforms to
what the WSDL 2.0 document describes. For example, as further
explained in section <specref ref="mandatoryext"/>,
if the WSDL 2.0 document specifies a particular
optional extension, the functionality implied by that extension is only
optional to the client. It must be supported by the Web service.</p>

<p>A WSDL 2.0 interface describes potential interactions with a Web service, not
required interactions. The declaration of an operation in a WSDL 2.0
interface is not an assertion that the interaction described by the
operation must occur. Rather it is an assertion that if such an
interaction is (somehow) initiated, then the declared operation
describes how that interaction is intended to occur.</p>

</div2>

<!-- +++++++++ -->

<div2 id="notation">
<head>Notational Conventions</head>

<p>All parts of this specification are normative, with the EXCEPTION
of notes, pseudo-schemas, examples, and sections explicitly marked as
“Non-Normative”.</p>

<div3 id="rfc2119keywords">
<head>RFC 2119 Keywords</head>

<p>The keywords “MUST”, “MUST NOT”,  “REQUIRED”, “SHALL”, “SHALL NOT”,
   “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “MAY”, and “OPTIONAL” in
   this document are to be interpreted as described in RFC 2119
   <bibref ref="RFC2119"/>.</p>

</div3>

<div3 id="rfc3986namespaces">
<head>RFC 3986 Namespaces</head>

<p>Namespace names of the general form:</p>
<ulist>
   <item><p><attval>http://example.org/...</attval> and</p></item>
   <item><p><attval>http://example.com/...</attval></p></item>
</ulist>
<p>represent application or
   context-dependent URIs <bibref ref="RFC3986"/>.</p>
   
</div3>

<div3 id="xmlSchemaAnyURI">
<head>XML Schema anyURI</head>

<p>This specification uses the XML Schema type <att>xs:anyURI</att>
(see <bibref ref="XMLSchemaP2"/>). It is defined so that <att>xs:anyURI</att> values
are essentially IRIs (see <bibref ref="RFC3987"/>). The conversion from
<att>xs:anyURI</att> values to an actual URI is via an escaping procedure defined by
(see <bibref ref="XLink"/>), which is identical in most respects to IRI Section 3.1
(see <bibref ref="RFC3987"/>).</p>

<p>For interoperability, WSDL authors are advised to avoid the US-ASCII characters: "&lt;", "&gt;", '"', space,
"{", "}", "|", "\", "^", and "`", which are allowed by the <att>xs:anyURI</att> type,
but disallowed in IRIs.</p>

</div3>

<div3 id="nsprefixes">
<head>Prefixes and Namespaces Used in This Specification</head>
        
<p>This specification uses predefined namespace prefixes throughout;
they are given in the following list. Note that the choice of any
namespace prefix is arbitrary and not semantically significant (see
<bibref ref="XMLNS"/>).</p>
   
   <glist>
     <gitem>
      <label>wsdl</label>
      <def>
	<p>
      	<attval>http://www.w3.org/ns/wsdl</attval>
	</p>
      	<p>Defined by this specification.</p>
      </def>
     </gitem>
     <gitem>
      <label>wsdli</label>
      <def>
	<p><attval>http://www.w3.org/ns/wsdl-instance</attval></p>
      	<p>
      	Defined by this specification <specref ref="wsdlLocation-aii"/>.
        </p>
      </def>
     </gitem>

     <gitem>
      <label>wsdlx</label>
      <def>
	<p><attval>http://www.w3.org/ns/wsdl-extensions</attval></p>
      	<p>
      	Defined by this specification <specref ref="wsdlx-references"/>.
        </p>
      </def>
     </gitem>

     <gitem>
     
      <label>wrpc</label>
      <def>
      	<p><attval>http://www.w3.org/ns/wsdl/rpc</attval></p>
      	<p>
      	Defined by WSDL 2.0: Adjuncts <bibref ref="WSDL-PART2"/>.
        </p>
      </def>
     </gitem>
     <gitem>
      <label>wsoap</label>
      <def>
	<p>
      	<attval>http://www.w3.org/ns/wsdl/soap</attval>
	</p>
      	<p>
      	Defined by WSDL 2.0: Adjuncts <bibref ref="WSDL-PART2"/>.
        </p>
      </def>
     </gitem>
     <gitem>
      <label>whttp</label>
      <def>
	<p>
      	<attval>http://www.w3.org/ns/wsdl/http</attval>
	</p>
      	<p>
      	Defined by WSDL 2.0: Adjuncts <bibref ref="WSDL-PART2"/>.
        </p>
      </def>
     </gitem>
     <gitem>
      <label>xs</label>
      <def>
	<p><attval>http://www.w3.org/2001/XMLSchema</attval></p>
      	<p>
      		Defined in the W3C XML Schema
          specification <bibref ref="XMLSchemaP1"/>, <bibref ref="XMLSchemaP2"/>.
         </p>
       </def>
     </gitem>
     <gitem>
      <label>xsi</label>
      <def>
	<p>
      	<attval>http://www.w3.org/2001/XMLSchema-instance</attval>
	</p>
      	<p>
      		Defined in the W3C XML Schema
          specification <bibref ref="XMLSchemaP1"/>, <bibref ref="XMLSchemaP2"/>.
         </p>
      </def>
     </gitem>
    </glist>

</div3>

<div3 id="terminology">
  <head>Terms Used in This Specification</head>
  
  <p>This section describes the terms and concepts introduced
  in Part 1 of the WSDL Version 2.0 specification (this document).</p>

  <glist>
    <gitem>
      <label>Actual Value</label> <def><p>As in <bibref ref="XMLSchemaP1"/>,
  the expression "actual value" is used to refer to the member of
  the value space of the simple type definition associated
  with an attribute information item which corresponds to
  its normalized value. This will often be a string, but may also be
  an integer, a boolean, an IRI-reference, etc.</p></def>
    </gitem>
    
    <gitem>
    	<label>Inlined Schema</label>
    	<def>
    		<p>
    			An XML schema that is defined in the
    			<el>xs:types</el>
    			<emph>element information item</emph>
    			of a WSDL 2.0 description. For example, an XML
    			Schema defined in an
    			<el>xs:schema</el>
    			<emph>element information item</emph>
    			<specref ref="inlining-xsd"/>.
    		</p>
    	</def>
    </gitem>
  </glist>
  
</div3>

<div3 id="xmlinfosetproperties">
<head>XML Information Set Properties</head>

<p>
This specification refers to properties in the XML Information Set <bibref ref="XMLInfoSet"/>. 
Such properties are denoted by square brackets, e.g. [children], [attributes].
</p>

</div3>

<div3 id="wsdlcomponentmodelproperties">
<head>WSDL 2.0 Component Model Properties</head>

<p>This specification defines and refers to properties in the WSDL 2.0 Component Model <specref ref="component_model"/>.
Such properties are denoted by curly brackets, e.g. <prop comp="Interface">name</prop>, <prop comp="Description">interfaces</prop>.
</p>

<p>This specification uses a consistent naming convention for component model properties that refer to components. 
If a property refers to a required or optional component, then the property name is the same as the component name.
If a property refers to a set of components, then the property name is the pluralized form of the component name.
</p>

</div3>

<div3 id="znotation">
<head>Z Notation</head>

<p>
Z Notation <bibref ref="ZNotationReferenceManual"/> was used in the development of this specification.
Z Notation is a formal specification language that is based on standard mathematical notation. 
The Z Notation for this specification has been verified using the
Fuzz 2000 type-checker <bibref ref="Fuzz2000"/>.
</p>

<p>
Since Z Notation is not widely known, it is not included the normative
version of this specification.  However, it is included in a <loc href="wsdl20-z.html" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">non-normative version</loc> which allows to
dynamically hide and show the Z Notation.  Browsers correctly display
the mathematical Unicode characters, provided that the required fonts
are installed.  Mathematical fonts for Mozilla Firefox can be
downloaded from the <loc href="http://www.mozilla.org/projects/mathml/fonts/" xlink:type="simple" xlink:show="replace" xlink:actuate="onRequest">Mozilla Web
site</loc>.
 <!--two non-normative versions, the <loc href="wsdl20-z.html">ZED</loc> and <loc href="wsdl20-z-ie.html">ZED-IE</loc> versions.
Both of these non-normative versions allow the reader to interactively hide and show the Z Notation.
They differ in the way that they encode the mathematical symbols that are used in Z Notation.
The ZED version of this specification uses Unicode characters to encode the mathematical symbols
and is compliant with the W3C Character Model <bibref ref="W3CCharacterModel"/>.
Mozilla Firefox correctly displays the mathematical Unicode characters, provided that the required fonts are installed.
Mathematical fonts for Mozilla Firefox can be downloaded from the <loc href="http://www.mozilla.org/projects/mathml/fonts/">Mozilla Web site</loc>.
The ZED-IE version of this specification uses font substitution to display the mathematical symbols correctly in Internet Explorer.-->
</p>

<p>
The Z Notation was used to improve the quality of the normative text that defines the Component Model, and to help ensure that the test suite covered
all important rules implied by the Component Model.
However, the Z Notation is non-normative, so any conflict between it and the normative text is an error in the Z Notation.
Readers and implementers may nevertheless find the Z Notation useful in cases where the normative text is unclear.
</p>

<p>
There are two elements of Z Notation syntax that conflict with the notational conventions described in the preceding sections.
In Z Notation, square brackets are used to introduce basic sets, e.g. <z:math>[ID]</z:math>,
which conflicts with the use of square brackets to denote XML Information Set properties
<specref ref="xmlinfosetproperties"/>.
Also, in Z Notation, curly brackets are used to denote set display and set comprehension, e.g. <z:math>{1, 2, 3}</z:math>,
which conflicts with the use of curly brackets to denote
WSDL 2.0 Component Model properties <specref ref="wsdlcomponentmodelproperties"/>.
However, the intended meaning of square and curly brackets should be clear from their context and 
this minor notational conflict should not cause any confusion.
</p>

</div3>

<div3 id="bnfpseudoschemas">
<head>BNF Pseudo-Schemas</head>

<p>Pseudo-schemas are provided for each component, before the description
   of the component. They use BNF-style conventions for attributes and elements:
   <attval>?</attval> denotes optionality (i.e. zero or one occurrences), 
   <attval>*</attval> denotes zero or more occurrences, 
   <attval>+</attval> one or more occurrences,
   <attval>[</attval> and <attval>]</attval> are used to form groups, and
   <attval>|</attval> represents choice. 
   Attributes are conventionally assigned a value which corresponds
   to their type, as defined in the normative schema.
   Elements with simple content are conventionally assigned a value which
   corresponds to the type of their content, as defined in the normative
   schema.
   Pseudo schemas do not include extension points for brevity.
</p>

<eg xml:space="preserve">
&lt;!-- sample pseudo-schema --&gt;
&lt;<b>defined_element</b>
      required_attribute_of_type_string="<emph>xs:string</emph>"
      optional_attribute_of_type_int="<emph>xs:int</emph>"? &gt;
  &lt;required_element /&gt;
  &lt;optional_element /&gt;?
  &lt;one_or_more_of_these_elements /&gt;+
  [ &lt;choice_1 /&gt; | &lt;choice_2 /&gt; ]*
&lt;/<b>defined_element</b>&gt;
</eg>

</div3>

	<div3 id="assertions">
		<head>Assertions</head>
		<p>
			Assertions about WSDL 2.0 documents and components that are
			not enforced by the normative XML schema for WSDL 2.0 are
			marked by a dagger symbol (†) at the end
			of a sentence. Each assertion has been assigned a unique
			identifier that consists of a descriptive textual prefix and
			a unique numeric suffix. The numeric suffixes are assigned
			sequentially and never reused so there may be gaps in the
			sequence.  The assertion identifiers MAY be used
			by implementations of this specification for any purpose,
			e.g. error reporting.
		</p>
		<p>
			The assertions and their identifiers are
			summarized in section <specref ref="assertionsummary"/>.
		</p>
	</div3>

</div2>

</div1>

<!-- ******************************************************************* -->

<div1 id="component_model">
<head>Component Model</head>

  <p>
  This section describes the conceptual model of WSDL 2.0 as a set of  
  components with attached properties, which collectively describe a Web  
  service. This model is called the <emph>Component Model</emph> of WSDL 2.0.
  A <emph>valid WSDL 2.0 component model</emph> is a set of WSDL 2.0 components and 
properties that satisfy all the requirements given in this specification 
as indicated by keywords whose interpretation is defined by RFC 2119 <bibref ref="RFC2119"/>.
  </p>
  
  <z:notation name="ComponentModel">

  <p>
  	A WSDL 2.0 document, and its related documents, defines a set of
  	components that together form an instance of a Component Model.
  	This specification defines the structure and constraints on the
  	components in a valid component model instance.
  </p>

  <p>
  	Let
  	<z:i>ComponentModel</z:i>
  	be the set of valid component model instances:
  </p>

  <schema xmlns="http://www.w3.org/2004/zml" name="ComponentModel">
  		DescriptionCM <nl/>
  		ElementDeclarationCM <nl/>
  		TypeDefinitionCM <nl/>
  		InterfaceCM <nl/>
  		InterfaceFaultCM <nl/>
  		InterfaceOperationCM <nl/>
  		InterfaceMessageReferenceCM <nl/>
  		InterfaceFaultReferenceCM <nl/>
  		BindingCM <nl/>
  		BindingFaultCM <nl/>
  		BindingOperationCM <nl/>
  		BindingMessageReferenceCM <nl/>
  		BindingFaultReferenceCM <nl/>
  		ServiceCM <nl/>
  		EndpointCM
  </schema>
  
  <z:see names="DescriptionCM ElementDeclarationCM TypeDefinitionCM    InterfaceCM InterfaceFaultCM  InterfaceOperationCM InterfaceMessageReferenceCM InterfaceFaultReferenceCM    BindingCM BindingFaultCM BindingOperationCM BindingMessageReferenceCM BindingFaultReferenceCM   ServiceCM EndpointCM"/>

  <p>
  	The definition of
  	<z:i>ComponentModel</z:i>
  	is built up from definitions for each of the component
  	types. A component model instance is valid if and only if the
  	constraints on each of the component types are satisfied. The
  	component type definitions are given in the following sections.
  </p>

  </z:notation>
  
  <p>
  Components are typed collections of properties that correspond to  
  different aspects of Web services.
  Each subsection herein describes a different type of  
  component, its defined properties, and its representation as an XML  
  Infoset <bibref ref="XMLInfoSet"/>.
  </p>

  <z:notation name="Component">
  
  <p>
  Let <z:i>Component</z:i> be the union of each of the component types
  that appear in the WSDL 2.0 component model:
  </p>
  
  <zed xmlns="http://www.w3.org/2004/zml">
  		Component ::= <nl/>
  		<t1/>	description<ldata/>Description<rdata/> | <nl/>
  		<t1/>	elementDecl<ldata/>ElementDeclaration<rdata/> | <nl/>
  		<t1/>	typeDef<ldata/>TypeDefinition<rdata/> | <nl/>
  		<t1/>	interface<ldata/>Interface<rdata/> | <nl/>
  		<t1/>	interfaceFault<ldata/>InterfaceFault<rdata/> | <nl/>
  		<t1/>	interfaceOp<ldata/>InterfaceOperation<rdata/> | <nl/>
  		<t1/>	interfaceMessageRef<ldata/>InterfaceMessageReference<rdata/> | <nl/>
  		<t1/>	interfaceFaultRef<ldata/>InterfaceFaultReference<rdata/> | <nl/>
  		<t1/>	binding<ldata/>Binding<rdata/> | <nl/>
  		<t1/>	bindingFault<ldata/>BindingFault<rdata/> | <nl/>
  		<t1/>	bindingOp<ldata/>BindingOperation<rdata/> | <nl/>
  		<t1/>	bindingMessageRef<ldata/>BindingMessageReference<rdata/> | <nl/>
  		<t1/>	bindingFaultRef<ldata/>BindingFaultReference<rdata/> | <nl/>
  		<t1/>	service<ldata/>Service<rdata/> | <nl/>
  		<t1/>	endpoint<ldata/>Endpoint<rdata/>
  </zed>
  
  <z:see names="Description ElementDeclaration TypeDefinition Interface InterfaceFault InterfaceOperation     InterfaceMessageReference InterfaceFaultReference Binding BindingFault BindingOperation  BindingMessageReference BindingFaultReference Service Endpoint"/>
	
	<p>
	The <z:i>Component</z:i> type is an example of a Z Notation <emph>free type</emph>.
	The structure of a free type is similar to
	that of a variant record or discriminated union datatype that are found in some common
	programming languages.
	Each of the members of this union is formally defined in the
	following sections.
	</p>
	
  </z:notation>
  
  <z:notation name="ID">
  	<p>
  		When a component property is said to contain another component
  		or a set of other components, the intended meaning is that the
  		component property contains a reference to another component
  		or a set of references to other components. Every component
  		contains an unique identifier that is used to express
  		references.
  	</p>

  	<p>
  		Let
  		<z:i>ID</z:i>
  		be the set of all component identifier values:
  	</p>

  	<z:zed>[ID]</z:zed>

  	<p>
  		The
  		<z:i>ID</z:i>
  		type is an example of a Z Notation
  		<emph>basic set</emph>. 
  		The structure of a basic set is immaterial. The only
  		relevant aspect of
  		<z:i>ID</z:i>
  		is that it contains enough members to uniquely identify each
  		component, and that these identifiers can be compared for
  		equality. These identifiers are similar to XML element ids or
  		object identifiers that are found in common object-oriented
  		programming languages.
  	</p>

  </z:notation>

  <z:notation name="Identifier">
  
  <p>
  Every component has an identifier which uniquely identifies it within a component model
  instance.
  </p>
  
  <p>
  Let <z:i>Identifier</z:i> be the set of component identifier properties:
  </p>
  
  <ulist>
   <item><p>Let <z:i>id</z:i> be the identifier of the component.</p></item>
  </ulist>
  
  <z:schema name="Identifier">
  		id : ID
  </z:schema>
  
  <z:see names="ID"/>
  
  <p>
  The <z:i>Identifier</z:i> set is a an example of Z Notation <emph>schema</emph>.
  The structure of a Z schema is similar
  to that of a record or struct datatype that are found in many common programming languages.
  The fields of an instance of a Z schema are selected using the usual dot notation, e.g.
  <z:math>x.id</z:math> selects the <z:i>id</z:i> field of the instance <z:i>x</z:i>.
  </p>
  
  <p>
  All component properties that contain an <z:i>ID</z:i>, except for <z:i>Identifier</z:i>,
  refer to other components.
  Every <z:i>ID</z:i> value that appears in a component reference corresponds to a unique
  component in the component model with that identifier.
  </p>
  
  </z:notation>
  
  <z:notation name="Id">
  
  <p>
  Let <z:i>Id</z:i> map components to their identifiers:
  </p>
  
  <axdef xmlns="http://www.w3.org/2004/zml">
  	Id : Component <fun/> ID
  <where/>
  	<forall/> x : Description @ Id(description(x)) = x.id <nl/>
  	<forall/> x : ElementDeclaration @ Id(elementDecl(x)) = x.id <nl/>
  	<forall/> x : TypeDefinition @ Id(typeDef(x)) = x.id <nl/>
  	<forall/> x : Interface @ Id(interface(x)) = x.id <nl/>
  	<forall/> x : InterfaceFault @ Id(interfaceFault(x)) = x.id <nl/>
  	<forall/> x : InterfaceOperation @ Id(interfaceOp(x)) = x.id <nl/>
  	<forall/> x : InterfaceMessageReference @ Id(interfaceMessageRef(x)) = x.id <nl/>
  	<forall/> x : InterfaceFaultReference @ Id(interfaceFaultRef(x)) = x.id <nl/>
  	<forall/> x : Binding @ Id(binding(x)) = x.id <nl/>
  	<forall/> x : BindingFault @ Id(bindingFault(x)) = x.id <nl/>
  	<forall/> x : BindingOperation @ Id(bindingOp(x)) = x.id <nl/>
  	<forall/> x : BindingMessageReference @ Id(bindingMessageRef(x)) = x.id <nl/>
  	<forall/> x : BindingFaultReference @ Id(bindingFaultRef(x)) = x.id <nl/>
  	<forall/> x : Service @ Id(service(x)) = x.id <nl/>
  	<forall/> x : Endpoint @ Id(endpoint(x)) = x.id
  </axdef>
  
  <z:see names="Component ID Description ElementDeclaration TypeDefinition Interface InterfaceFault InterfaceOperation     InterfaceMessageReference InterfaceFaultReference Binding BindingFault BindingOperation  BindingMessageReference BindingFaultReference Service Endpoint"/>
	
	<p>
	The <z:i>Id</z:i> function is an example of a Z Notation <emph>axiomatic definition</emph>.
	An axiomatic definition declares an object and then characterizes it with a set of axioms or 
	logical constraints that it satisfies.
	In this case, the <z:i>Id</z:i> function is constrained by giving its value on each possible type of component,
	which uniquely defines it.
	</p>

  </z:notation>
  
  <z:notation name="ComponentModel1">
  <p>
  A component model is a set of uniquely identified components that satisfy a set
  of validity constraints which are described in the following sections.
  </p>
  
  <p>
  Let <z:i>ComponentModel1</z:i> be the base set of component models.
  This set will be further constrained in the following sections:
    </p>
  <ulist>
  	<item><p>Let <z:i>components</z:i> be the set of components in the component model.</p></item>
  	<item><p>Let <z:i>componentIds</z:i> be the set of identifiers of components in the component model.</p></item>
  </ulist>
    
  <schema xmlns="http://www.w3.org/2004/zml" name="ComponentModel1">
  	components : <power/> Component <nl/>
  	componentIds : <power/> ID
  <where/>
  	<forall/> x, y : components @ <nl/>
  	<t1/>	Id(x) = Id(y) <implies/> x = y
  <also/>
  	componentIds = {~x : components @ Id(x)~}
  </schema>
  
  <z:see names="Component Id"/>
  
  <ulist>
  <item><p>No two components have the same identifier.</p></item>
  </ulist>
  
   </z:notation>
   
   <z:notation name="IdentifierValid">
   
   	<p>An identifier is valid if it is the identifier of a component in the component model.</p>
   	
   	<p>Let <z:i>IdentifierValid</z:i> express this validity constraint:</p>
   	
   	<schema xmlns="http://www.w3.org/2004/zml" name="IdentifierValid">
   		ComponentModel1 <nl/>
   		Identifier
  	<where/>
  		id <in/> componentIds
  	</schema>
  	
  	<z:see names="ComponentModel1 Identifier"/>
   	
   </z:notation>
  
  <z:notation name="InterfaceComponents">
  
  <p>
  In order to express the additional constraints on the component model,
  it is convenient to define the subsets of components of each type
  and their corresponding subsets of identifiers.
  </p>
  
  <p>
  Let <z:i>InterfaceComponents</z:i> define the subsets of components
  that are related to the <comp>Interface</comp> component:
  </p>
  
  <ulist>
  <item><p>Let <z:i>interfaceComps</z:i> be the subset of <comp>Interface</comp> components.</p></item>
  <item><p>Let <z:i>interfaceFaultComps</z:i> be the subset of <comp>Interface Fault</comp> components.</p></item>
  <item><p>Let <z:i>interfaceOpComps</z:i> be the subset of <comp>Interface Operation</comp> components.</p></item>
  <item><p>Let <z:i>interfaceMessageRefComps</z:i> be the subset of <comp>Interface Message Reference</comp> components.</p></item>
  <item><p>Let <z:i>interfaceFaultRefComps</z:i> be the subset of <comp>Interface Fault Reference</comp> components.</p></item>
  </ulist>
  
  <schema xmlns="http://www.w3.org/2004/zml" name="InterfaceComponents">
  	ComponentModel1 <nl/>
  	interfaceComps : <power/> Interface <nl/>
  	interfaceFaultComps : <power/> InterfaceFault <nl/>
  	interfaceOpComps : <power/> InterfaceOperation <nl/>
  	interfaceMessageRefComps : <power/> InterfaceMessageReference <nl/>
  	interfaceFaultRefComps : <power/> InterfaceFaultReference <nl/>
  <where/>
  	interfaceComps = {~x : Interface | <nl/>
  	<t1/>	interface(x) <in/> components~}
  <also/>
  	interfaceFaultComps = {~x : InterfaceFault | <nl/>
  	<t1/>	interfaceFault(x) <in/> components~}
  <also/>
  	interfaceOpComps = {~x : InterfaceOperation | <nl/>
  	<t1/>	interfaceOp(x) <in/> components~}
  <also/>
  	interfaceMessageRefComps = {~x : InterfaceMessageReference | <nl/>
  	<t1/>	interfaceMessageRef(x) <in/> components~}
  <also/>
  	interfaceFaultRefComps = {~x : InterfaceFaultReference | <nl/>
  	<t1/>	interfaceFaultRef(x) <in/> components~}
  </schema>
  
  <z:see names="ComponentModel1 Interface InterfaceFault InterfaceOperation InterfaceMessageReference InterfaceFaultReference"/>
  
  <p>
  The definition of <z:i>InterfaceComponents</z:i> is an example of Z Notation <emph>schema inclusion</emph>.
  In Z schema inclusion all the fields and constraints of the included Z schema, e.g. 
  <z:i>ComponentModel1</z:i> are added to the including Z schema, e.g. <z:i>InterfaceComponents</z:i>.
  </p>
  
  </z:notation>
  
  <z:notation name="InterfaceComponentIds">
  
  <p>
  Let <z:i>InterfaceComponentIds</z:i> define the subsets of component identifiers
  that are related to the <comp>Interface</comp> component:
  </p>
  
  <ulist>
  <item><p>Let <z:i>interfaceIds</z:i> be the subset of <comp>Interface</comp> component identifiers.</p></item>
  <item><p>Let <z:i>interfaceFaultIds</z:i> be the subset of <comp>Interface Fault</comp> component identifiers.</p></item>
  <item><p>Let <z:i>interfaceOpIds</z:i> be the subset of <comp>Interface Operation</comp> component identifiers.</p></item>
  <item><p>Let <z:i>interfaceMessageRefIds</z:i> be the subset of <comp>Interface Message Reference</comp> component identifiers.</p></item>
  <item><p>Let <z:i>interfaceFaultRefIds</z:i> be the subset of <comp>Interface Fault Reference</comp> component identifiers.</p></item>
  </ulist>

  <schema xmlns="http://www.w3.org/2004/zml" name="InterfaceComponentIds">
  	InterfaceComponents <nl/>
  	interfaceIds : <power/> ID <nl/>
  	interfaceFaultIds : <power/> ID <nl/>
  	interfaceOpIds : <power/> ID <nl/>
  	interfaceMessageRefIds : <power/> ID <nl/>
  	interfaceFaultRefIds : <power/> ID
  <where/>
   interfaceIds = {~x : interfaceComps  @ x.id~} <nl/>
   interfaceFaultIds = {~x : interfaceFaultComps  @ x.id~} <nl/>
   interfaceOpIds = {~x : interfaceOpComps  @ x.id~} <nl/>
   interfaceMessageRefIds = {~x : interfaceMessageRefComps  @ x.id~} <nl/>
   interfaceFaultRefIds = {~x : interfaceFaultRefComps  @ x.id~} <nl/>
  </schema>
  
  <z:see names="InterfaceComponents ID"/>

  </z:notation>
  
  <z:notation name="BindingComponents">
  
  <p>
  Let <z:i>BindingComponents</z:i> define the subsets of components
  that are related to the <comp>Binding</comp> component:
  </p>
  
  <ulist>
  <item><p>Let <z:i>bindingComps</z:i> be the subset of <comp>Binding</comp> components.</p></item>
  <item><p>Let <z:i>bindingFaultComps</z:i> be the subset of <comp>Binding Fault</comp> components.</p></item>
  <item><p>Let <z:i>bindingOpComps</z:i> be the subset of <comp>Binding Operation</comp> components.</p></item>
  <item><p>Let <z:i>bindingMessageRefComps</z:i> be the subset of <comp>Binding Message Reference</comp> components.</p></item>
  <item><p>Let <z:i>bindingFaultRefComps</z:i> be the subset of <comp>Binding Fault Reference</comp> components.</p></item>
  </ulist>

  <schema xmlns="http://www.w3.org/2004/zml" name="BindingComponents">
  	ComponentModel1 <nl/>
  	bindingComps : <power/> Binding <nl/>
  	bindingFaultComps : <power/> BindingFault <nl/>
  	bindingOpComps : <power/> BindingOperation <nl/>
  	bindingMessageRefComps : <power/> BindingMessageReference <nl/>
  	bindingFaultRefComps : <power/> BindingFaultReference <nl/>
  <where/>
  	bindingComps = {~x : Binding | <nl/>
  	<t1/>	binding(x) <in/> components~}
  <also/>
  	bindingFaultComps = {~x : BindingFault | <nl/>
  	<t1/>	bindingFault(x) <in/> components~}
  <also/>
  	bindingOpComps = {~x : BindingOperation | <nl/>
  	<t1/>	bindingOp(x) <in/> components~}
  <also/>
  	bindingMessageRefComps = {~x : BindingMessageReference | <nl/>
  	<t1/>	bindingMessageRef(x) <in/> components~}
  <also/>
  	bindingFaultRefComps = {~x : BindingFaultReference | <nl/>
  	<t1/>	bindingFaultRef(x) <in/> components~}
  </schema>

  <z:see names="ComponentModel1 Binding BindingFault BindingOperation BindingMessageReference BindingFaultReference"/>
  
  </z:notation>
  
  <z:notation name="BindingComponentIds">
  
  <p>
  Let <z:i>BindingComponentIds</z:i> define the subsets of component identifiers
  that are related to the <comp>Binding</comp> component:
  </p>
  
  <ulist>
  <item><p>Let <z:i>bindingIds</z:i> be the subset of <comp>Binding</comp> component identifiers.</p></item>
  <item><p>Let <z:i>bindingFaultIds</z:i> be the subset of <comp>Binding Fault</comp> component identifiers.</p></item>
  <item><p>Let <z:i>bindingOpIds</z:i> be the subset of <comp>Binding Operation</comp> component identifiers.</p></item>
  <item><p>Let <z:i>bindingMessageRefIds</z:i> be the subset of <comp>Binding Message Reference</comp> component identifiers.</p></item>
  <item><p>Let <z:i>bindingFaultRefIds</z:i> be the subset of <comp>Binding Fault Reference</comp> component identifiers.</p></item>
  </ulist>

  <schema xmlns="http://www.w3.org/2004/zml" name="BindingComponentIds">
   BindingComponents <nl/>
   bindingIds : <power/> ID <nl/>
   bindingFaultIds : <power/> ID <nl/>
   bindingOpIds : <power/> ID <nl/>
   bindingMessageRefIds : <power/> ID <nl/>
   bindingFaultRefIds : <power/> ID
  <where/>
   bindingIds = {~x : bindingComps  @ x.id~} <nl/>
   bindingFaultIds = {~x : bindingFaultComps  @ x.id~} <nl/>
   bindingOpIds = {~x : bindingOpComps  @ x.id~} <nl/>
   bindingMessageRefIds = {~x : bindingMessageRefComps  @ x.id~} <nl/>
   bindingFaultRefIds = {~x : bindingFaultRefComps  @ x.id~}
  </schema>
  
  <z:see names="BindingComponents ID"/>

  </z:notation>
  
  <z:notation name="ServiceComponents">
  
  <p>
  Let <z:i>ServiceComponents</z:i> define the subsets of components
  that are related to the <comp>Service</comp> component:
  </p>
  
  <ulist>
  <item><p>Let <z:i>serviceComps</z:i> be the subset of <comp>Service</comp> components.</p></item>
  <item><p>Let <z:i>endpointComps</z:i> be the subset of <comp>Endpoint</comp> components.</p></item>
  </ulist>

  <schema xmlns="http://www.w3.org/2004/zml" name="ServiceComponents">
  	ComponentModel1 <nl/>
  	serviceComps : <power/> Service <nl/>
  	endpointComps : <power/> Endpoint
  <where/>
  	serviceComps = {~x : Service | <nl/>
  	<t1/>	service(x) <in/> components~}
  <also/>
  	endpointComps = {~x : Endpoint | <nl/>
  	<t1/>	endpoint(x) <in/> components~}
  </schema>

  <z:see names="ComponentModel1 Service Endpoint"/>
  
  </z:notation>
  
  <z:notation name="ServiceComponentIds">
  
  <p>
  Let <z:i>ServiceComponentIds</z:i> define the subsets of component identifiers
  that are related to the <comp>Service</comp> component:
  </p>
  
  <ulist>
  <item><p>Let <z:i>serviceIds</z:i> be the subset of <comp>Service</comp> component identifiers.</p></item>
  <item><p>Let <z:i>endpointIds</z:i> be the subset of <comp>Endpoint</comp> component identifiers.</p></item>
  </ulist>

  <schema xmlns="http://www.w3.org/2004/zml" name="ServiceComponentIds">
   ServiceComponents <nl/>
   serviceIds : <power/> ID <nl/>
   endpointIds : <power/> ID
  <where/>
   serviceIds = {~x : serviceComps  @ x.id~} <nl/>
   endpointIds = {~x : endpointComps  @ x.id~}
  </schema>
  
  <z:see names="ServiceComponents ID"/>

  </z:notation>
  
  <z:notation name="OtherComponents">
  
  <p>
  Let <z:i>OtherComponents</z:i> define the subsets of the other component types:
  </p>
  
  <ulist>
  <item><p>Let <z:i>descriptionComps</z:i> be the subset of <comp>Description</comp> components.</p></item>
  <item><p>Let <z:i>elementDeclComps</z:i> be the subset of <comp>Element Declaration</comp> components.</p></item>
  <item><p>Let <z:i>typeDefComps</z:i> be the subset of <comp>Type Definition</comp> components.</p></item>
  </ulist>

  <schema xmlns="http://www.w3.org/2004/zml" name="OtherComponents">
  	ComponentModel1 <nl/>
  	descriptionComps : <power/> Description <nl/>
  	elementDeclComps : <power/> ElementDeclaration <nl/>
  	typeDefComps : <power/> TypeDefinition
  <where/>
  	descriptionComps = {~x : Description | <nl/>
  	<t1/>	description(x) <in/> components~}
  <also/>
  	elementDeclComps = {~x : ElementDeclaration | <nl/>
  	<t1/>	elementDecl(x) <in/> components~}
  <also/>
  	typeDefComps = {~x : TypeDefinition | <nl/>
  	<t1/>	typeDef(x) <in/> components~}
  </schema>
  
  <z:see names="ComponentModel1 Description ElementDeclaration TypeDefinition"/>
  
  </z:notation>
  
  <z:notation name="OtherComponentIds">
  
  <p>
  Let <z:i>OtherComponentIds</z:i> define the subsets of other component identifiers:
  </p>
  
  <ulist>
  <item><p>Let <z:i>descriptionIds</z:i> be the subset of <comp>Description</comp> component identifiers.</p></item>
  <item><p>Let <z:i>elementDeclIds</z:i> be the subset of <comp>Element Declaration</comp> component identifiers.</p></item>
  <item><p>Let <z:i>typeDefIds</z:i> be the subset of <comp>Type Definition</comp> component identifiers.</p></item>
  </ulist>

  <schema xmlns="http://www.w3.org/2004/zml" name="OtherComponentIds">
  	OtherComponents <nl/>
  	descriptionIds : <power/> ID <nl/>
  	elementDeclIds : <power/> ID <nl/>
  	typeDefIds : <power/> ID
  <where/>
   descriptionIds = {~x : descriptionComps  @ x.id~} <nl/>
   elementDeclIds = {~x : elementDeclComps  @ x.id~} <nl/>
   typeDefIds = {~x : typeDefComps  @ x.id~}
  </schema>
  
  <z:see names="OtherComponents ID"/>

  </z:notation>
  
  <z:notation name="ComponentModel2">
  
  <p>
  	Let
  	<z:i>ComponentModel2</z:i>
  	be the basic component model, augmented with the definitions of
  	the subsets of each component type and their corresponding
  	identifiers:
  </p>

  <zed xmlns="http://www.w3.org/2004/zml">
  	ComponentModel2 <defs/> <nl/>
  	<t1/>	InterfaceComponentIds <land/> <nl/>
  	<t1/>	BindingComponentIds <land/> <nl/>
  	<t1/>	ServiceComponentIds <land/> <nl/>
  	<t1/>	OtherComponentIds
  </zed>
  
  <z:see names="InterfaceComponentIds BindingComponentIds ServiceComponentIds OtherComponentIds"/>
  
  <p>
  The definition of <z:i>ComponentModel2</z:i> is an example of Z Notation <emph>schema conjunction</emph>.
  In Z schema conjunction, the resulting Z schema, e.g. <z:i>ComponentModel2</z:i>, contains all the fields
  of the conjoined Z schemas, e.g. <z:i>InterfaceComponentIds</z:i>, <z:i>BindingComponentIds</z:i>, <z:i>ServiceComponentIds</z:i>, and
  <z:i>OtherComponentIds</z:i>, and its constraint is the conjunction (logical and) of their constraints.
  </p>
  
  </z:notation>
    
	  <z:notation name="Base">
	  
	  <p>
	  The component types in the
	  component model have an identifier.
	  It is convenient to put this field into a base Z schema that
	  can be included in other component schemas.
	  </p>
	  
	  <p>
	  Let <z:i>Base</z:i> be the common base Z schema for all component types
	  that have an identifier:
	  </p>
	  
	  <schema xmlns="http://www.w3.org/2004/zml" name="Base">
		Identifier
	  </schema>

		<z:see names="Identifier"/>

	  </z:notation>
	  
	  <z:notation name="BaseValid">
	  
	  <p>
	  The base properties of a component are valid when the identifiers are valid:
	  </p>
	  
	  <p>
	  Let <z:i>BaseValid</z:i> be this validity constraint on the
	  base fields of a component:
	  </p>
	  
	  <schema xmlns="http://www.w3.org/2004/zml" name="BaseValid">
		IdentifierValid
	  </schema>
	  
		<z:see names="IdentifierValid"/>
		
	  </z:notation>
	  
	  <z:notation name="NestedBase">
	  
	  <p>Nested components have an additional <prop comp="">parent</prop> property.</p>
	  
	  <p>
	  	Let
	  	<z:i>NestedBase</z:i>
	  	be the common base schema for all nested component types:
	  </p>
	  
	  <schema xmlns="http://www.w3.org/2004/zml" name="NestedBase">
	  	Base <nl/>
	  	Parent
	  </schema>
	  
	  <z:see names="Base Parent"/>

	  </z:notation>
	  
	  <z:notation name="NestedBaseValid">
	  
	  <p>
	  The properties of a nested base component are valid
	  when the base properties are valid and the <prop comp="">parent</prop>
	  property is valid.
	  </p>

	  <p>
	  	Let
	  	<z:i>NestedBaseValid</z:i>
	  	be the validity constraints for nested
	  	components:
	  </p>
	  
	  <schema xmlns="http://www.w3.org/2004/zml" name="NestedBaseValid">
	  	BaseValid <nl/>
	  	ParentValid
	  </schema>
	  
	  <z:see names="BaseValid ParentValid"/>
	  
	  </z:notation>
	  
  <p>
  Properties are unordered and unique  
  with respect to the component they are associated with. Individual  
  properties' definitions may constrain their content (e.g., to a typed  
  value, another component, or a set of typed values or components), and  
  components may require the presence of a property to be considered  
  conformant. Such properties are marked as REQUIRED, whereas those that
  are not required to be present are marked as OPTIONAL.
  By convention, when specifying the mapping rules from the XML Infoset
  representation of a component to the component itself, an optional
  property that is absent in the component in question is described as
  being “empty”. Unless otherwise specified, when a property is identified
  as being a collection (a set or a list), its value may be a 0-element
  (empty) collection. In order to simplify the presentation of the rules
  that deal with sets of components, for all OPTIONAL properties whose type
  is a set, the absence of such a property from a component MUST be treated
  as semantically equivalent to the presence of a property with the same
  name and whose value is the empty set. In other words, every OPTIONAL
  set-valued property MUST be assumed to have the empty set as its default
  value, to be used in case the property is absent.
  </p>
  
  <z:notation name="OPTIONAL">
  
  <p>
  An OPTIONAL simple property type is treated
  as a set-valued type that contains at most one member.
  If the property is absent then its value is the empty set.
  If the property is present then its value is the singleton set
  that contains the actual value of the property.
  </p>
  
  <p>
  Let <z:i>OPTIONAL</z:i>[<z:i>X</z:i>] be the OPTIONAL values
  of type X where X is a property type:
  </p>
  
  <gendef xmlns="http://www.w3.org/2004/zml" params="X">
  		OPTIONAL : <power/>(<power/> X)
  <where/>
  		OPTIONAL = {<emptyset/>} <cup/> {~x : X @ {x}~}
  </gendef>
  
  <ulist>
  <item><p>An optional value of type <z:i>X</z:i> is either the empty set or a singleton set
  that contains one member of <z:i>X</z:i>.</p></item>
  </ulist>
  
  <p>
  For example, <z:math>OPTIONAL[{True, False}] = {<z:emptyset/>, {True}, {False}}</z:math>.
  </p>
  
  <p>
  The definition of <z:i>OPTIONAL</z:i> is an example of Z Notation <emph>generic definition</emph>.
  A Z generic definition defines an object whose type depends on the types of one or more sets that
  are given as arguments to the definition.
  A Z generic definition is similar to a generic, template, or parameterized type that are found in
  common programming languages.
  </p>
  </z:notation>
  
  <p>
  Component definitions are serializable in XML 1.0 format but are
  independent of any particular serialization of the component model. 
  Component definitions use a subset 
  (see <specref ref="simpletypes"/>)
  of the simple types
  defined by the XML Schema 1.0 specification <bibref ref="XMLSchemaP2"/>.
  </p>

  <p>
  In addition to the direct XML Infoset representation described here,  
  the component model allows components external to the Infoset through  
  the mechanisms described in <specref ref="modularize"/>.
  </p>

  <p>
  A component model can be extracted from a given XML Infoset which  
  conforms to the XML Schema for WSDL 2.0 by recursively mapping  
  Information Items to their identified components, starting with the  
  <el>wsdl:description</el> <emph>element information item</emph>. This includes the  
  application of the mechanisms described in <specref ref="modularize"/>.
  </p>

  <p>
  This document does not specify a means of producing an XML Infoset  
  representation from a component model instance.
  In particular, there are in general many valid ways to modularize
  a given component model instance into one or more XML Infosets.
  </p>

  <div2 id="Description">
    <head>Description</head>

    <div3 id="Description_details">
      <head>The Description Component</head>
      
      <p>At the abstract level, the <comp>Description</comp> component is just a
      container for two categories of components: WSDL 2.0 components and
      type system components.</p>

      <p>
      	WSDL 2.0 components are interfaces, bindings and services. Type
      	system components are element declarations and type
      	definitions.
      </p>

      <p>Type system components describe the constraints on a
      message's content. By default, these constraints are expressed
      in terms of the <bibref ref="XMLInfoSet"/>, i.e. they define the
      [local name], [namespace name], [children] and [attributes]
      properties of an <emph>element information item</emph>.  Type systems based
      upon other data models are generally accommodated by extensions
      to WSDL 2.0; see <specref ref="language-extensibility"/>.  In the
      case where they define information equivalent to that of a XML
      Schema global element declaration, they can be
      treated as if they were such a declaration.</p>

      <p>This specification does not define the behavior of a WSDL 2.0
      document that uses multiple schema languages for describing type
      system components simultaneously.</p>
      
      <z:notation name="ElementContentModel">
      <p>
      Let <z:i>ElementContentModel</z:i> be the set of all models that define the allowable
      values for the [children] and [attribute] properties of an <emph>element information item</emph>:
      </p>

      <z:zed>
      	[ElementContentModel]
      </z:zed>
      
      <p>
      The detailed structure of <z:i>ElementContentModel</z:i> is immaterial for the purposes of
      this specification. It is can be safely thought of as some superset of the set of all XML Schema
      complex type definitions.
      </p>

      </z:notation>
      
      <p>
      	An <compdef>Element Declaration</compdef> component defines the name and content model of an <emph>element information item</emph>
      	such as that defined by an XML Schema global element declaration.
      	It has a <propdef comp="Element Declaration">name</propdef> property that is the QName of the <emph>element information item</emph>
      	and a <propdef comp="Element Declaration">system</propdef> property that is the namespace IRI of the extension <emph>element information item</emph>s
      	for the type system, e.g. the namespace of XML Schema.
      </p>
      
      <z:notation name="ElementDeclaration">
      <p>
      Let <z:i>ElementDeclaration</z:i> be the type of <comp>Element Declaration</comp> components:
      </p>
      <ulist>
      <item><p>Let <z:i>name</z:i> be the QName defined by the [local name] and [namespace name] 
      properties of the <emph>element information item</emph>.</p></item>
      <item><p>Let <z:i>system</z:i> be the namespace IRI of the type system.</p></item>
      <item><p>Let <z:i>elementContentModel</z:i> be the element content model that constrains the
      allowable contents of the [children] and [attribute] properties of the <emph>element information item</emph>.</p></item>
      </ulist>

      <schema xmlns="http://www.w3.org/2004/zml" name="ElementDeclaration">
      		Identifier <nl/>
      		name : QName <nl/>
      		system : AbsoluteURI <nl/>
      		elementContentModel : ElementContentModel
      </schema>
      
      <z:see names="QName AbsoluteURI ElementContentModel"/>

      </z:notation>
      
       <z:notation name="ElementDeclarationCM">

       		<p>
       			Each <comp>Element Declaration</comp> component is uniquely
       			identified by the combination of its <prop comp="Element Declaration">name</prop> 
       			and <prop comp="Element Declaration">system</prop> properties within the
       			component model.
       		</p>
       		
       		<p>
			       Let <z:i>ElementDeclarationCM</z:i> express this
			       constraint:
			</p>
			
			<schema xmlns="http://www.w3.org/2004/zml" name="ElementDeclarationCM">
				ComponentModel2
			<where/>
				<forall/> x, y : elementDeclComps | <nl/>
				<t1/>	x.name = y.name <land/> <nl/>
				<t1/>	x.system = y.system @ <nl/>
				<t2/>		x = y
			</schema>
			
			<z:see names="ComponentModel2"/>
			
			<ulist>
			<item><p>No two <comp>Element Declaration</comp> components have the same <prop comp="Element Declaration">name</prop> 
			and <prop comp="Element Declaration">system</prop> properties.</p></item>
			</ulist>
		</z:notation>

      <p>
      	A <compdef>Type Definition</compdef> component defines the content model of an <emph>element information item</emph>
      	such as that defined by an XML Schema global type definition.
      	It has a <propdef comp="Type Definition">name</propdef> property that is the QName of the type
      	and a <propdef comp="Type Definition">system</propdef> property that is the namespace IRI of the extension <emph>element information item</emph>s
      	for the type system, e.g. the namespace of XML Schema.
      </p>
      
      <z:notation name="TypeDefinition">
      <p>
      Let <z:i>TypeDefinition</z:i> be the type of the <comp>Type Definition</comp> component:
      </p>
      <ulist>
      <item><p>Let <z:i>name</z:i> be the QName of the type definition.</p></item>
      <item><p>Let <z:i>system</z:i> be the namespace IRI of the type system.</p></item>
      <item><p>Let <z:i>elementContentModel</z:i> be the element content model that constrains the
      allowable contents of the [children] and [attribute] properties of the <emph>element information item</emph>
      described by the type definition.</p></item>
      </ulist>

      <schema xmlns="http://www.w3.org/2004/zml" name="TypeDefinition">
      		Identifier <nl/>
      		name : QName <nl/>
      		system : AbsoluteURI <nl/>
      		elementContentModel : ElementContentModel
      </schema>

      <z:see names="QName AbsoluteURI ElementContentModel"/>

      </z:notation>
      
       <z:notation name="TypeDefinitionCM">

       		<p>
       			Each <comp>Type Definition</comp> component is uniquely
       			identified by the combination of its <prop comp="Type Definition">name</prop> 
       			and <prop comp="Type Definition">system</prop> properties within the
       			component model.
       		</p>
       		
       		<p>
			       Let <z:i>TypeDefinitionCM</z:i> express this
			       constraint:
			</p>
			
			<schema xmlns="http://www.w3.org/2004/zml" name="TypeDefinitionCM">
				ComponentModel2
			<where/>
				<forall/> x, y : typeDefComps | <nl/>
				<t1/>	x.name = y.name <land/> <nl/>
				<t1/>	x.system = y.system @ <nl/>
				<t2/>		x = y
			</schema>
			
			<z:see names="ComponentModel2"/>
			
			<ulist>
			<item><p>No two <comp>Type Definition</comp> components have the same <prop comp="Type Definition">name</prop> 
			and <prop comp="Type Definition">system</prop> properties.</p>
			</item>
			</ulist>
		</z:notation>

      <p>
      	<comp>Interface</comp>, <comp>Binding</comp>, <comp>Service</comp>, <comp>Element Declaration</comp>, and <comp>Type
      	Definition</comp> components are directly contained in the
      	<comp>Description</comp> component and are referred to as
      	<emph>top-level components</emph>. 
      	The top-level WSDL 2.0 components contain other components, e.g.
      	<comp>Interface Operation</comp> and <comp>Endpoint</comp>, which are referred to as
      	<emph>nested components</emph>. Nested components may contain
      	other nested components. The component that contains
      	a nested component is referred to as the <emph>parent</emph>
      	of the nested component. Nested components have a <propdef comp="">parent</propdef>
      	property that is a reference to their parent component.
      </p>
      
      <z:notation name="TopLevelComponent">
      
      <p>Let <z:i>TopLevelComponent</z:i> be the set of all top-level components:
      </p>
      
      <zed xmlns="http://www.w3.org/2004/zml">
      	TopLevelComponent == <nl/>
      	<t1/>	<ran/> elementDecl <cup/> <nl/>
      	<t1/>	<ran/> typeDef <cup/> <nl/>
      	<t1/>	<ran/> interface <cup/> <nl/>
       	<t1/>	<ran/> binding <cup/> <nl/>
      	<t1/>	<ran/> service
      </zed>
      
      <z:see names="Component"/>
      
      </z:notation>
      
      <z:notation name="Name">
      
      <p>Let <z:i>Name</z:i> map a top-level component to its QName <prop comp="">name</prop> property:</p>
      
      <axdef xmlns="http://www.w3.org/2004/zml">
      	Name : TopLevelComponent <fun/> QName
      <where/>
      	<forall/> x : ElementDeclaration @ <nl/>
      	<t1/> Name(elementDecl(x)) = x.name
      <also/>
      	<forall/> x : TypeDefinition @ <nl/>
      	<t1/> Name(typeDef(x)) = x.name
      <also/>
      	<forall/> x : Interface @ <nl/>
      	<t1/> Name(interface(x)) = x.name
      <also/>
      	<forall/> x : Binding @ <nl/>
      	<t1/> Name(binding(x)) = x.name
      <also/>
      	<forall/> x : Service @ <nl/>
      	<t1/> Name(service(x)) = x.name
      </axdef>
      
      <z:see names="TopLevelComponent QName Component ElementDeclaration TypeDefinition Interface Binding Service"/>

      </z:notation>
   
      <z:notation name="Parent">

      <p>
      	Let
      	<z:i>Parent</z:i>
      	represent the <prop comp="">parent</prop> property of a nested component:
      </p>
      
      <schema xmlns="http://www.w3.org/2004/zml" name="Parent">
      	Identifier <nl/>
      	parent : ID
      </schema>
      
      <z:see names="Identifier ID"/>

      </z:notation>
      
      <z:notation name="ParentValid">
      
      <p>
      	The parent of a nested component in the component model MUST
      	also be in the component model. No component is its own parent.
      </p>

      <p>
      	Let
      	<z:i>ParentValid</z:i>
      	represent these validity constraints:
      </p>
      
      <schema xmlns="http://www.w3.org/2004/zml" name="ParentValid">
      	ComponentModel1 <nl/>
      	Parent
      <where/>
      	parent <in/> componentIds <nl/>
      	parent <neq/> id
      </schema>
      
      <z:see names="ComponentModel1 Parent"/>
      
      </z:notation>
      
      <z:notation name="NestedComponent">
      
      <p>Let <z:i>NestedComponent</z:i> be the set of all nested components:
      </p>
      
      <zed xmlns="http://www.w3.org/2004/zml">
      	NestedComponent == <nl/>
      	<t1/>	<ran/> interfaceFault <cup/> <nl/>
      	<t1/>	<ran/> interfaceOp <cup/> <nl/>
      	<t1/>	<ran/> interfaceMessageRef <cup/> <nl/>
      	<t1/>	<ran/> interfaceFaultRef <cup/> <nl/>
      	<t1/>	<ran/> bindingFault <cup/> <nl/>
      	<t1/>	<ran/> bindingOp <cup/> <nl/>
      	<t1/>	<ran/> bindingMessageRef <cup/> <nl/>
      	<t1/>	<ran/> bindingFaultRef <cup/> <nl/>
      	<t1/>	<ran/> endpoint
      </zed>
      
      <z:see names="Component"/>
      
      </z:notation>
      
      <z:notation name="ParentId">
      
      <p>Let <z:i>ParentId</z:i> map a nested component to its parent component identifier:</p>
      
      <axdef xmlns="http://www.w3.org/2004/zml">
      	ParentId : NestedComponent <fun/> ID
      <where/>
      	<forall/> x : InterfaceFault @ <nl/>
      	<t1/> ParentId(interfaceFault(x)) = x.parent
      <also/>
      	<forall/> x : InterfaceOperation @ <nl/>
      	<t1/> ParentId(interfaceOp(x)) = x.parent
      <also/>
      	<forall/> x : InterfaceMessageReference @ <nl/>
      	<t1/> ParentId(interfaceMessageRef(x)) = x.parent
      <also/>
      	<forall/> x : InterfaceFaultReference @ <nl/>
      	<t1/> ParentId(interfaceFaultRef(x)) = x.parent
      <also/>
      	<forall/> x : BindingFault @ <nl/>
      	<t1/> ParentId(bindingFault(x)) = x.parent
      <also/>
      	<forall/> x : BindingOperation @ <nl/>
      	<t1/> ParentId(bindingOp(x)) = x.parent
      <also/>
      	<forall/> x : BindingMessageReference @ <nl/>
      	<t1/> ParentId(bindingMessageRef(x)) = x.parent
      <also/>
      	<forall/> x : BindingFaultReference @ <nl/>
      	<t1/> ParentId(bindingFaultRef(x)) = x.parent
      <also/>
      	<forall/> x : Endpoint @ <nl/>
      	<t1/> ParentId(endpoint(x)) = x.parent
      </axdef>
      
      <z:see names="NestedComponent ID InterfaceFault InterfaceOperation InterfaceMessageReference InterfaceFaultReference          BindingFault BindingOperation BindingMessageReference BindingFaultReference Endpoint"/>

      </z:notation>
   
      <p>The properties of the <compdef>Description</compdef> component are as follows:</p>
	  <ulist>
	    <item><p><propdef comp="Description">interfaces</propdef> OPTIONAL. A set of <comp>Interface</comp> components.
	    </p></item>

	    <item><p><propdef comp="Description">bindings</propdef> OPTIONAL. A set of <comp>Binding</comp> components.
	    </p></item>

	    <item><p><propdef comp="Description">services</propdef> OPTIONAL. A set of <comp>Service</comp> components.
	    </p></item>

	    <item><p><propdef comp="Description">element declarations</propdef> OPTIONAL. A set of <comp>Element Declaration</comp> components.</p></item>

	    <item><p><propdef comp="Description">type definitions</propdef> REQUIRED. A set of <comp>Type Definition</comp> components.</p></item>
	  </ulist>

<z:notation name="Description">	
<p>
Let <z:i>Description</z:i> be the set of all <comp>Description</comp> components:
</p>

<schema xmlns="http://www.w3.org/2004/zml" name="Description">
	Identifier <nl/>
	interfaces : <power/> ID <nl/>
	bindings : <power/> ID <nl/>
	services : <power/> ID <nl/>
	elementDeclarations : <power/> ID <nl/>
	typeDefinitions : <power/> ID
</schema>

<z:see names="ID"/>

</z:notation>
    	
  <z:notation name="stringTD...">
  
  <p>
  Let the built-in XML schema datatypes correspond to the following <comp>Type Definition</comp> components:
  </p>
  
  <axdef xmlns="http://www.w3.org/2004/zml">
      		stringTD, booleanTD, decimalTD, floatTD, doubleTD, <nl/>
      		durationTD, dateTimeTD, timeTD, dateTD, <nl/>
      		gYearMonthTD, gYearTD, gMonthDayTD, gDayTD, <nl/>
    		gMonthTD, hexBinaryTD, base64TD, BinaryTD, <nl/>
    		anyURITD, QNameTD, NOTATIONTD, normalizedStringTD, <nl/>
    		tokenTD, languageTD, NMTOKENTD, NMTOKENSTD, <nl/>
    		NameTD, NCNameTD, IDTD, IDREFTD, IDREFSTD, <nl/>
    		ENTITYTD, ENTITIESTD, integerTD, <nl/>
    		nonPositiveIntegerTD, negativeIntegerTD, <nl/>
    		longTD, intTD, shortTD, byteTD, <nl/>
    		nonNegativeIntegerTD, unsignedLongTD, unsignedIntTD, <nl/>
    		unsignedShortTD, unsignedByteTD, positiveIntegerTD : TypeDefinition    		
  </axdef>
  
  <z:see names="TypeDefinition"/>
  
  </z:notation>
  
  <z:notation name="BuiltInTypeDefComps">

  <p>Let <z:i>BuiltInTypeDefComps</z:i> be the set of all the built-in XML schema <comp>Type Definition</comp> components:</p>
  
  <zed xmlns="http://www.w3.org/2004/zml">
  	BuiltInTypeDefComps == <nl/>
  	<t1/> {stringTD, booleanTD, decimalTD, floatTD, doubleTD, <nl/>
  	<t1/> durationTD, dateTimeTD, timeTD, dateTD, <nl/>
    <t1/> gYearMonthTD, gYearTD, gMonthDayTD, gDayTD, <nl/>
    <t1/> gMonthTD, hexBinaryTD, base64TD, BinaryTD, <nl/>
    <t1/> anyURITD, QNameTD, NOTATIONTD, normalizedStringTD, <nl/>
    <t1/> tokenTD, languageTD, NMTOKENTD, NMTOKENSTD, <nl/>
    <t1/> NameTD, NCNameTD, IDTD, IDREFTD, IDREFSTD, <nl/>
    <t1/> ENTITYTD, ENTITIESTD, integerTD, <nl/>
    <t1/> nonPositiveIntegerTD, negativeIntegerTD, <nl/>
    <t1/> longTD, intTD, shortTD, byteTD, <nl/>
    <t1/> nonNegativeIntegerTD, unsignedLongTD, unsignedIntTD, <nl/>
    <t1/> unsignedShortTD, unsignedByteTD, positiveIntegerTD}
  </zed>
  
  <z:see names="stringTD..."/>
  
  </z:notation>
  
  <z:notation name="XMLSchemaURI">

  <p>Let <z:i>XMLSchemaURI</z:i> be the namespace URI of XML Schema:</p>
  
  <axdef xmlns="http://www.w3.org/2004/zml">
  	XMLSchemaURI : AbsoluteURI
  </axdef>
  
  <z:see names="AbsoluteURI"/>
  
  <p>Both the namespace name of the <prop comp="Type Definition">name</prop> property
  and the <prop comp="Type Definition">system</prop> property of each built-in datatypes is the XML Schema URI:</p>
  
  <zed xmlns="http://www.w3.org/2004/zml">
  	<forall/> x : BuiltInTypeDefComps @ <nl/>
  	<t1/> x.name.namespaceName = x.system = XMLSchemaURI
  </zed>  
  
  <z:see names="BuiltInTypeDefComps"/>
  
  </z:notation>
  
  <z:notation name="BuiltInTypeDefIds">

  <p>Let <z:i>BuiltInTypeDefIds</z:i> be the set of ids of the built-in datatypes:</p>
  
  <zed xmlns="http://www.w3.org/2004/zml">
  	BuiltInTypeDefIds == {~x : BuiltInTypeDefComps @ x.id~}
  </zed>
  
  <z:see names="BuiltInTypeDefComps"/>
  
  <p>The built-in datatypes are distinct so there are forty-four ids in total:</p>
  
  <zed xmlns="http://www.w3.org/2004/zml">
	#BuiltInTypeDefIds = 44  
  </zed>
  
  </z:notation>
  
  <z:notation name="DescriptionTypeDefs">
  
  <p>The XML Schema built-in datatypes are also built into WSDL 2.0.</p>
  
  <p>Let <z:i>DescriptionTypeDefs</z:i> express this constraint on the <comp>Description</comp>:</p>
  
  <schema xmlns="http://www.w3.org/2004/zml" name="DescriptionTypeDefs">
  	ComponentModel2
  <where/>
  	BuiltInTypeDefComps <subseteq/> typeDefComps
  </schema>
  
  <z:see names="ComponentModel2 BuiltInTypeDefComps"/>

  </z:notation>
  
  <z:notation name="DescriptionKey">

<p>
The component model contains a unique <comp>Description</comp> component.
</p>

<p>
Let <z:i>DescriptionKey</z:i> express this constraint
on the <comp>Description</comp> component:
</p>

<ulist>
<item><p>Let <z:i>descriptionComp</z:i> be the unique <comp>Description</comp> component.</p></item>
</ulist>

<schema xmlns="http://www.w3.org/2004/zml" name="DescriptionKey">
	ComponentModel2 <nl/>
	descriptionComp : Description
<where/>
	descriptionComps = {descriptionComp}
</schema>

<z:see names="ComponentModel2 Description"/>

<ulist>
<item><p>The component model contains a unique <comp>Description</comp> component.</p></item>
</ulist>
</z:notation>

<z:notation name="DescriptionCM">
<p>
Each component referred to by the properties of the <comp>Description</comp> component
must exist in the component model.
</p>
<p>
Let <z:i>DescriptionCM</z:i> express these referential integrity constraints
on the <comp>Description</comp> component:
</p>

<schema xmlns="http://www.w3.org/2004/zml" name="DescriptionCM">
	DescriptionTypeDefs <nl/>
	DescriptionKey
<where/>
	descriptionComp.interfaces = interfaceIds <nl/>
	descriptionComp.bindings = bindingIds <nl/>
	descriptionComp.services = serviceIds <nl/>
	descriptionComp.elementDeclarations = elementDeclIds <nl/>
	descriptionComp.typeDefinitions = typeDefIds
</schema>

<z:see names="DescriptionTypeDefs DescriptionKey"/>

<ulist>
<item><p>The <comp>Description</comp> component contains exactly the set of <comp>Interface</comp> components contained in the component model.</p></item>
<item><p>The <comp>Description</comp> component contains exactly the set of <comp>Binding</comp> components contained in the component model.</p></item>
<item><p>The <comp>Description</comp> component contains exactly the set of <comp>Service</comp> components contained in the component model.</p></item>
<item><p>The <comp>Description</comp> component contains exactly the set of <comp>Element Declaration</comp> components contained in the component model.</p></item>
<item><p>The <comp>Description</comp> component contains exactly the set of <comp>Type Definition</comp> components contained in the component model.</p></item>
</ulist>
</z:notation>

       <p>
       	The set of top-level components contained in the
       	<comp>Description</comp>
       	component associated with an initial WSDL 2.0 document
       	consists of the components defined in the initial document,
       	plus the components associated with the WSDL 2.0 documents
       	that the initial document includes, plus the components defined
       	by other WSDL 2.0 documents in the namespaces that the initial
       	document imports.
       	The component model
       	makes no distinction between the components that are defined
       	in the initial document versus those that are defined in the
       	included documents or imported namespaces.
       		However, any WSDL 2.0 document that contains component
       		definitions that refer by QName to WSDL 2.0 components
       		that belong to a different namespace MUST contain a
       		<el>wsdl:import</el>
       		<emph>element information item</emph>
       		for that namespace (see
       		<specref ref="imports"/>
       		).
       		Furthermore, all QName references, whether to the same or
       		to different namespaces must resolve to components (see
       		<specref ref="qnameres"/>
       		).
       </p>

       <p>When using the XML Schema language to describe type system components,
       the inclusion of <comp>Element Declaration</comp> components and
       <comp>Type Definition</comp> components in a <comp>Description</comp>
       component is governed by the rules in <specref ref="xsd-types"/>.</p>
       
       <p>In addition to WSDL 2.0 components and type system
       components, additional extension components MAY be added via
       extensibility <specref ref="language-extensibility"/>. Further,
       additional properties to WSDL 2.0 and type system components MAY
       also be added via extensibility.</p>
    </div3>

   <div3 id="Description_XMLRep">
      <head>XML Representation of Description Component</head>
<eg xml:space="preserve">
&lt;<b>description</b>
      targetNamespace="<emph>xs:anyURI</emph>" &gt;
  &lt;documentation /&gt;*
  [ &lt;import /&gt; | &lt;include /&gt; ]*
  &lt;types /&gt;?
  [ &lt;interface /&gt; | &lt;binding /&gt; | &lt;service /&gt; ]*
&lt;/<b>description</b>&gt;
</eg>
      <p>
	  WSDL 2.0 descriptions are represented in XML by one or more WSDL 2.0
	  Information Sets (Infosets), that is one or more
	  <el>description</el> <emph>element information item</emph>s.
	  A WSDL 2.0 Infoset contains
	  representations for a collection of WSDL 2.0 components that
	  share a common target namespace. A WSDL 2.0 Infoset that
	  contains one or more <el>wsdl:import</el> <emph>element information item</emph>s <specref ref="imports"/> corresponds to a collection with components
	  drawn from multiple target namespaces.</p>
 
       <p>The components directly defined or included within a <comp>Description</comp>
       component are said to belong to the same <emph>target
       namespace</emph>. The target namespace therefore groups a set
       of related component definitions and represents an unambiguous
       name for the intended semantics of the collection of components.
       <assert class="component" id="Description-1001" cr-id="Description-1201001" required="false">The value of the <att>targetNamespace</att> <emph>attribute information item</emph> SHOULD be dereferencable.</assert>
       <assert class="component" id="Description-1002" cr-id="Description-1201002" required="false">It SHOULD resolve to a human or machine
       processable document that directly or indirectly defines the
       intended semantics of those components.</assert>
       <assert class="component" id="Description-1003" cr-id="Description-1201003" required="false">It MAY resolve to a WSDL 2.0 document that provides
       service description information for that namespace.</assert></p>

         <p><assert class="document" id="Description-1004" cr-id="Description-1201004" required="true">If a WSDL 2.0 document is split into multiple WSDL 2.0 documents
         (which may be combined as needed via <specref ref="includes"/>), then the <att>targetNamespace</att> <emph>attribute information item</emph>
         SHOULD resolve to a master WSDL 2.0 document that includes all the
         WSDL 2.0 documents needed for that service description.</assert> This
         approach enables the WSDL 2.0 component designator fragment
         identifiers to be properly resolved.</p>

         <p>
         	Components that belong to imported namespaces have
         	different target namespace values than that of the
         	importing WSDL 2.0 document. Thus importing is the
         	mechanism to use components from one namespace in the
         	definition of components from another namespace.
         </p>

         <p>
         	Note that each WSDL 2.0 document or type system component of the
         	same kind must be uniquely identified by its qualified
         	name. That is, if two distinct components of the same kind
         	(<comp>Interface</comp>,
         	<comp>Binding</comp>, etc.) are in the same target namespace, then their QNames
         	MUST be unique. However, different kinds of components
         	(e.g., an
         	<comp>Interface</comp>
         	component and a
         	<comp>Binding</comp>
         	component) MAY have the same QName. Thus, QNames of
         	components must be unique within the space of those
         	components in a given target namespace.
         </p>

         <p>The <el>description</el> <emph>element information item</emph> has the following Infoset properties:</p>
	  <ulist>
	    <item><p>A [local name] of <el>description</el>.</p></item>
		<item><p>A [namespace name] of
		<attval>http://www.w3.org/ns/wsdl</attval>.</p></item>
		<item>
		  <p>
		  One or more <emph>attribute information item</emph>s amongst its [attributes] as follows:
		  </p>
		  <ulist>
		    <item>
		      <p>
			  A REQUIRED <att>targetNamespace</att> <emph>attribute information item</emph>
			  as described below in <specref ref="Description_targetnamespace_attribute"/>.
			  </p>
		    </item>
			<item>
			  <p>
			  Zero or more namespace qualified <emph>attribute information item</emph>s whose [namespace
			  name] is NOT
			  <attval>http://www.w3.org/ns/wsdl</attval>.
			  </p>
			</item>
		  </ulist>
		</item>
		<item>
		  <p>
		  <assert class="document" id="Description-1005" cr-id="Description-1201005" required="true">Zero or more <emph>element information item</emph>s amongst its [children], in order as
		  follows:</assert>
		  </p> 
		  <olist>
		    <item>
			  <p>
			  Zero or more <el>documentation</el> <emph>element information item</emph>s
			  (see <specref ref="eii-documentation"/>).
			  </p>
			</item>
			<item>
			  <p>Zero or more <emph>element information item</emph>s from among the following, in any
			  order:
			  </p>
			  <ulist>
			    <item>
				  <p>
				  Zero or more <el>include</el> <emph>element information item</emph>s (see <specref ref="includes"/>)
				  </p>
				</item>
			    <item>
				  <p>
				  Zero or more <el>import</el> <emph>element information item</emph>s (see <specref ref="imports"/>)
				  </p>
				</item>
                <item>
                  <p>
Zero or more namespace-qualified <emph>element information item</emph>s whose
[namespace name] is NOT
<attval>http://www.w3.org/ns/wsdl</attval>.
                  </p>
                </item>
			  </ulist>
			</item>
			<item>
			  <p>
			  An OPTIONAL <el>types</el> <emph>element information item</emph> (see <specref ref="eii-types"/>).
			  </p>
			</item>
			<item>
			  <p>
			  Zero or more <emph>element information item</emph>s from among the following, in any
			  order:
			  </p>
			  <ulist>
			    <item>
			      <p>
			      <el>interface</el> <emph>element information item</emph>s (see <specref ref="Interface_XMLRep"/>).
			      </p>
			    </item>
			    <item>
			      <p>
			      <el>binding</el> <emph>element information item</emph>s (see <specref ref="Binding_XMLRep"/>).
			      </p>
			    </item>
			    <item>
			      <p>
			      <el>service</el> <emph>element information item</emph>s (see <specref ref="Service_XMLRep"/>).
			      </p>
			    </item>
                <item>
                  <p>
Zero or more namespace-qualified <emph>element information item</emph>s whose
[namespace name] is NOT
<attval>http://www.w3.org/ns/wsdl</attval>.
                  </p>
                </item>
	          </ulist>
		    </item>
          </olist>
        </item>
      </ulist>

      <div4 id="Description_targetnamespace_attribute">
        <head><att>targetNamespace</att> <emph>attribute information item</emph></head>
		<p>The <att>targetNamespace</att> <emph>attribute information item</emph> defines the namespace affiliation
	    of top-level components defined in this
		<el>description</el> <emph>element information item</emph>. <comp>Interface</comp>,
		<comp>Binding</comp> and <comp>Service</comp> are top-level components. 
		</p>
	    <p>
		The <att>targetNamespace</att> <emph>attribute information item</emph> has the following
		Infoset properties:
		</p>
		<ulist>
		  <item><p>A [local name] of
		  <att>targetNamespace</att></p></item>
		  <item><p>A [namespace name] which has no value</p></item>
		</ulist>
		<p>
		The type of the <att>targetNamespace</att> <emph>attribute information item</emph> is
		<emph>xs:anyURI</emph>. 
		<assert class="document" id="Description-1006" cr-id="Description-0025" required="true">Its value 
        MUST be an absolute IRI (see <bibref ref="RFC3987"/>)
        and should be dereferencable.</assert>
		</p>

      </div4>
    </div3>

    <div3 id="Description_Mapping">
      <head>Mapping Description's XML Representation to Component
      Properties</head>
	  <p>
	  The mapping from the XML Representation of the <el>description</el> <emph>element information item</emph>
          (see <specref ref="Description_XMLRep"/>) to the properties of the <comp>Description</comp> component
		 is described
	  in <specref ref="tab_Description_Mapping"/>.
	  </p>
	  <table border="1" id="tab_Description_Mapping">
	    <caption>Mapping from XML Representation to Description Component Properties</caption>
		<col width="20%" span="1"/>
  		<col width="80%" span="1"/>
	    <tbody>
		  <tr>
		    <th rowspan="1" colspan="1">Property</th>
		    <th rowspan="1" colspan="1">Value</th>
		  </tr>
		  <tr>
		    <td rowspan="1" colspan="1"><prop comp="Description">interfaces</prop></td>
			<td rowspan="1" colspan="1">
			The set of <comp>Interface</comp> components corresponding to all
			the <el>interface</el> <emph>element information item</emph>s in the
			[children] of the <el>description</el> <emph>element information item</emph>,
			if any, plus any included (via <el>wsdl:include</el>) or imported (via <el>wsdl:import</el>)
			<comp>Interface</comp> components (see <specref ref="modularize"/>).
			</td>
		  </tr>
		  <tr>
		    <td rowspan="1" colspan="1"><prop comp="Description">bindings</prop></td>
			<td rowspan="1" colspan="1">
			The set of <comp>Binding</comp> components corresponding to all
			the <el>binding</el> <emph>element information item</emph>s in the [children]
			of the <el>description</el> <emph>element information item</emph>, if any,
			plus any included (via <el>wsdl:include</el>) or imported (via <el>wsdl:import</el>) <comp>Binding</comp>
			components (see <specref ref="modularize"/>).
			</td>
                  </tr>
		  <tr>
		    <td rowspan="1" colspan="1"><prop comp="Description">services</prop></td>
			<td rowspan="1" colspan="1">
			The set of <comp>Service</comp> components corresponding to all
			the <el>service</el> <emph>element information item</emph>s in the [children]
			of the <el>description</el> <emph>element information item</emph>, if any,
			plus any included (via <el>wsdl:include</el>) or imported (via <el>wsdl:import</el>) <comp>Service</comp>
			components (see <specref ref="modularize"/>).
		    </td>
		  </tr>
		  <tr>
		    <td rowspan="1" colspan="1"><prop comp="Description">element declarations</prop></td>
			<td rowspan="1" colspan="1">
			The set of <comp>Element Declaration</comp> components
			corresponding to all the element declarations
			defined as descendants of the <el>types</el>
			<emph>element information item</emph>, if any, plus any included (via <el>xs:include</el>) or imported (via <el>xs:import</el>) <comp>Element
			Declaration</comp> components. At a minimum this will include
			all the global element declarations defined by
			XML Schema <el>element</el> <emph>element information item</emph>s. It MAY
			also include any declarations from some other
			type system which describes the [local name],
			[namespace name], [attributes] and [children]
			properties of an <emph>element information item</emph>.
			<assert class="component" id="Types-1007" cr-id="Types-1201006" required="true">Each XML Schema element declaration MUST have a unique QName.</assert>
		    </td>
		  </tr>
		  <tr>
		    <td rowspan="1" colspan="1"><prop comp="Description">type definitions</prop></td>
			<td rowspan="1" colspan="1">
			The set of <comp>Type Definition</comp> components
			corresponding to all the type definitions
			defined as descendants of the <el>types</el>
			<emph>element information item</emph>, if any, plus any included (via <el>xs:include</el>) or imported (via <el>xs:import</el>) <comp>Type
			Definition</comp> components.
			
			<!-- starting a new paragraph if it had been allowed would have been good -->
			
			In addition, the built-in datatypes defined by
    		XML Schema Part 2: Datatypes Second Edition
    		<bibref ref="XMLSchemaP2"/>, namely the nineteen primitive datatypes
    		<el>xs:string</el>, <el>xs:boolean</el>, <el>xs:decimal</el>, <el>xs:float</el>, <el>xs:double</el>, <el>xs:duration</el>,
    		<el>xs:dateTime</el>, <el>xs:time</el>, <el>xs:date</el>, <el>xs:gYearMonth</el>, <el>xs:gYear</el>, <el>xs:gMonthDay</el>, <el>xs:gDay</el>,
    		<el>xs:gMonth</el>, <el>xs:hexBinary</el>, <el>xs:base64</el>, <el>xs:Binary</el>, <el>xs:anyURI</el>, <el>xs:QName</el>, <el>xs:NOTATION</el>,
    		and the twenty-five derived datatypes
    		<el>xs:normalizedString</el>, <el>xs:token</el>, <el>xs:language</el>, <el>xs:NMTOKEN</el>, <el>xs:NMTOKENS</el>, <el>xs:Name</el>,
    		<el>xs:NCName</el>, <el>xs:ID</el>, <el>xs:IDREF</el>, <el>xs:IDREFS</el>, <el>xs:ENTITY</el>, <el>xs:ENTITIES</el>, <el>xs:integer</el>,
    		<el>xs:nonPositiveInteger</el>, <el>xs:negativeInteger</el>, <el>xs:long</el>, <el>xs:int</el>, <el>xs:short</el>, <el>xs:byte</el>,
    		<el>xs:nonNegativeInteger</el>, <el>xs:unsignedLong</el>, <el>xs:unsignedInt</el>,
    		<el>xs:unsignedShort</el>, <el>xs:unsignedByte</el>, <el>xs:positiveInteger</el>.
    		
    		The set MAY also include any definitions from some
			other type system which describes the [attributes]
			and [children] properties of an <emph>element information item</emph>.
			
			<assert class="component" id="Types-1008" cr-id="Types-0026" required="true">Each XML Schema type definition MUST have a unique QName.</assert>
		    </td>
		  </tr>
		</tbody>
	  </table>
    </div3>
  </div2>

  <div2 id="Interface">
    <head>Interface</head>

    <div3 id="Interface_details">
      <head>The Interface Component</head>
      
        <p> An <comp>Interface</comp> component describes sequences of messages
        that a service sends and/or receives. It does this by grouping
        related messages into operations. An operation is a sequence
        of input and output messages, and an interface is a set of
        operations.</p>

        <p>
        An interface can optionally extend one or more other interfaces.
        <assert class="component" id="Interface-1009" cr-id="Interface-0027" required="true">
        	To avoid circular definitions, an interface MUST NOT appear
        	as an element of the set of interfaces it extends, either
        	directly or indirectly.
        </assert>
        The set of operations available in an interface includes all the
        operations defined by the interfaces it extends directly or indirectly,
        together with any operations it directly defines.
        The operations directly defined
        on an interface are referred to as the
        <emph>declared</emph> operations of the interface.
	In the process, operation components that are
	equivalent per <specref ref="compequiv"/> are treated as one single component.
	The interface extension mechanism behaves in a similar
	way for all other components that can be defined inside
	an interface, namely <comp>Interface Fault</comp>
	components.</p>
	
        <p> Interfaces are named constructs and can be referred to by
        QName (see <specref ref="qnameres"/>). For instance, <comp>Binding</comp>
        components refer to interfaces in this way.  </p>

        <p>The properties of the <compdef>Interface</compdef> component are as
        follows:</p>

	  <ulist>
	    <item><p><propdef comp="Interface">name</propdef> REQUIRED. An <emph>xs:QName</emph>.</p></item>

        <item><p><propdef comp="Interface">extended interfaces</propdef> OPTIONAL. A set of declared <comp>Interface</comp>
        components which this interface extends.</p> </item>

  	    <item><p><propdef comp="Interface">interface faults</propdef> OPTIONAL. The set of declared <comp>Interface Fault</comp>
  	    components. 
  	    Note that the namespace name of the <prop comp="Interface Fault">name</prop> property of each <comp>Interface Fault</comp>
  	    in this set is the same as the namespace name of the <prop comp="Interface">name</prop> property of this
  	    <comp>Interface</comp> component.
  	    </p></item>

  	    <item><p><propdef comp="Interface">interface operations</propdef> OPTIONAL. A set of declared <comp>Interface Operation</comp>
  	    components.
  	    Note that the namespace name of the <prop comp="Interface Operation">name</prop> property of each <comp>Interface Operation</comp>
  	    in this set is the same as the namespace name of the <prop comp="Interface">name</prop> property of this
  	    <comp>Interface</comp> component.
  	    </p></item>

	  </ulist>
	  
		<z:notation name="Interface">	
		<p>Let <z:i>Interface</z:i> be the set of all <comp>Interface</comp> components:</p>
		<ulist>
		<item><p>Let <z:i>allExtendedInterfaces</z:i> be the set off all interfaces that are extended directly or indirectly by this interface.</p></item>
		<item><p>Let <z:i>allInterfaceFaults</z:i> be the set of all faults that are directly or indirectly on this interface.</p></item>
		<item><p>Let <z:i>allInterfaceOperations</z:i> be the set of all operations that are directly or indirectly on this interface.</p></item>
		</ulist>
		
		<schema xmlns="http://www.w3.org/2004/zml" name="Interface">
			Base <nl/>
			name : QName <nl/>
			extendedInterfaces : <power/> ID <nl/>
			interfaceFaults : <power/> ID <nl/>
			interfaceOperations : <power/> ID
		<also/>
			allExtendedInterfaces : <power/> ID <nl/>
			allInterfaceFaults : <power/> ID <nl/>
			allInterfaceOperations : <power/> ID
		<where/>
			extendedInterfaces <subseteq/> allExtendedInterfaces <nl/>
			interfaceFaults <subseteq/> allInterfaceFaults <nl/>
			interfaceOperations <subseteq/> allInterfaceOperations
		</schema>
		
		<z:see names="Base QName ID"/>
		
		</z:notation>

	  <z:notation name="InterfaceRI">
	  
	  <p>
	  Each component referenced by an <comp>Interface</comp> component must exist in the component model.
	  </p>
	  <p>
	  Let <z:i>InterfaceRI</z:i> express the referential integrity constraints on the <comp>Interface</comp> component:
	  </p>
	  
	  <schema xmlns="http://www.w3.org/2004/zml" name="InterfaceRI">
	  	ComponentModel2
	  	<where/>
	  	<forall/> Interface | <theta/>Interface <in/> interfaceComps @ <nl/>
	  	<t1/>	BaseValid <land/> <nl/>
	  	<t1/>	extendedInterfaces <subset/> interfaceIds <land/> <nl/>
	  	<t1/>	interfaceFaults <subseteq/> interfaceFaultIds <land/> <nl/>
	  	<t1/>	interfaceOperations <subseteq/> interfaceOpIds
	  </schema>
	  
	  <z:see names="ComponentModel2 Interface BaseValid"/>
	  
	  <p>
	  This Z schema introduces some additional notation.
	  The universal quantifier <z:math xmlns="http://www.w3.org/2004/zml"><forall/>Interface</z:math> declares each field that is part of the <z:i>Interface</z:i>
	  schema as an in-scope variable and constrains them to satisfy the rules for <z:i>Interface</z:i>.
	  The expression <z:math xmlns="http://www.w3.org/2004/zml"><theta/>Interface</z:math> assembles these variables into <z:i>Interface</z:i> record
	  or struct.
	  The expression <z:math xmlns="http://www.w3.org/2004/zml"><theta/>Interface <in/> interfaceComps</z:math> constrains the <z:i>Interface</z:i> record
	  to exist in the component model.
	  </p>
	  
	  <ulist>
	  <item><p>Every <comp>Interface</comp> component satisfies the base validity constraints.</p></item>
	  <item><p>The <comp>Interface</comp> components extended by each <comp>Interface</comp> component are contained in the component model.</p></item>
	  <item><p>The <comp>Interface Fault</comp> components of each <comp>Interface</comp> component are contained in the component model.</p></item>
	  <item><p>The <comp>Interface Operation</comp> components of each <comp>Interface</comp> component are contained in the component model.</p></item>
	  </ulist>
	  
	  </z:notation>
	  
	  <p><assert class="component" id="Interface-1010" cr-id="Interface-0030" required="true">For each <comp>Interface</comp> component in the <prop comp="Description">interfaces</prop>
	  property of a <comp>Description</comp> component, the <prop comp="Interface">name</prop> property MUST be unique.</assert>
	  </p>
	  
       <z:notation name="InterfaceKey">
			<p>
			       Let <z:i>InterfaceKey</z:i> express the
			       QName uniqueness constraint on the <comp>Interface</comp> component:
			</p>
			
			<schema xmlns="http://www.w3.org/2004/zml" name="InterfaceKey">
				ComponentModel2
			<where/>
				<forall/> x, y : interfaceComps | <nl/>
				<t1/>	x.name = y.name @ x = y
			</schema>
			
			<z:see names="ComponentModel2"/>
			
			<ulist>
			<item><p>No two <comp>Interface</comp> components have the same <prop comp="Interface">name</prop> property.</p></item>
			</ulist>
		</z:notation>

	  <z:notation name="InterfaceParent">
	  
	  <p>An <comp>Interface</comp> component contains nested <comp>Interface Operation</comp> and <comp>Interface Fault</comp> components.
	  These components MUST have the <comp>Interface</comp> component as their parent.</p>
	  
	  <p>
	  	Let
	  	<z:i>InterfaceParent</z:i>
	  	express the constraints on the
	  	<prop comp="">parent</prop>
	  	properties of the nested components of an
	  	<comp>Interface</comp>
	  	component:
	  </p>

	  <schema xmlns="http://www.w3.org/2004/zml" name="InterfaceParent">
	  	ComponentModel2
	  <where/>
	  	<forall/> i : interfaceComps; <nl/>
	  	<t1/>	if : interfaceFaultComps; <nl/>
	  	<t1/>	io : interfaceOpComps @ <nl/>
	  	<t1/>	if.id <in/> i.interfaceFaults <iff/> if.parent = i.id <land/> <nl/>
	  	<t1/>	io.id <in/> i.interfaceOperations <iff/> io.parent = i.id
	  </schema>
	  
	  <z:see names="ComponentModel2"/>
	  
	  <ulist>
	  	<item>
	  		<p>
	  			The set of <comp>Interface Fault</comp> components contained by an
	  			<comp>Interface</comp> component is exactly the set of <comp>Interface
	  			Fault</comp> components that have that <comp>Interface</comp> component as
	  			their parent.
	  		</p>
	  	</item>
	  	<item>
	  		<p>
	  			The set of <comp>Interface Operation</comp> components contained by an
	  			<comp>Interface</comp> component is exactly the set of <comp>Interface
	  			Operation</comp> components that have that <comp>Interface</comp> component as
	  			their parent.
	  		</p>
	  	</item>
	  </ulist>

	  </z:notation>
	  
	  <z:notation name="InterfaceAllExtendedInterfaces">

	  <p>
	  The set of all extended interfaces that are available on an <comp>Interface</comp> component consist of those
	  that are declared on the component and those that are available on its extended interfaces.
	  </p>
	  
	  <p>
	  Let <z:i>InterfaceAllExtendedInterfaces</z:i> express this definition:
	  </p>
	  
	  <schema xmlns="http://www.w3.org/2004/zml" name="InterfaceAllExtendedInterfaces">
	  	ComponentModel2 <nl/>
	  <where/>
	  	<forall/> i : interfaceComps @ <nl/>
	  	<t1/>	i.allExtendedInterfaces = i.extendedInterfaces <cup/> <nl/>
	  	<t2/>		{~x : interfaceComps; y : ID | <nl/>
	  	<t3/>			x.id <in/> i.extendedInterfaces <land/> <nl/>
	  	<t3/>			y <in/> x.allExtendedInterfaces @ y~}
	  </schema>
	  
	  <z:see names="ComponentModel2"/>
	  
	  <ulist>
	  	<item>
	  		<p>
	  			An <comp>Interface</comp> component directly or indirectly extends an
	  			<comp>Interface</comp> component if it directly extends it, or if
	  			an <comp>Interface</comp> component that it directly extends,
	  			directly or indirectly extends it.
	  		</p>
	  	</item>
	  </ulist>
	  
	  </z:notation>
	  
	  <z:notation name="InterfaceExtendsAcyclic">
	  
	  	<p>An <comp>Interface</comp> component MUST NOT directly or indirectly extend itself.</p>
	  	
	  	<p>Let <z:i>InterfaceExtendsAcyclic</z:i> express this constraint:</p>
	  	
	  <schema xmlns="http://www.w3.org/2004/zml" name="InterfaceExtendsAcyclic">
	  	ComponentModel2
	  <where/>
	  	<forall/> i : interfaceComps @ <nl/>
	  	<t1/>	i.id <notin/> i.allExtendedInterfaces
	  </schema>
	  
	  <z:see names="ComponentModel2"/>
	  	
	  </z:notation>
	  
	  <z:notation name="InterfaceAllInterfaceOperations">	  

	  <p>
	  	The set of all <comp>Interface Operation</comp> components that are available on an
	  	<comp>Interface</comp> component consist of those that are contained by the
	  	<comp>Interface</comp> component and those that are available on <comp>Interface</comp> components
	  	that it directly or indirectly extends.
	  </p>

	  <p>
	  Let <z:i>InterfaceAllInterfaceOperations</z:i> express this definition:
	  </p>
	  
	  <schema xmlns="http://www.w3.org/2004/zml" name="InterfaceAllInterfaceOperations">
	  	ComponentModel2 <nl/>
	  <where/>
	  	<forall/> i : interfaceComps @ <nl/>
	  	<t1/>	i.allInterfaceOperations = i.interfaceOperations <cup/> <nl/>
	  	<t2/>		{~x : interfaceComps; y : ID | <nl/>
	  	<t3/>			x.id <in/> i.allExtendedInterfaces <land/> <nl/>
	  	<t3/>			y <in/> x.interfaceOperations @ y~}
	  </schema>
	  
	  <z:see names="ComponentModel2"/>
	  
	  <ulist>
	  	<item>
	  		<p>
	  			An <comp>Interface Operation</comp> component is available on an <comp>Interface</comp>
	  			component if it is contained by the <comp>Interface</comp>
	  			component or it is available on an <comp>Interface</comp>
	  			component that this <comp>Interface</comp> component directly or
	  			indirectly extends.
	  		</p>
	  	</item>
	  </ulist>
	  
	  </z:notation>
	  	  
	  <z:notation name="InterfaceAllInterfaceFaults">	  

	  <p>
	  	The set of all <comp>Interface Operation</comp> components that are available on an
	  	<comp>Interface</comp> component consist of those that are contained by the
	  	<comp>Interface</comp> component and those that are available on <comp>Interface</comp> components
	  	that it directly or indirectly extends.
	  </p>

	  <p>
	  Let <z:i>InterfaceAllInterfaceFaults</z:i> express this definition:
	  </p>
	  
	  <schema xmlns="http://www.w3.org/2004/zml" name="InterfaceAllInterfaceFaults">
	  	ComponentModel2 <nl/>
	  <where/>
	  	<forall/> i : interfaceComps @ <nl/>
	  	<t1/>	i.allInterfaceFaults = i.interfaceFaults <cup/> <nl/>
	  	<t2/>		{~x : interfaceComps; y : ID | <nl/>
	  	<t3/>			x.id <in/> i.allExtendedInterfaces <land/> <nl/>
	  	<t3/>			y <in/> x.interfaceFaults @ y~}
	  </schema>
	  
	  <z:see names="ComponentModel2"/>
	  
	  <ulist>
	  	<item>
	  		<p>
	  			An <comp>Interface Fault</comp> component is available on an <comp>Interface</comp>
	  			component if it is contained by the <comp>Interface</comp>
	  			component or it is available on an <comp>Interface</comp>
	  			component that this <comp>Interface</comp> component directly or
	  			indirectly extends.
	  		</p>
	  	</item>
	  </ulist>
	  
	  </z:notation>
	  
	  <z:notation name="InterfaceCM">
	  
	  	<p>
	  		Let
	  		<z:i>InterfaceCM</z:i>
	  		be the conjunction of all the component model constraints
	  		on <comp>Interface</comp> components.
	  	</p>

	  	<zed xmlns="http://www.w3.org/2004/zml">
			InterfaceCM <defs/> <nl/>
			<t1/>	InterfaceRI <land/> <nl/>
			<t1/>	InterfaceKey <land/> <nl/>
			<t1/>	InterfaceParent <land/> <nl/>
			<t1/>	InterfaceAllExtendedInterfaces <land/> <nl/>
			<t1/>	InterfaceExtendsAcyclic <land/> <nl/>
			<t1/>	InterfaceAllInterfaceOperations <land/> <nl/>
			<t1/>	InterfaceAllInterfaceFaults
	  	</zed>
	  	
	  	<z:see names="InterfaceRI InterfaceKey InterfaceParent InterfaceAllExtendedInterfaces      InterfaceExtendsAcyclic InterfaceAllInterfaceOperations InterfaceAllInterfaceFaults"/>
	  		
	  </z:notation>

    </div3>

    <div3 id="Interface_XMLRep">
      <head>XML Representation of Interface Component</head>

<eg xml:space="preserve">&lt;description&gt;
  &lt;<b>interface</b>
        name="<emph>xs:NCName</emph>" 
        extends="<emph>list of xs:QName</emph>"?
        styleDefault="<emph>list of xs:anyURI</emph>"? &gt;
    &lt;documentation /&gt;*
    [ &lt;fault /&gt; | &lt;operation /&gt; ]*
  &lt;/<b>interface</b>&gt;
&lt;/description&gt;
</eg>

      <p>
	  The XML representation for an <comp>Interface</comp> component is
	  an <emph>element information item</emph> with the following Infoset properties:
	  </p>
	  <ulist>
	    <item><p>A [local name] of <el>interface</el></p></item>
	    <item><p>A [namespace name] of <attval>http://www.w3.org/ns/wsdl</attval></p></item>
		<item><p>One or more <emph>attribute information item</emph>s amongst its [attributes] as
		follows:</p>
		<ulist>
		<item>
		  <p>
		  A REQUIRED <att>name</att> <emph>attribute information item</emph> as described below
		  in <specref ref="Interface_name_attribute"/>.
		  </p>
		</item>
		<item>
		  <p>
		  An OPTIONAL <att>extends</att> <emph>attribute information item</emph> 
		  as described below in <specref ref="Interface_extends_attribute"/>.
		  </p>
		</item>
		<item>
		  <p>
		  An OPTIONAL <att>styleDefault</att> <emph>attribute information item</emph> as
		  described below in <specref ref="Interface_styleDefault_attribute"/>.
		  </p>
		</item>
		<item>
		  <p>
		  Zero or more namespace qualified <emph>attribute information item</emph>s whose
		  [namespace name]
		  is NOT <attval>http://www.w3.org/ns/wsdl</attval>.
		  </p>
		</item>
		</ulist>
		</item>
		<item>
		  <p>Zero or more <emph>element information item</emph>s amongst its [children], in order, as
		  follows:</p>
		  <olist>
		    <item>
		      <p>
		      Zero or more <el>documentation</el> <emph>element information item</emph>s (see <specref ref="eii-documentation"/>).
		      </p>
		    </item>
			<item><p>Zero or more <emph>element information item</emph>s from among the following, in
			any order:</p>
			<ulist>
		    <item>
			  <p>
			  Zero or more <el>fault</el> <emph>element information item</emph>s <specref ref="InterfaceFault_XMLRep"/>.
			  </p>
			</item>
		    <item>
			  <p>
			  Zero or more <el>operation</el> <emph>element information item</emph>s <specref ref="InterfaceOperation_XMLRep"/>.
			  </p>
			</item>
            <item>
              <p>
Zero or more namespace-qualified <emph>element information item</emph>s whose
[namespace name] is NOT
<attval>http://www.w3.org/ns/wsdl</attval>.
              </p>
            </item>
			</ulist>
		  </item>
		  </olist>
        </item>
      </ulist>

      <div4 id="Interface_name_attribute">
        <head><att>name</att> <emph>attribute information item</emph> with <el>interface</el> [owner element]</head>
	    <p>
		The <att>name</att> <emph>attribute information item</emph> together with the
		<att>targetNamespace</att> <emph>attribute information item</emph> of the [parent] <el>description</el>
		<emph>element information item</emph> forms the QName of the interface.
		</p>
		<p>
		The <att>name</att> <emph>attribute information item</emph> has the following Infoset properties:
		</p>
		<ulist>
		  <item><p>A [local name] of <att>name</att></p></item>
		  <item><p>A [namespace name] which has no value</p></item>
		</ulist>
		<p>
		The type of the <att>name</att> <emph>attribute information item</emph> is <emph>xs:NCName</emph>.
		</p>
      </div4>

      <div4 id="Interface_extends_attribute">
        <head><att>extends</att> <emph>attribute information item</emph></head>
	    <p>
		The <att>extends</att> <emph>attribute information item</emph> lists the interfaces that this interface
		derives from.
		</p>
		<p>
		The <att>extends</att> <emph>attribute information item</emph> has the following Infoset properties:
		</p>
		<ulist>
		  <item><p>A [local name] of <att>extends</att></p></item>
		  <item><p>A [namespace name] which has no value</p></item>
		</ulist>
		<p>
		The type of the <att>extends</att> <emph>attribute information item</emph> is a whitespace-separated list of <emph>xs:QName</emph>.
		</p>
		<p>
		<assert class="component" id="Interface-1011" cr-id="Interface-0028" required="true">The list of <emph>xs:QName</emph> in an <att>extends</att> <emph>attribute information item</emph> MUST NOT contain duplicates.</assert>
		</p>
      </div4>

      <div4 id="Interface_styleDefault_attribute">
        <head><att>styleDefault</att> <emph>attribute information item</emph></head>
	    <p>
		The <att>styleDefault</att> <emph>attribute information item</emph> indicates the
		default style (see <specref ref="InterfaceOperationStyle"/>) used to construct the
		<prop comp="Interface Message Reference">element declaration</prop> properties of 
		<prop comp="Interface Operation">interface message references</prop> of all
		operations contained within the [owner element]
		<el>interface</el>.
		</p>

		<p>
		The <att>styleDefault</att> <emph>attribute information item</emph> has the following
		Infoset properties:
		</p>
		<ulist>
		  <item><p>A [local name] of
		  <att>styleDefault.</att></p></item>

		  <item><p>A [namespace name] which has no
		  value.</p></item>
		</ulist>
		<p>
		The type of the <att>styleDefault</att> <emph>attribute information item</emph> is
		<emph>list of xs:anyURI</emph>. 
		<assert class="document" id="Interface-1012" cr-id="Interface-0031" required="true">Its value, if present, MUST contain
		absolute IRIs (see <bibref ref="RFC3987"/>).</assert>
		</p>

      </div4>

    </div3>

    <div3 id="Interface_Mapping">
	  <head>Mapping Interface's XML Representation to Component Properties</head>
	  <p>
	  The mapping from the XML Representation of
	  the <el>interface</el> <emph>element information item</emph> (see <specref ref="Interface_XMLRep"/>)
	  to the properties of the <comp>Interface</comp> component is
	  as described in <specref ref="tab_Interface_Mapping"/>.
	  </p>

	  <table border="1" id="tab_Interface_Mapping">
	    <caption>Mapping from XML Representation to Interface Component Properties</caption>
		<col width="20%" span="1"/>
  		<col width="80%" span="1"/>
	    <tbody>
		  <tr>
		    <th rowspan="1" colspan="1">Property</th>
		    <th rowspan="1" colspan="1">Value</th>
		  </tr>
		  <tr>
		    <td rowspan="1" colspan="1"><prop comp="Interface">name</prop></td>
			<td rowspan="1" colspan="1">The QName whose local name is actual value of the <att>name</att> <emph>attribute information item</emph>
				and whose namespace name is the actual value of the	<att>targetNamespace</att> <emph>attribute information item</emph>
			of the [parent] <el>description</el>	<emph>element information item</emph>
			</td>
		  </tr>
		  <tr>
		    <td rowspan="1" colspan="1"><prop comp="Interface">extended interfaces</prop></td>
			<td rowspan="1" colspan="1">
			The set of <comp>Interface</comp> components resolved to
			by the values in the <att>extends</att> <emph>attribute information item</emph>,
			if any (see <specref ref="qnameres"/>).
			</td>
		  </tr>
		  <tr>
		    <td rowspan="1" colspan="1"><prop comp="Interface">interface faults</prop></td>
			<td rowspan="1" colspan="1">
			The set of <comp>Interface Fault</comp> components
			corresponding to the <el>fault</el> <emph>element information item</emph>s in
			[children], if any.
			</td>
                  </tr>
		  <tr>
		    <td rowspan="1" colspan="1"><prop comp="Interface">interface operations</prop></td>
			<td rowspan="1" colspan="1">
			The set of <comp>Interface Operation</comp> components
			corresponding to the <el>operation</el> <emph>element information item</emph>s
			in [children], if any.
			</td>
                  </tr>
		</tbody>
	  </table>

	  <p>Recall that, per <specref ref="Interface_details"/>, the
	  <comp>Interface</comp> components in the <prop comp="Interface">extended interfaces</prop> property
	  of a given <comp>Interface</comp> component MUST NOT contain that
	  <comp>Interface</comp> component in any of their <prop comp="Interface">extended interfaces</prop>
	  properties, that is to say, recursive extension of
	  interfaces is disallowed.  </p>

    </div3>
  </div2>

  <div2 id="InterfaceFault">
    <head>Interface Fault</head>

    <div3 id="InterfaceFault_details">
      <head>The Interface Fault Component</head> 
        
        <p>A fault is an event that occurs during the execution of a
        message exchange that disrupts the normal flow of
        messages.</p>
 
        <p>A fault is typically raised when a party is unable to
        communicate an error condition inside the normal message flow,
        or a party wishes to terminate a message exchange. A fault
        message may be used to communicate out of band information
        such as the reason for the error, the origin of the fault, as
        well as other informal diagnostics such as a program stack
        trace.</p>

        <p>An <comp>Interface Fault</comp> component describes a fault that MAY
        occur during invocation of an operation of the interface.  The
        <comp>Interface Fault</comp> component declares an abstract fault by naming
        it and indicating the contents of the fault message. When and
        how the fault message flows is indicated by the <comp>Interface
        Operation</comp> component.</p>

        <p>The <comp>Interface Fault</comp> component provides a clear mechanism to
        name and describe the set of faults an interface may
        generate. This allows operations to easily identify the
        individual faults they may generate by name.  This mechanism
        allows the ready identification of the same fault occurring
        across multiple operations and referenced in multiple bindings
        as well as reducing duplication of description for an
        individual fault.</p>
        
        <p>
        	Faults other than the ones described in the
        	<comp>Interface</comp>
        	component may also be generated at run-time, i.e. faults are
        	an open set. The
        	<comp>Interface</comp>
        	component describes faults that have application level
        	semantics, i.e. that the client or service is expected to
        	handle, and potentially recover from, as part of the
        	application processing logic. For example, an
        	<comp>Interface</comp>
        	component that accepts a credit card number may describe
        	faults that indicate the credit card number is invalid, has
        	been reported stolen, or has expired. The
        	<comp>Interface</comp>
        	component does not describe general system faults such as
        	network failures, out of memory conditions, out of disk
        	space conditions, invalid message formats, etc., although
        	these faults may be generated as part of the message
        	exchange. Such general system faults can reasonably be
        	expected to occur in any message exchange and explicitly
        	describing them in an
        	<comp>Interface</comp>
        	component is therefore uninformative.
        </p>

        <p>The properties of the <compdef>Interface Fault</compdef> component are
        as follows:</p>
        <ulist>
        	<item>
        		<p>
        			<propdef comp="Interface Fault">name</propdef> REQUIRED. An
        			<emph>xs:QName</emph>.
        		</p>
        	</item>

            <item><p><propdef comp="Interface Fault">message content model</propdef> REQUIRED.
            <assert class="component" id="InterfaceFault-1013" cr-id="InterfaceFault-1205001" required="true">An
	    <emph>xs:token</emph> with one of the values
	    <emph>#any</emph>, <emph>#none</emph>, <emph>#other</emph>,
	    or
	    <emph>#element</emph>.</assert>  A value of <emph>#any</emph>
	    indicates that the fault content is any single
	    element. A value of <emph>#none</emph> indicates there is
	    no fault content. 
	    A value of <emph>#other</emph> indicates that the fault
	    content is described by some other extension property that
	    references a declaration in a non-XML extension type system.
	    A value of <emph>#element</emph>
	    indicates that the fault consists of a single element
	    described by the global element declaration referenced by the 
	    <prop comp="Interface Fault">element declaration</prop> property. 
	    This property is used only when
	    the fault is described using an XML-based data
	    model.</p></item>

        	<item>
        		<p>
        			<propdef comp="Interface Fault">element declaration</propdef> OPTIONAL. A reference to an <comp>Element
        			Declaration</comp> component in the <prop comp="Description">element declarations</prop> property
        			of the <comp>Description</comp> component.
        			This element represents the content or
        			“payload”
        			of the fault.
            <assert class="component" id="InterfaceFault-1014" cr-id="InterfaceFault-0041" required="true">When
            the <prop comp="Interface Fault">message content model</prop> property has the value
            <emph>#any</emph> or <emph>#none</emph> the 
            <prop comp="Interface Fault">element declaration</prop>
            property MUST be empty.</assert>
        		</p>
        	</item>

        	<item>
        		<p>
        			<propdef comp="Interface Fault">parent</propdef> REQUIRED. The <comp>Interface</comp> component that
        			contains this component in its <prop comp="Interface">interface faults</prop>
        			property.
        		</p>
        	</item>
        </ulist>

        <z:notation name="InterfaceFault">	
        
		<p>
			Let
			<z:i>InterfaceFault</z:i>
			be the set of all <comp>Interface Fault</comp> components:
		</p>

		<schema xmlns="http://www.w3.org/2004/zml" name="InterfaceFault">
			NestedBase <nl/>
			name : QName <nl/>
			elementDeclaration : OPTIONAL[ID]
		</schema>
		
		<z:see names="NestedBase QName OPTIONAL ID"/>
		
		</z:notation>

	  <z:notation name="InterfaceFaultRI">
	  
	  <p>
	  Each component referenced by an <comp>Interface Fault</comp> component must exist in the component model.
	  </p>
	  <p>
	  Let <z:i>InterfaceFaultRI</z:i> express the referential integrity constraints on the <comp>Interface Fault</comp> component:
	  </p>
	  
	  <schema xmlns="http://www.w3.org/2004/zml" name="InterfaceFaultRI">
	  	ComponentModel2
	  	<where/>
	  	<forall/> InterfaceFault | <theta/>InterfaceFault <in/> interfaceFaultComps @ <nl/>
	  	<t1/>	NestedBaseValid <land/> <nl/>
	  	<t1/>	elementDeclaration <subseteq/> elementDeclIds
	  </schema>
	  
	  <z:see names="ComponentModel2 InterfaceFault NestedBaseValid"/>
	  
	  <ulist>
	  <item><p>Every <comp>Interface Fault</comp> component satisfies the base validity constraints.</p></item>
	  <item><p>The <comp>Element Declaration</comp> component of each <comp>Interface Fault</comp> component is contained in the component model.</p></item>
	  </ulist>
	  
	  </z:notation>

	  <p>
	  	For each
	  	<comp>Interface Fault</comp>
	  	component in the
	  	<prop comp="Interface">interface faults</prop>
	  	property of an
	  	<comp>Interface</comp>
	  	component, the
	  	<prop comp="Interface Fault">name</prop>
	  	property must be unique. Note that this constraint is enforced
	  	by the normative WSDL 2.0 XML schema.
	  </p>

	  <p><comp>Interface Fault</comp> components are uniquely identified by
    the QName of the enclosing <comp>Interface</comp> component and QName of the
    <comp>Interface Fault</comp> component itself.</p>
    
       <z:notation name="InterfaceFaultKey">
			<p>
			       Let <z:i>InterfaceFaultKey</z:i> express the
			       QName uniqueness constraint on the <comp>Interface Fault</comp> component:
			</p>
			
			<schema xmlns="http://www.w3.org/2004/zml" name="InterfaceFaultKey">
				ComponentModel2
			<where/>
				<forall/> x, y : interfaceFaultComps | <nl/>
				<t1/>	x.parent = y.parent <land/> <nl/>
				<t1/>	x.name = y.name @ x = y
			</schema>
			
			<z:see names="ComponentModel2"/>
			
			<ulist>
				<item>
					<p>
						No two <comp>Interface Fault</comp> components contained by
						the same <comp>Interface</comp> component have the same
						<prop comp="Interface Fault">name</prop> property.
					</p>
				</item>
			</ulist>
       </z:notation>

        <note>
        	<p>
        		Despite having a
        		<prop comp="Interface Fault">name</prop>
        		property,
        		<comp>Interface Fault</comp>
        		components cannot be identified solely by their QName.
        		Indeed, two
        		<comp>Interface</comp>
        		components whose
        		<prop comp="Interface">name</prop>
        		property value has the same namespace name, but
        		different local names, can contain
        		<comp>Interface Fault</comp>
        		components with the same
        		<prop comp="Interface Fault">name</prop>
        		property value. Thus, the
        		<prop comp="Interface Fault">name</prop>
        		property of
        		<comp>Interface Fault</comp>
        		component is not sufficient to form the unique identity
        		of an
        		<comp>Interface Fault</comp>
        		component. A method for uniquely identifying components
        		is defined in
        		<specref ref="frag-ids"/>.
        		See
        		<specref ref="wsdl.interfaceFault"/>
        		for the definition of the fragment identifier for the
        		<comp>Interface Fault</comp>
        		component.
        	</p>
        </note>

	<p>
	<assert class="component" id="InterfaceFault-1015" cr-id="InterfaceFault-0033" required="true">
		In cases where, due to an interface extending one or more other
		interfaces, two or more
		<comp>Interface Fault</comp>
		components have the same value for their
		<prop comp="Interface Fault">name</prop>
		property, then the component models of those
		<comp>Interface Fault</comp>
		components MUST be equivalent (see
		<specref ref="compequiv"/>).
	</assert>
	If the
	<comp>Interface Fault</comp> components are
	equivalent then they are considered to collapse into a single
	component. 
	Within the same <comp>Interface</comp> component, if two <comp>Interface Fault</comp>
	components are not equivalent then their <prop comp="Interface Fault">name</prop>
	properties MUST NOT be equal.</p>

	<z:notation name="InterfaceFaultNameUnique">
	
		<p>Let <z:i>InterfaceFaultNameUnique</z:i> express the uniqueness constraint
		on the <prop comp="Interface Fault">name</prop> property of an <comp>Interface Fault</comp> component
		among all the <comp>Interface Fault</comp> components available in an <comp>Interface</comp> component:</p>
		
			<schema xmlns="http://www.w3.org/2004/zml" name="InterfaceFaultNameUnique">
				ComponentModel2
			<where/>
				<forall/> i : interfaceComps; <nl/>
				<t1/>	x, y : interfaceFaultComps | <nl/>
				<t1/>	x.id <in/> i.allInterfaceFaults <land/> <nl/>
				<t1/>	y.id <in/> i.allInterfaceFaults <land/> <nl/>
				<t1/>	x.name = y.name @ x = y
			</schema>
			
			<z:see names="ComponentModel2"/>
			
			<ulist>
				<item>
					<p>
						No two <comp>Interface Fault</comp> components among all
						those available in the same <comp>Interface</comp>
						component have the same <prop comp="Interface Fault">name</prop> property.
					</p>
				</item>
			</ulist>

	</z:notation>

      <p>Note that, due to the above rules, if two interfaces that
	  have the same value for the namespace name of their <prop comp="Interface">name</prop> property
	  also have one or more faults that have the same value
	  for their <prop comp="Interface Fault">name</prop> property, then those two interfaces cannot
	  both form part of the derivation chain of a derived
	  interface unless those faults are the same
	  fault.</p>
	  
	  <p><assert class="component" id="InterfaceFault-1016" cr-id="InterfaceFault-1203001" required="false">For the above reason, it is considered good practice to
	  ensure, where necessary, that the local name of the <prop comp="Interface Fault">name</prop> property of
	  <comp>Interface Fault</comp> components within a namespace SHOULD be
	  unique, thus allowing such derivation to occur without
	  inadvertent error.</assert></p>

        <p>If a type system NOT based on the XML Infoset <bibref ref="XMLInfoSet"/> is in use (as considered in <specref ref="other-types"/>) then additional properties would need to
        be added to the <comp>Interface Fault</comp> component (along with extension
        attributes to its XML representation) to allow associating
        such message types with the message reference.</p>

	  <z:notation name="InterfaceFaultCM">
	  
	  	<p>
	  		Let
	  		<z:i>InterfaceFaultCM</z:i>
	  		be the conjunction of all the component model constraints
	  		on <comp>Interface Fault</comp> components.
	  	</p>

	  	<zed xmlns="http://www.w3.org/2004/zml">
			InterfaceFaultCM <defs/> <nl/>
			<t1/>	InterfaceFaultRI <land/> <nl/>
			<t1/>	InterfaceFaultKey <land/> <nl/>
			<t1/>	InterfaceFaultNameUnique
	  	</zed>
	  	
	  	<z:see names="InterfaceFaultRI InterfaceFaultKey InterfaceFaultNameUnique"/>
	  		
	  </z:notation>

    </div3>

    <div3 id="InterfaceFault_XMLRep">
      <head>XML Representation of Interface Fault Component</head>

<eg xml:space="preserve">&lt;description&gt;
  &lt;interface&gt;
    &lt;<b>fault</b>
          name="<emph>xs:NCName</emph>" 
          element="<emph>union of xs:QName, xs:token</emph>"? &gt;
      &lt;documentation /&gt;*
    &lt;/<b>fault</b>&gt;
  &lt;/interface&gt;
&lt;/description&gt;
</eg>

      <p>
	  The XML representation for an <comp>Interface Fault</comp> component is an
	  <emph>element information item</emph> with the following Infoset properties:
	  </p>
	  <ulist>
	    <item><p>A [local name] of <el>fault</el></p></item>
	    <item><p>A [namespace name] of
	    <attval>http://www.w3.org/ns/wsdl</attval></p></item>
		<item>
		<p>One or more <emph>attribute information item</emph>s amongst its [attributes] as
		follows:</p>
		<ulist>
		<item>
		  <p>
		  A REQUIRED <att>name</att> <emph>attribute information item</emph> 
		  as described below in <specref ref="Interfacefault_name_attribute"/>.
		  </p>
		</item>
		<item>
		  <p>
		  An OPTIONAL <att>element</att> <emph>attribute information item</emph> as described below
		  in <specref ref="Interface_element_attribute"/>.
		  </p>
		</item>
		<item>
		  <p>
		  Zero or more namespace qualified <emph>attribute information item</emph>s
		  whose [namespace name] is
		  NOT <attval>http://www.w3.org/ns/wsdl</attval>.
		  </p>
		</item>
		</ulist>
		</item>
		<item>
                  <p>Zero or more <emph>element information item</emph> amongst its [children], in
                  order, as follows:</p> 
		  <olist>
		    <item>
		      <p>
		      Zero or more <el>documentation</el> <emph>element information item</emph>s (see <specref ref="eii-documentation"/>).
		      </p>
		    </item>

		    <item>
		    			<p>
		    				Zero or more namespace-qualified
		    				<emph>element information item</emph>
		    				s whose [namespace name] is NOT
		    				<attval>
		    					http://www.w3.org/ns/wsdl
		    				</attval>
		    				.
		    			</p>
		    </item>
		  </olist>
		</item>
      </ulist>

      <div4 id="Interfacefault_name_attribute">
        <head><att>name</att> <emph>attribute information item</emph> with <el>fault</el> [owner element]</head>
	    <p>
		The <att>name</att> <emph>attribute information item</emph> identifies a given <el>fault</el>
		<emph>element information item</emph> inside a given <el>interface</el> <emph>element information item</emph>.
		</p>
		<p>
		The <att>name</att> <emph>attribute information item</emph> has the following
		Infoset properties:
		</p>
		<ulist>
		  <item><p>A [local name] of <att>name</att></p></item>
		  <item><p>A [namespace name] which has no value</p></item>
		</ulist>
		<p>
		The type of the <att>name</att> <emph>attribute information item</emph> is
		<emph>xs:NCName</emph>.
		</p>
      </div4>

      <div4 id="Interface_element_attribute">
        <head><att>element</att> <emph>attribute information item</emph> with <el>fault</el> [owner element]</head>
	    <p>
		The <att>element</att> <emph>attribute information item</emph> refers, by QName, to an <comp>Element
		Declaration</comp> component.
		</p>
		<p>The <att>element</att> <emph>attribute information item</emph> has the following
		Infoset properties:
		</p>
		<ulist>
		  <item><p>A [local name] of <att>element</att>.</p></item>
		  <item><p>A [namespace name] which has no value.</p></item>
		</ulist>
		<p>
		The type of the <att>element</att> <emph>attribute information item</emph>
		is a union of
		<emph>xs:QName</emph> and <emph>xs:token</emph> where
		the allowed token values are <emph>#any</emph>,
		<emph>#none</emph>, or <emph>#other</emph>.</p>
      </div4>

    </div3>

    <div3 id="InterfaceFault_Mapping">
	  <head>Mapping Interface Fault's XML Representation to
	  Component Properties</head>

	  <p>The mapping from the XML Representation of the <el>fault</el> <emph>element information item</emph>
	  (see <specref ref="InterfaceFault_XMLRep"/>) to the properties of the <comp>Interface Fault</comp>
	  component is as described in <specref ref="tab_InterfaceFault_Mapping"/>.  </p>

	  <table border="1" id="tab_InterfaceFault_Mapping">
	    <caption>Mapping from XML Representation to Interface Fault Component Properties</caption>
		<col width="20%" span="1"/>
  		<col width="80%" span="1"/>
	    <tbody>
		  <tr>
		    <th rowspan="1" colspan="1">Property</th>
		    <th rowspan="1" colspan="1">Value</th>
		  </tr>
		  <tr>
		    <td rowspan="1" colspan="1"><prop comp="Interface Fault">name</prop></td>
			<td rowspan="1" colspan="1">The QName whose local name is the actual value of the <att>name</att> <emph>attribute information item</emph>.
				and whose namespace name is the actual value of the
			<att>targetNamespace</att> <emph>attribute information item</emph> of the
			[parent] <el>description</el> <emph>element information item</emph> of the
			[parent] <el>interface</el> <emph>element information item</emph>.
			</td>
		  </tr>
                  <tr>
                    <td rowspan="1" colspan="1"><prop comp="Interface Fault">message content model</prop></td> <td rowspan="1" colspan="1">If the
                        <att>element</att> <emph>attribute information item</emph> is present and its
                        value is a QName, then
                        <emph>#element</emph>; otherwise the actual
                        value of the <att>element</att> <emph>attribute information item</emph>, if
                        any; otherwise <emph>#other</emph>.</td>
                  </tr>
		  <tr>
		    <td rowspan="1" colspan="1"><prop comp="Interface Fault">element declaration</prop></td> <td rowspan="1" colspan="1"> If the <att>element</att>
                        <emph>attribute information item</emph> is present and its value is a QName,
                        then the 
                        <comp>Element Declaration</comp> component from the 
                        <prop comp="Description">element declarations</prop> property of the 
                        <comp>Description</comp> component resolved to by
                        the value of the <att>element</att> <emph>attribute information item</emph> (see <specref ref="qnameres"/>);
                        otherwise empty. <assert class="document" id="InterfaceFault-1017" cr-id="InterfaceFault-1203000" required="true">
                        If the <att>element</att> <emph>attribute information item</emph> has a value, then
                        it MUST resolve to an
                        <comp>Element Declaration</comp> component from the 
                        <prop comp="Description">element declarations</prop>
                        property of the
                        <comp>Description</comp> component.</assert>
			</td>
		</tr>
          <tr>
          	<td rowspan="1" colspan="1"><prop comp="Interface Fault">parent</prop></td>
          	<td rowspan="1" colspan="1">
          		The <comp>Interface</comp> component corresponding to the
          		<el>interface</el> <emph>element information item</emph> in [parent].
          	</td>
          </tr>
	    </tbody>
	  </table>

    </div3>
  </div2>

  <div2 id="InterfaceOperation">
    <head>Interface Operation</head>

    <div3 id="InterfaceOperation_details">
      <head>The Interface Operation Component</head> 
        
        <p>An <comp>Inter