<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://wicket.apache.org"
	xmlns:wicket="http://wicket.apache.org"
	xmlns:xhtml="http://www.w3.org/1999/xhtml"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.w3.org/1999/xhtml http://www.w3.org/MarkUp/SCHEMA/xhtml-basic10.xsd"
	elementFormDefault="qualified"
	version="9.0.0">
	
	<redefine schemaLocation="http://www.w3.org/MarkUp/SCHEMA/xhtml-basic10.xsd">
		<attributeGroup name="xhtml.label.attlist">
			<attributeGroup ref="xhtml.label.attlist"/>
			<attribute ref="wicket:for"/>
		</attributeGroup>
	</redefine>

	<!-- types -->

	<simpleType name="token">
		<annotation>
			<documentation>An extension of standard token type with the
				restriction of collapsing white space, which means that the XML
				processor WILL REMOVE all white space characters (line feeds, tabs,
				spaces, carriage returns are replaced with spaces, leading and
				trailing spaces are removed, and multiple spaces are reduced to a
				single space).</documentation>
		</annotation>
		<restriction base="token">
			<whiteSpace value="collapse" />
		</restriction>
	</simpleType>

	<simpleType name="notEmptyToken">
		<annotation>
			<documentation>Extends wicket:token type with the restriction that
				the value can not be empty.</documentation>
		</annotation>
		<restriction base="wicket:token">
			<minLength value="1" />
		</restriction>
	</simpleType>

	<complexType name="mixedContent" mixed="true">
		<annotation>
			<documentation>A complex type that allows any amount of mixed child
				content from any origin.</documentation>
		</annotation>
		<choice minOccurs="0" maxOccurs="unbounded">
			<any namespace="##targetNamespace" processContents="strict" />
			<any namespace="##other" processContents="lax" />
		</choice>
	</complexType>

	<complexType name="notEmptyMixedContent" mixed="true">
		<annotation>
			<documentation>Extends wicket:mixedContent with the restriction that
				at least one child element must be given.</documentation>
		</annotation>
		<choice minOccurs="1" maxOccurs="unbounded">
			<any namespace="##targetNamespace" processContents="strict" />
			<any namespace="##other" processContents="lax" />
		</choice>
	</complexType>

	<!-- attributes -->

	<attribute name="enclosure">
		<annotation>
			<documentation>This attribute is useful for filtering markup that
				surrounds a component but has its visibility dependent on the
				visibility of that component. It is similar to the wicket:enclosure
				tag. The value is the wicket:id of the dependent component. No value
				can be used if there is only one nested wicket component.
				"foo:bar:baz" format can be used to specify a nested path.
			</documentation>
		</annotation>
		<simpleType>
			<restriction base="wicket:notEmptyToken">
				<pattern value="([^:]+(:[^:]+)*)?" />
			</restriction>
		</simpleType>
	</attribute>

	<attribute name="id" type="wicket:notEmptyToken">
		<annotation>
			<documentation>The wicket component id. Used on any element to which
				you want to add a component.</documentation>
		</annotation>
	</attribute>

	<attribute name="for">
		<annotation>
			<documentation>Can be used in HTML <![CDATA[<label]]> element to automatically link it
				to a form element. The value of this attribute must have the same value of
				the form component's wicket:id attribute.
			</documentation>
		</annotation>
		<simpleType>
			<restriction base="wicket:notEmptyToken">
				<pattern value="([^:]+(:[^:]+)*)?" />
			</restriction>
		</simpleType>
	</attribute>

	<attribute name="message">
		<annotation>
			<documentation>Used on any tag that we want Wicket to provide an
				attribute with a value that's the result of a resource lookup.
				Format: "att1:key1,att2:key2", where att1, att2 are attribute names
				and key1, key2 are resource id-s.
			</documentation>
		</annotation>
		<simpleType>
			<restriction base="wicket:notEmptyToken">
				<pattern value="[^:,]+:[^:,]+(,[^:,]+:[^:,]+)*" />
			</restriction>
		</simpleType>
	</attribute>

	<!-- elements -->

	<element name="body">
		<annotation>
			<documentation>Used with wicket:border to specify the location of the
				original content.</documentation>
		</annotation>
		<complexType />
	</element>

	<element name="border" type="wicket:notEmptyMixedContent">
		<annotation>
			<documentation>Specifies bordering content for a wicket:body.
			</documentation>
		</annotation>
		<unique name="borderWicketId">
			<selector xpath="./*" />
			<field xpath="@wicket:id" />
		</unique>
	</element>

	<element name="child">
		<annotation>
			<documentation>Wicket will replace this content with the markup of
				the derived component (see wicket:extend).</documentation>
		</annotation>
		<complexType />
	</element>

	<element name="header-items">
		<annotation>
			<documentation><![CDATA[A special element that is used as a placeholder inside the HTML <head>
			element. Wicket will replace it with all header contributions.]]></documentation>
		</annotation>
		<complexType />
	</element>

	<element name="container">
		<annotation>
			<documentation>A tag to which you can attach a wicket component but
				it will not produce a html tag in the result.</documentation>
		</annotation>
		<complexType mixed="true">
			<complexContent>
				<extension base="wicket:mixedContent">
					<attribute ref="wicket:id" use="required" />
				</extension>
			</complexContent>
		</complexType>
		<unique name="containerWicketId">
			<selector xpath="./*" />
			<field xpath="@wicket:id" />
		</unique>
	</element>

	<element name="enclosure">
		<annotation>
			<documentation>This tag is useful for filtering markup that surrounds
				a component but has its visibility dependent on the visibility of
				that component. It is similar to the wicket:enclosure attribute.
			</documentation>
		</annotation>
		<complexType mixed="true">
			<complexContent>
				<extension base="wicket:notEmptyMixedContent">
					<attribute name="child" use="optional">
						<annotation>
							<documentation>Specifies the wicket:id of the dependent
								component. This attribute can be omitted if there is only one
								nested wicket component. "foo:bar:baz" format can be used to
								specify a nested path.</documentation>
						</annotation>
						<simpleType>
							<restriction base="wicket:notEmptyToken">
								<pattern value="[^:]+(:[^:]+)*" />
							</restriction>
						</simpleType>
					</attribute>
				</extension>
			</complexContent>
		</complexType>
		<unique name="enclosureWicketId">
			<selector xpath="./*" />
			<field xpath="@wicket:id" />
		</unique>
	</element>

	<element name="extend" type="wicket:mixedContent">
		<annotation>
			<documentation>Extend the markup of the superclass with this content.
				Used together with wicket:child.</documentation>
		</annotation>
		<unique name="extendWicketId">
			<selector xpath="./*" />
			<field xpath="@wicket:id" />
		</unique>
	</element>

	<element name="fragment">
		<annotation>
			<documentation>Is similar to wicket:panel but it is declared in the
				parent's markup instead of in a separate markup file.
			</documentation>
		</annotation>
		<complexType mixed="true">
			<complexContent>
				<extension base="wicket:mixedContent">
					<attribute ref="wicket:id" use="required" />
				</extension>
			</complexContent>
		</complexType>
		<unique name="fragmentWicketId">
			<selector xpath="./*" />
			<field xpath="@wicket:id" />
		</unique>
	</element>

	<element name="head" type="wicket:mixedContent">
		<annotation>
			<documentation>Used for header contributions. Using this, panels can
				add header sections to the pages they are placed on.</documentation>
		</annotation>
		<unique name="headWicketId">
			<selector xpath="./*" />
			<field xpath="@wicket:id" />
		</unique>
	</element>

	<element name="link" type="wicket:mixedContent">
		<annotation>
			<documentation>Support for wicket's autolink functionality. Normally,
				you need to add a component (for example, a BookmarkablePageLink)
				for each link that Wicket manages. Using the wicket:link tag will
				automatically do this in the background for you.</documentation>
		</annotation>
		<unique name="linkWicketId">
			<selector xpath="./*" />
			<field xpath="@wicket:id" />
		</unique>
	</element>

	<element name="message">
		<annotation>
			<documentation>Wicket will replace this with a string that is
				retrieved from a resource bundle.</documentation>
		</annotation>
		<complexType mixed="true">
			<complexContent>
				<extension base="wicket:mixedContent">
					<attribute name="key" use="required" type="wicket:notEmptyToken">
						<annotation>
							<documentation>The resource id used for lookup.</documentation>
						</annotation>
					</attribute>
					<attribute name="escape" use="optional" type="boolean" default="false">
						<annotation>
							<documentation>Defines whether the resource value should be escaped or not.</documentation>
						</annotation>
					</attribute>
				</extension>
			</complexContent>
		</complexType>
		<unique name="messageWicketId">
			<selector xpath="./*" />
			<field xpath="@wicket:id" />
		</unique>
	</element>

	<element name="panel" type="wicket:mixedContent">
		<annotation>
			<documentation>The wicket:panel tag surrounds a component. This lets
				you wrap the component with HTML and BODY tags (so it can be
				displayed in a browser) but, when you include it, only the content
				inside the wicket:panel tag is actually included.</documentation>
		</annotation>
		<unique name="panelWicketId">
			<selector xpath="./*" />
			<field xpath="@wicket:id" />
		</unique>
	</element>

	<element name="remove" type="wicket:mixedContent">
		<annotation>
			<documentation>Wicket will remove this content in the final markup.
				This is useful for when you want your web designer to be able to
				show repeated content when they're working on it, but you want to
				generate that content using a ListView (or other loop).
			</documentation>
		</annotation>
	</element>

	<element name="label">
		<annotation>
			<documentation>Wicket will output a FormComponent's label (FormComponent#getLabel()) without
				requiring a manual extra component such as Label or FormComponentLabel.</documentation>
		</annotation>
		<complexType mixed="true">
			<complexContent>
				<extension base="wicket:mixedContent">
					<attribute name="for" use="optional" type="wicket:notEmptyToken">
						<annotation>
							<documentation>The wicket:id of FormComponent which label should be used.</documentation>
						</annotation>
					</attribute>
					<attribute name="key" use="optional" type="wicket:notEmptyToken">
						<annotation>
							<documentation>The resource id used for lookup. Acts as &lt;wicket:message&gt; </documentation>
						</annotation>
					</attribute>
				</extension>
			</complexContent>
		</complexType>
	</element>

</schema>
