c3d2-web/html5-syntax/web-forms.rng

854 lines
25 KiB
XML

<?xml version="1.0" encoding="UTF-8"?>
<grammar xmlns:a="http://relaxng.org/ns/compatibility/annotations/1.0" xmlns="http://relaxng.org/ns/structure/1.0">
<!-- ##################################################################### -->
<define name="common-form.attrs">
<a:documentation> RELAX NG Schema for HTML 5: Web Forms 1.0 markup #</a:documentation>
<!-- ##################################################################### -->
<a:documentation>Shared attributes for form controls</a:documentation>
<interleave>
<optional>
<ref name="common-form.attrs.name"/>
</optional>
<optional>
<ref name="common-form.attrs.disabled"/>
</optional>
</interleave>
</define>
<define name="common-form.attrs.name">
<attribute name="name">
<data type="string" datatypeLibrary=""/>
<!-- REVISIT should this be restricted somehow? No & and = perhaps? -->
</attribute>
</define>
<define name="common-form.attrs.disabled">
<attribute name="disabled">
<choice>
<value type="string">disabled</value>
<value type="string"/>
</choice>
</attribute>
</define>
<define name="shared-form.attrs.readonly">
<attribute name="readonly">
<choice>
<value type="string">readonly</value>
<value type="string"/>
</choice>
</attribute>
</define>
<define name="shared-form.attrs.maxlength">
<attribute name="maxlength">
<ref name="common.data.integer.positive"/>
<!-- REVISIT should this be non-negative? -->
</attribute>
</define>
<define name="shared-form.attrs.size">
<attribute name="size">
<ref name="common.data.integer.positive"/>
</attribute>
</define>
<!-- REVISIT tabindex goes in common.attrs -->
<define name="input.attrs.checked">
<a:documentation>Shared attributes for &lt;input&gt;</a:documentation>
<attribute name="checked">
<choice>
<value type="string">checked</value>
<value type="string"/>
</choice>
</attribute>
</define>
<define name="input.text.elem">
<a:documentation>Text Field: &lt;input type='text'&gt;</a:documentation>
<element name="input">
<ref name="input.text.attrs"/>
</element>
</define>
<define name="input.text.attrs">
<interleave>
<ref name="common.attrs"/>
<ref name="common-form.attrs"/>
<optional>
<ref name="input.text.attrs.type"/>
</optional>
<optional>
<ref name="shared-form.attrs.maxlength"/>
</optional>
<optional>
<ref name="shared-form.attrs.readonly"/>
</optional>
<optional>
<ref name="shared-form.attrs.size"/>
</optional>
<optional>
<ref name="input.text.attrs.value"/>
</optional>
<optional>
<choice>
<ref name="common.attrs.aria"/>
<ref name="common.attrs.aria.implicit.input"/>
</choice>
</optional>
</interleave>
</define>
<define name="input.text.attrs.type">
<attribute name="type">
<value type="string">text</value>
</attribute>
</define>
<define name="input.text.attrs.value">
<attribute name="value">
<data type="string" datatypeLibrary=""/>
<!-- REVISIT "nominally" free of line breaks? -->
</attribute>
</define>
<define name="input.elem">
<ref name="input.text.elem"/>
</define>
<define name="input.password.elem">
<a:documentation>Password Field: &lt;input type='password'&gt;</a:documentation>
<element name="input">
<ref name="input.password.attrs"/>
</element>
</define>
<define name="input.password.attrs">
<interleave>
<ref name="common.attrs"/>
<ref name="common-form.attrs"/>
<ref name="input.password.attrs.type"/>
<optional>
<ref name="shared-form.attrs.maxlength"/>
</optional>
<optional>
<ref name="shared-form.attrs.readonly"/>
</optional>
<optional>
<ref name="shared-form.attrs.size"/>
</optional>
<optional>
<ref name="input.password.attrs.value"/>
</optional>
<optional>
<ref name="common.attrs.aria.implicit.input"/>
</optional>
</interleave>
</define>
<define name="input.password.attrs.type">
<attribute name="type">
<value type="string">password</value>
</attribute>
</define>
<define name="input.password.attrs.value">
<attribute name="value">
<data type="string" datatypeLibrary=""/>
<!-- REVISIT "nominally" free of line breaks? -->
</attribute>
</define>
<define name="input.elem" combine="choice">
<ref name="input.password.elem"/>
</define>
<define name="input.checkbox.elem">
<a:documentation>Checkbox: &lt;input type='checkbox'&gt;</a:documentation>
<element name="input">
<ref name="input.checkbox.attrs"/>
</element>
</define>
<define name="input.checkbox.attrs">
<interleave>
<ref name="common.attrs"/>
<ref name="common-form.attrs"/>
<ref name="input.checkbox.attrs.type"/>
<optional>
<ref name="input.attrs.checked"/>
</optional>
<optional>
<ref name="input.checkbox.attrs.value"/>
</optional>
<optional>
<ref name="common.attrs.aria.implicit.input"/>
</optional>
</interleave>
</define>
<define name="input.checkbox.attrs.type">
<attribute name="type">
<value type="string">checkbox</value>
</attribute>
</define>
<define name="input.checkbox.attrs.value">
<attribute name="value">
<data type="string" datatypeLibrary=""/>
<!-- REVISIT require non-empty value? -->
</attribute>
</define>
<define name="input.elem" combine="choice">
<ref name="input.checkbox.elem"/>
</define>
<define name="input.radio.elem">
<a:documentation>Radiobutton: &lt;input type='radio'&gt;</a:documentation>
<element name="input">
<ref name="input.radio.attrs"/>
</element>
</define>
<define name="input.radio.attrs">
<interleave>
<ref name="common.attrs"/>
<ref name="common-form.attrs"/>
<ref name="input.radio.attrs.type"/>
<optional>
<ref name="input.attrs.checked"/>
</optional>
<optional>
<ref name="input.radio.attrs.value"/>
</optional>
<optional>
<ref name="common.attrs.aria.implicit.input"/>
</optional>
</interleave>
</define>
<define name="input.radio.attrs.type">
<attribute name="type">
<value type="string">radio</value>
</attribute>
</define>
<define name="input.radio.attrs.value">
<attribute name="value">
<data type="string" datatypeLibrary=""/>
<!-- REVISIT require non-empty value? -->
</attribute>
</define>
<define name="input.elem" combine="choice">
<ref name="input.radio.elem"/>
</define>
<define name="input.button.elem">
<a:documentation>Scripting Hook Button: &lt;input type='button'&gt;</a:documentation>
<element name="input">
<ref name="input.button.attrs"/>
</element>
</define>
<define name="input.button.attrs">
<interleave>
<ref name="common.attrs"/>
<ref name="common-form.attrs"/>
<ref name="input.button.attrs.type"/>
<optional>
<ref name="input.button.attrs.value"/>
</optional>
<optional>
<choice>
<ref name="common.attrs.aria"/>
<ref name="common.attrs.aria.implicit.button"/>
</choice>
</optional>
</interleave>
</define>
<define name="input.button.attrs.type">
<attribute name="type">
<value type="string">button</value>
</attribute>
</define>
<define name="input.button.attrs.value">
<attribute name="value">
<data type="string" datatypeLibrary=""/>
<!-- REVISIT require non-empty value? -->
</attribute>
</define>
<define name="input.elem" combine="choice">
<ref name="input.button.elem"/>
</define>
<!-- REVISIT should this be enabled by a scripting module only? -->
<define name="input.submit.elem">
<a:documentation>Submit Button: &lt;input type='submit'&gt;</a:documentation>
<element name="input">
<ref name="input.submit.attrs"/>
</element>
</define>
<define name="input.submit.attrs">
<interleave>
<ref name="common.attrs"/>
<ref name="common-form.attrs"/>
<ref name="input.submit.attrs.type"/>
<optional>
<ref name="input.submit.attrs.value"/>
</optional>
<optional>
<ref name="common.attrs.aria.implicit.button"/>
</optional>
</interleave>
</define>
<define name="input.submit.attrs.type">
<attribute name="type">
<value type="string">submit</value>
</attribute>
</define>
<define name="input.submit.attrs.value">
<attribute name="value">
<data type="string" datatypeLibrary=""/>
<!-- REVISIT require non-empty value? -->
</attribute>
</define>
<define name="input.elem" combine="choice">
<ref name="input.submit.elem"/>
</define>
<define name="input.reset.elem">
<a:documentation>Reset Button: &lt;input type='reset'&gt;</a:documentation>
<element name="input">
<ref name="input.reset.attrs"/>
</element>
</define>
<define name="input.reset.attrs">
<interleave>
<ref name="common.attrs"/>
<ref name="common-form.attrs"/>
<ref name="input.reset.attrs.type"/>
<optional>
<ref name="input.reset.attrs.value"/>
</optional>
<optional>
<ref name="common.attrs.aria.implicit.button"/>
</optional>
</interleave>
</define>
<define name="input.reset.attrs.type">
<attribute name="type">
<value type="string">reset</value>
</attribute>
</define>
<define name="input.reset.attrs.value">
<attribute name="value">
<data type="string" datatypeLibrary=""/>
<!-- REVISIT require non-empty value? -->
</attribute>
</define>
<define name="input.elem" combine="choice">
<ref name="input.reset.elem"/>
</define>
<!-- REVISIT does reset make sense outside a form? -->
<define name="input.file.elem">
<a:documentation>File Upload: &lt;input type='file'&gt;</a:documentation>
<element name="input">
<ref name="input.file.attrs"/>
</element>
</define>
<define name="input.file.attrs">
<interleave>
<ref name="common.attrs"/>
<ref name="common-form.attrs"/>
<ref name="input.file.attrs.type"/>
<optional>
<ref name="input.file.attrs.accept"/>
</optional>
<optional>
<ref name="common.attrs.aria.implicit.input"/>
</optional>
</interleave>
</define>
<define name="input.file.attrs.type">
<attribute name="type">
<value type="string">file</value>
</attribute>
</define>
<define name="input.file.attrs.accept">
<attribute name="accept">
<ref name="form.data.mimetypelist"/>
</attribute>
</define>
<define name="input.elem" combine="choice">
<ref name="input.file.elem"/>
</define>
<define name="input.hidden.elem">
<a:documentation>Hidden String: &lt;input type='hidden'&gt;</a:documentation>
<element name="input">
<ref name="input.hidden.attrs"/>
</element>
</define>
<define name="input.hidden.attrs">
<interleave>
<ref name="common.attrs"/>
<ref name="common-form.attrs"/>
<ref name="input.hidden.attrs.type"/>
<optional>
<ref name="input.hidden.attrs.value"/>
</optional>
</interleave>
</define>
<define name="input.hidden.attrs.type">
<attribute name="type">
<value type="string">hidden</value>
</attribute>
</define>
<define name="input.hidden.attrs.value">
<attribute name="value">
<data type="string" datatypeLibrary=""/>
</attribute>
</define>
<define name="input.elem" combine="choice">
<ref name="input.hidden.elem"/>
</define>
<define name="input.image.elem">
<a:documentation>Image Submit Button: &lt;input type='image'&gt;</a:documentation>
<element name="input">
<ref name="input.image.attrs"/>
</element>
</define>
<define name="input.image.attrs">
<interleave>
<ref name="common.attrs"/>
<ref name="common-form.attrs"/>
<ref name="input.image.attrs.type"/>
<ref name="input.image.attrs.alt"/>
<optional>
<ref name="input.image.attrs.src"/>
</optional>
<optional>
<choice>
<ref name="common.attrs.aria"/>
<ref name="common.attrs.aria.implicit.button"/>
</choice>
</optional>
</interleave>
</define>
<define name="input.image.attrs.type">
<attribute name="type">
<value type="string">image</value>
</attribute>
</define>
<define name="input.image.attrs.alt">
<attribute name="alt">
<data type="string" datatypeLibrary=""/>
<!-- XXX non-empty -->
</attribute>
</define>
<define name="input.image.attrs.src">
<attribute name="src">
<ref name="common.data.uri"/>
</attribute>
</define>
<define name="input.elem" combine="choice">
<ref name="input.image.elem"/>
</define>
<define name="common.elem.phrasing" combine="choice">
<ref name="input.elem"/>
</define>
<define name="textarea.elem">
<a:documentation>Text Area: &lt;textarea&gt;</a:documentation>
<element name="textarea">
<interleave>
<ref name="textarea.inner"/>
<ref name="textarea.attrs"/>
</interleave>
</element>
</define>
<define name="textarea.attrs">
<interleave>
<ref name="common.attrs"/>
<ref name="common-form.attrs"/>
<optional>
<ref name="shared-form.attrs.readonly"/>
</optional>
<ref name="textarea.attrs.rows-and-cols-wf1"/>
<optional>
<ref name="common.attrs.aria.implicit.input"/>
</optional>
</interleave>
<!-- FIXME onfocus, onblur, onselect,onchange -->
</define>
<!-- This is ugly. -->
<define name="textarea.attrs.rows-and-cols-wf1">
<ref name="textarea.attrs.rows-and-cols-wf1.inner"/>
</define>
<define name="textarea.attrs.rows-and-cols-wf1.inner">
<interleave>
<ref name="textarea.attrs.cols"/>
<ref name="textarea.attrs.rows"/>
</interleave>
</define>
<define name="textarea.attrs.cols">
<attribute name="cols">
<ref name="common.data.integer.positive"/>
</attribute>
</define>
<define name="textarea.attrs.rows">
<attribute name="rows">
<ref name="common.data.integer.positive"/>
</attribute>
</define>
<define name="textarea.inner">
<text/>
</define>
<define name="common.elem.phrasing" combine="choice">
<ref name="textarea.elem"/>
</define>
<!--
Due to limitations with interleave, handling single/multiple selection
enforcement in RELAX NG seems to be possible but really awkward.
Tried it. Leaving it to Schematron.
-->
<define name="option.elem">
<a:documentation>Select menu option: &lt;option selected&gt;</a:documentation>
<element name="option">
<interleave>
<ref name="option.inner"/>
<ref name="option.attrs"/>
</interleave>
</element>
</define>
<define name="option.attrs">
<interleave>
<ref name="common.attrs"/>
<optional>
<ref name="common-form.attrs.disabled"/>
</optional>
<optional>
<ref name="option.attrs.selected"/>
</optional>
<optional>
<ref name="option.attrs.label"/>
</optional>
<optional>
<ref name="option.attrs.value"/>
</optional>
<optional>
<ref name="common.attrs.aria.implicit.input"/>
</optional>
</interleave>
</define>
<define name="option.attrs.selected">
<attribute name="selected">
<choice>
<value type="string">selected</value>
<value type="string"/>
</choice>
</attribute>
</define>
<define name="option.attrs.label">
<attribute name="label">
<data type="string" datatypeLibrary=""/>
</attribute>
</define>
<define name="option.attrs.value">
<attribute name="value">
<data type="string" datatypeLibrary=""/>
</attribute>
</define>
<define name="option.inner">
<text/>
</define>
<define name="optgroup.elem">
<a:documentation>Option Group: &lt;optgroup&gt;</a:documentation>
<element name="optgroup">
<interleave>
<ref name="optgroup.inner"/>
<ref name="optgroup.attrs"/>
</interleave>
</element>
</define>
<define name="optgroup.attrs">
<interleave>
<ref name="common.attrs"/>
<ref name="optgroup.attrs.label"/>
<optional>
<ref name="common-form.attrs.disabled"/>
</optional>
</interleave>
</define>
<define name="optgroup.attrs.label">
<attribute name="label">
<data type="string" datatypeLibrary=""/>
</attribute>
</define>
<define name="optgroup.inner">
<zeroOrMore>
<ref name="option.elem"/>
</zeroOrMore>
</define>
<define name="select.elem">
<a:documentation>Selection Menu: &lt;select&gt;</a:documentation>
<element name="select">
<interleave>
<ref name="select.inner"/>
<ref name="select.attrs"/>
</interleave>
</element>
</define>
<define name="select.attrs">
<interleave>
<ref name="common.attrs"/>
<ref name="common-form.attrs"/>
<optional>
<ref name="select.attrs.size"/>
</optional>
<optional>
<ref name="select.attrs.multiple"/>
</optional>
</interleave>
<!-- FIXME onfocus, onblur, onchange -->
</define>
<define name="select.attrs.size">
<attribute name="size">
<ref name="common.data.integer.positive"/>
</attribute>
</define>
<define name="select.attrs.multiple">
<attribute name="multiple">
<choice>
<value type="string">multiple</value>
<value type="string"/>
</choice>
</attribute>
</define>
<define name="select.inner">
<interleave>
<zeroOrMore>
<ref name="optgroup.elem"/>
</zeroOrMore>
<zeroOrMore>
<ref name="option.elem"/>
</zeroOrMore>
</interleave>
</define>
<define name="common.elem.phrasing" combine="choice">
<ref name="select.elem"/>
</define>
<define name="button.attrs.value">
<a:documentation>Shared Definitions for Complex Button</a:documentation>
<attribute name="value">
<data type="string" datatypeLibrary=""/>
</attribute>
</define>
<define name="button.inner">
<ref name="common.inner.phrasing"/>
</define>
<define name="button.submit.elem">
<a:documentation>Complex Submit Button: &lt;button type='submit'&gt;</a:documentation>
<element name="button">
<interleave>
<ref name="button.inner"/>
<ref name="button.submit.attrs"/>
</interleave>
</element>
</define>
<define name="button.submit.attrs">
<interleave>
<ref name="common.attrs"/>
<ref name="common-form.attrs"/>
<optional>
<ref name="button.submit.attrs.type"/>
</optional>
<optional>
<ref name="button.attrs.value"/>
</optional>
<optional>
<ref name="common.attrs.aria.implicit.button"/>
</optional>
</interleave>
</define>
<define name="button.submit.attrs.type">
<attribute name="type">
<value type="string">submit</value>
</attribute>
</define>
<define name="button.elem">
<ref name="button.submit.elem"/>
</define>
<define name="button.reset.elem">
<a:documentation>Complex Reset Button: &lt;button type='reset'&gt;</a:documentation>
<element name="button">
<interleave>
<ref name="button.inner"/>
<ref name="button.reset.attrs"/>
</interleave>
</element>
</define>
<define name="button.reset.attrs">
<interleave>
<ref name="common.attrs"/>
<ref name="common-form.attrs"/>
<ref name="button.reset.attrs.type"/>
<optional>
<ref name="button.attrs.value"/>
</optional>
<optional>
<!-- REVISIT I guess this still affects the DOM -->
<ref name="common.attrs.aria.implicit.button"/>
</optional>
</interleave>
</define>
<define name="button.reset.attrs.type">
<attribute name="type">
<value type="string">reset</value>
</attribute>
</define>
<define name="button.elem" combine="choice">
<ref name="button.reset.elem"/>
</define>
<define name="button.button.elem">
<a:documentation>Complex Push Button: &lt;button type='button'&gt;</a:documentation>
<element name="button">
<interleave>
<ref name="button.inner"/>
<ref name="button.button.attrs"/>
</interleave>
</element>
</define>
<define name="button.button.attrs">
<interleave>
<ref name="common.attrs"/>
<ref name="common-form.attrs"/>
<ref name="button.button.attrs.type"/>
<optional>
<ref name="button.attrs.value"/>
</optional>
<optional>
<!-- REVISIT I guess this still affects the DOM -->
<choice>
<ref name="common.attrs.aria"/>
<ref name="common.attrs.aria.implicit.button"/>
</choice>
</optional>
</interleave>
</define>
<define name="button.button.attrs.type">
<attribute name="type">
<value type="string">button</value>
</attribute>
</define>
<define name="button.elem" combine="choice">
<ref name="button.button.elem"/>
</define>
<define name="common.elem.phrasing" combine="choice">
<ref name="button.elem"/>
</define>
<define name="form.elem">
<a:documentation>Form: &lt;form&gt;</a:documentation>
<element name="form">
<interleave>
<ref name="form.inner"/>
<ref name="form.attrs"/>
</interleave>
</element>
</define>
<define name="form.attrs">
<interleave>
<ref name="common.attrs"/>
<optional>
<ref name="form.attrs.action"/>
</optional>
<optional>
<!-- REVISIT Should this be required anyway? -->
<ref name="form.attrs.method"/>
</optional>
<optional>
<ref name="form.attrs.enctype"/>
</optional>
<optional>
<ref name="common-form.attrs.name"/>
</optional>
<optional>
<ref name="form.attrs.accept-charset"/>
</optional>
<optional>
<choice>
<ref name="common.attrs.aria"/>
<ref name="common.attrs.aria.implicit.region"/>
</choice>
</optional>
</interleave>
</define>
<define name="form.attrs.action">
<attribute name="action">
<ref name="common.data.uri"/>
</attribute>
</define>
<define name="form.attrs.method">
<attribute name="method">
<ref name="form.attrs.method.data"/>
</attribute>
</define>
<define name="form.attrs.method.data">
<choice>
<value type="string">get</value>
<value type="string">post</value>
</choice>
</define>
<define name="form.attrs.enctype">
<attribute name="enctype">
<ref name="form.attrs.enctype.data"/>
</attribute>
</define>
<define name="form.attrs.enctype.data">
<choice>
<value type="string">application/x-www-form-urlencoded</value>
<value type="string">multipart/form-data</value>
</choice>
</define>
<define name="form.attrs.accept-charset">
<attribute name="accept-charset">
<ref name="form.data.charsetlist"/>
</attribute>
</define>
<define name="form.inner">
<ref name="common.inner.flow"/>
</define>
<define name="common.elem.flow" combine="choice">
<ref name="form.elem"/>
</define>
<define name="fieldset.elem">
<a:documentation>Fieldset: &lt;fieldset&gt;</a:documentation>
<element name="fieldset">
<interleave>
<ref name="fieldset.inner"/>
<ref name="fieldset.attrs"/>
</interleave>
</element>
</define>
<define name="fieldset.attrs">
<interleave>
<ref name="common.attrs"/>
<optional>
<ref name="common.attrs.aria.implicit.group"/>
</optional>
</interleave>
</define>
<define name="fieldset.inner">
<optional>
<ref name="legend.elem"/>
</optional>
<!-- REVISIT should this be required? -->
<ref name="common.inner.flow"/>
</define>
<define name="common.elem.flow" combine="choice">
<ref name="fieldset.elem"/>
</define>
<define name="label.elem">
<a:documentation>Label: &lt;label&gt;</a:documentation>
<element name="label">
<interleave>
<ref name="label.inner"/>
<ref name="label.attrs"/>
</interleave>
</element>
</define>
<define name="label.attrs">
<interleave>
<ref name="common.attrs"/>
<optional>
<ref name="label.attrs.for"/>
</optional>
<optional>
<ref name="common.attrs.aria.implicit.region"/>
</optional>
</interleave>
</define>
<define name="label.attrs.for">
<attribute name="for">
<ref name="common.data.idref"/>
</attribute>
</define>
<define name="label.inner">
<ref name="common.inner.phrasing"/>
</define>
<!-- REVISIT making obvious guess -->
<define name="common.elem.phrasing" combine="choice">
<ref name="label.elem"/>
</define>
</grammar>