The summaries are taken from the XML Schema Recommendations, made more user-friendly, and link back to the specs. All elements can have an "id" attribute and all elements can have xs:annotation as child except xs:annotation itself.
<schema
attributeFormDefault = (qualified | unqualified) : unqualified
blockDefault = (#all | List of (extension | restriction | substitution)) : ''
elementFormDefault = (qualified | unqualified) : unqualified
finalDefault = (#all | List of (extension | restriction | list | union)) : ''
targetNamespace = anyURI
version = token
xml:lang = language>
Content: ((include | import | redefine)*, (((simpleType | complexType | group | attributeGroup) | element | attribute | notation))*)
</schema>
<import
namespace = anyURI
schemaLocation = anyURI />
<include
schemaLocation = anyURI/>
<redefine
schemaLocation = anyURI>
Content: (simpleType | complexType | group | attributeGroup)*
</redefine>
<complexType
abstract = boolean : false
block = (#all | List of (extension | restriction))
final = (#all | List of (extension | restriction))
mixed = boolean : false
name = NCName>
Content: (simpleContent | complexContent | ((group | all | choice | sequence)?, ((attribute | attributeGroup)*, anyAttribute?)))
</complexType>
<simpleType
final = (#all | List of (list | union | restriction))
name = NCName>
Content: (restriction | list | union)
</simpleType>
<complexContent
mixed = boolean>
Content: (restriction | extension)
</complexContent>
<simpleContent>
Content: (restriction | extension)
</simpleContent>
<extension
base = QName>
Content: ((attribute | attributeGroup)*, anyAttribute?)
</extension>
<extension
base = QName>
Content: ((group | all | choice | sequence)?, ((attribute | attributeGroup)*, anyAttribute?))
</extension>
<restriction
base = QName>
Content: (simpleType?, (minExclusive | minInclusive | maxExclusive | maxInclusive | totalDigits | fractionDigits | length | minLength | maxLength | enumeration | whiteSpace | pattern)*)?, ((attribute | attributeGroup)*, anyAttribute?)
</restriction>
<restriction
base = QName>
Content: (group | all | choice | sequence)?, ((attribute | attributeGroup)*, anyAttribute?)
</restriction>
<restriction
base = QName >
Content: (simpleType?, (minExclusive | minInclusive | maxExclusive | maxInclusive | totalDigits | fractionDigits | length | minLength | maxLength | enumeration | whiteSpace | pattern)*)
</restriction>
<any
maxOccurs = (nonNegativeInteger | unbounded) : 1
minOccurs = nonNegativeInteger : 1
namespace = ((##any | ##other) | List of (anyURI | (##targetNamespace | ##local)) ) : ##any
processContents = (lax | skip | strict) : strict/>
<element
abstract = boolean : false
block = (#all | List of (extension | restriction | substitution))
default = string
final = (#all | List of (extension | restriction))
fixed = string
form = (qualified | unqualified)
maxOccurs = (nonNegativeInteger | unbounded) : 1
minOccurs = nonNegativeInteger : 1
name = NCName
nillable = boolean : false
ref = QName
substitutionGroup = QName
type = QName>
Content: ((simpleType | complexType)?, (unique | key | keyref)*)
</element>
<group
maxOccurs = (nonNegativeInteger | unbounded) : 1
minOccurs = nonNegativeInteger : 1
name = NCName
ref = QName>
Content: (all | choice | sequence)?
</group>
<anyAttribute
namespace = ((##any | ##other) | List of (anyURI | (##targetNamespace | ##local)) ) : ##any
processContents = (lax | skip | strict) : strict/>
<attribute
default = string
fixed = string
form = (qualified | unqualified)
name = NCName
ref = QName
type = QName
use = (optional | prohibited | required) : optional>
Content: (simpleType?)
</attribute>
<attributeGroup
name = NCName
ref = QName>
Content: ((attribute | attributeGroup)*, anyAttribute?)
</attributeGroup>
<sequence
maxOccurs = (nonNegativeInteger | unbounded) : 1
minOccurs = nonNegativeInteger : 1>
Content: (element | group | choice | sequence | any)*
</sequence>
<choice
maxOccurs = (nonNegativeInteger | unbounded) : 1
minOccurs = nonNegativeInteger : 1>
Content: (element | group | choice | sequence | any)*
</choice>
<all
maxOccurs = 1 : 1
minOccurs = (0 | 1) : 1>
Content: (element*)
</all>
<list
itemType = QName>
Content: (simpleType?)
</list>
<union
memberTypes = List of QName>
Content: (simpleType*)
</union>
<notation
name = NCName
public = token
system = anyURI/>
<annotation>
Content: (appinfo | documentation)*
</annotation>
<documentation
source = anyURI
xml:lang = language>
Content: ({any})*
</documentation>
<appinfo
source = anyURI>
Content: ({any})*
</appinfo>
<unique
name = NCName>
Content: (selector, field+)
</unique>
<key
name = NCName>
Content: (selector, field+)
</key>
<keyref
name = NCName
refer = QName>
Content: (selector, field+)
</keyref>
<selector
xpath = a subset of XPath expression/>
<field
xpath = a subset of XPath expression/>
All facets except Patern and Enumeration can have a "fixed" attribute (true/false). If "true" a derived type cannot change the value.
<length
value = nonNegativeInteger/>
<minLength
value = nonNegativeInteger/>
<maxLength
value = nonNegativeInteger/>
<pattern
value = string/>
<enumeration
value = anySimpleType/>
<whiteSpace
value = (collapse | preserve | replace)/>
<maxInclusive
value = anySimpleType/>
<maxExclusive
value = anySimpleType/>
<minExclusive
value = anySimpleType/>
<minInclusive
value = anySimpleType/>
<totalDigits
value = positiveInteger/>
<fractionDigits
value = nonNegativeInteger/>
Updated 2007-09-30