<grammar datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes"
	ns="http://relaxng.org/ns/structure/1.0"
	xmlns="http://relaxng.org/ns/structure/1.0">

	<start>
		<ref name="pattern"/>
	</start>

	<define name="pattern">
		<choice>
			<element name="element">
				<choice>
					<attribute name="name">
						<data type="QName"/>
					</attribute>
					<ref name="open-name-class"/>
				</choice>
				<ref name="common-atts"/>
				<ref name="open-patterns"/>
			</element>
			<element name="attribute">
				<ref name="common-atts"/>
				<choice>
					<attribute name="name">
						<data type="QName"/>
					</attribute>
					<ref name="open-name-class"/>
				</choice>
				<interleave>
					<ref name="other"/>
					<optional>
						<ref name="pattern"/>
					</optional>
				</interleave>
			</element>
			<element name="group">
				<ref name="common-atts"/>
				<ref name="open-patterns"/>
			</element>
			<element name="interleave">
				<ref name="common-atts"/>
				<ref name="open-patterns"/>
			</element>
			<element name="choice">
				<ref name="common-atts"/>
				<ref name="open-patterns"/>
			</element>
			<element name="optional">
				<ref name="common-atts"/>
				<ref name="open-patterns"/>
			</element>
			<element name="zeroOrMore">
				<ref name="common-atts"/>
				<ref name="open-patterns"/>
			</element>
			<element name="oneOrMore">
				<ref name="common-atts"/>
				<ref name="open-patterns"/>
			</element>
			<element name="list">
				<ref name="common-atts"/>
				<ref name="open-patterns"/>
			</element>
			<element name="mixed">
				<ref name="common-atts"/>
				<ref name="open-patterns"/>
			</element>
			<element name="ref">
				<attribute name="name">
					<data type="NCName"/>
				</attribute>
				<ref name="common-atts"/>
				<ref name="other"/>
			</element>
			<element name="parentRef">
				<attribute name="name">
					<data type="NCName"/>
				</attribute>
				<ref name="common-atts"/>
				<ref name="other"/>
			</element>
			<element name="empty">
				<ref name="common-atts"/>
				<ref name="other"/>
			</element>
			<element name="text">
				<ref name="common-atts"/>
				<ref name="other"/>
			</element>
			<element name="value">
				<optional>
					<attribute name="type">
						<data type="NCName"/>
					</attribute>
				</optional>
				<ref name="common-atts"/>
				<text/>
			</element>
			<element name="data">
				<attribute name="type">
					<data type="NCName"/>
				</attribute>
				<ref name="common-atts"/>
				<interleave>
					<ref name="other"/>
					<group>
						<zeroOrMore>
							<element name="param">
								<attribute name="name">
									<data type="NCName"/>
								</attribute>
                <ref name="common-atts"/>
								<text/>
							</element>
						</zeroOrMore>
						<optional>
							<element name="except">
								<ref name="common-atts"/>
								<ref name="open-patterns"/>
							</element>
						</optional>
					</group>
				</interleave>
			</element>
			<element name="notAllowed">
				<ref name="common-atts"/>
				<ref name="other"/>
			</element>
			<element name="externalRef">
				<attribute name="href">
					<data type="anyURI"/>
				</attribute>
				<ref name="common-atts"/>
				<ref name="other"/>
			</element>
			<element name="grammar">
				<ref name="common-atts"/>
				<ref name="grammar-content"/>
			</element>
		</choice>
	</define>

	<define name="grammar-content">
		<interleave>
			<ref name="other"/>
			<zeroOrMore>
				<choice>
					<ref name="start-element"/>
					<ref name="define-element"/>
					<element name="div">
						<ref name="common-atts"/>
						<ref name="grammar-content"/>
					</element>
					<element name="include">
						<attribute name="href">
							<data type="anyURI"/>
						</attribute>
						<ref name="common-atts"/>
						<ref name="include-content"/>
					</element>
				</choice>
			</zeroOrMore>
		</interleave>
	</define>

	<define name="include-content">
		<interleave>
			<ref name="other"/>
			<zeroOrMore>
				<choice>
					<ref name="start-element"/>
					<ref name="define-element"/>
					<element name="div">
						<ref name="common-atts"/>
						<ref name="include-content"/>
					</element>
				</choice>
			</zeroOrMore>
		</interleave>
	</define>

	<define name="start-element">
		<element name="start">
			<ref name="combine-att"/>
			<ref name="common-atts"/>
			<ref name="open-pattern"/>
		</element>
	</define>

	<define name="define-element">
		<element name="define">
			<attribute name="name">
				<data type="NCName"/>
			</attribute>
			<ref name="combine-att"/>
			<ref name="common-atts"/>
			<ref name="open-patterns"/>
		</element>
	</define>

	<define name="combine-att">
		<optional>
			<attribute name="combine">
				<choice>
					<value>choice</value>
					<value>interleave</value>
				</choice>
			</attribute>
		</optional>
	</define>

	<define name="open-patterns">
		<interleave>
			<ref name="other"/>
			<oneOrMore>
				<ref name="pattern"/>
			</oneOrMore>
		</interleave>
	</define>

	<define name="open-pattern">
		<interleave>
			<ref name="other"/>
			<ref name="pattern"/>
		</interleave>
	</define>

	<define name="name-class">
		<choice>
			<element name="name">
				<ref name="common-atts"/>
				<data type="QName"/>
			</element>
			<element name="anyName">
				<ref name="common-atts"/>
				<ref name="except-name-class"/>
			</element>
			<element name="nsName">
				<ref name="common-atts"/>
				<ref name="except-name-class"/>
			</element>
			<element name="choice">
				<ref name="common-atts"/>
				<ref name="open-name-classes"/>
			</element>
		</choice>
	</define>

	<define name="except-name-class">
		<interleave>
			<ref name="other"/>
			<optional>
				<element name="except">
					<ref name="open-name-classes"/>
				</element>
			</optional>
		</interleave>
	</define>

	<define name="open-name-classes">
		<interleave>
			<ref name="other"/>
			<oneOrMore>
				<ref name="name-class"/>
			</oneOrMore>
		</interleave>
	</define>

	<define name="open-name-class">
		<interleave>
			<ref name="other"/>
			<ref name="name-class"/>
		</interleave>
	</define>

	<define name="common-atts">
		<optional>
			<attribute name="ns" />
		</optional>
		<optional>
			<attribute name="datatypeLibrary">
				<data type="anyURI"/>
			</attribute>
		</optional>
		<zeroOrMore>
			<attribute>
				<anyName>
					<except>
						<nsName/>
						<nsName ns=""/>
					</except>
				</anyName>
			</attribute>
		</zeroOrMore>
	</define>

	<define name="other">
		<zeroOrMore>
			<element>
				<anyName>
					<except>
						<nsName/>
					</except>
				</anyName>
				<zeroOrMore>
					<choice>
						<attribute>
							<anyName/>
						</attribute>
						<text/>
						<ref name="any"/>
					</choice>
				</zeroOrMore>
			</element>
		</zeroOrMore>
	</define>

	<define name="any">
		<element>
			<anyName/>
			<zeroOrMore>
				<choice>
					<attribute>
						<anyName/>
					</attribute>
					<text/>
					<ref name="any"/>
				</choice>
			</zeroOrMore>
		</element>
	</define>

</grammar>

