html5.flow.class |= html5.forms.flow.class
html5.phrasing.class |= html5.forms.phrasing.class
html5.forms.flow.class |= html5.form | html5.fieldset
html5.forms.phrasing.class |= html5.meter | html5.input.class | html5.textarea
| html5.label | html5.button.class | html5.select | html5.output | html5.datalist
| html5.keygen
html5.input.class |= html5.input.text | html5.input.password | html5.input.checkbox
| html5.input.radio | html5.input.button | html5.input.submit | html5.input.reset
| html5.input.file | html5.input.hidden | html5.input.image | html5.input.datetime
| html5.input.datetime-local | html5.input.date | html5.input.month | html5.input.time
| html5.input.week | html5.input.number | html5.input.range | html5.input.email
| html5.input.url | html5.input.search | html5.input.tel | html5.input.color
html5.button.class |= html5.button.submit | html5.button.reset | html5.button.button
html5.form = element form { html5.form.attlist & html5.form.content }
html5.form.attlist &= html5.global.attrs & html5.form.action.attr?
& html5.form.method.attr? & html5.form.enctype.attr?
& html5.forms.name.attr? & html5.form.accept-charset.attr?
& html5.form.novalidate.attr? & html5.form.target.attr?
& html5.form.autocomplete.attr?
html5.form.action.attr = attribute action { datatype.html5.URL.spaces }
html5.form.method.attr = attribute method { html5.form.method.attr.value }
html5.form.method.attr.value = ( 'get' | 'post' )
html5.form.enctype.attr = attribute enctype { html5.form.enctype.attr.value }
html5.form.enctype.attr.value = ( 'application/x-www-form-urlencoded' | 'multipart/form-data' | 'text/plain' )
html5.form.accept-charset.attr = attribute accept-charset { datatype.html5.forms.charsetlist}
html5.form.novalidate.attr = attribute novalidate { 'novalidate' | '' }
html5.form.target.attr = attribute target { datatype.html5.browsing.context.name.or.keyword }
html5.form.autocomplete.attr = attribute autocomplete { 'on' | 'off' }
html5.form.content = html5.flow.model
html5.input.text = element input { html5.input.text.attlist }
html5.input.text.attlist = html5.global.attrs & html5.forms.common.attrs
& attribute type { 'text' }? & html5.forms.maxlength.attr?
& html5.forms.readonly.attr? & html5.forms.size.attr?
& html5.input.text.value.attr? & html5.input.autocomplete.attr?
& html5.forms.autofocus.attr? & html5.input.list.attr?
& html5.forms.pattern.attr? & html5.forms.required.attr?
& html5.forms.placeholder.attr? & html5.input.common.attrs
html5.input.text.value.attr = attribute value { datatype.html5.forms.string.nolinebreaks }
html5.input.password = element input { html5.input.password.attlist }
html5.input.password.attlist = html5.global.attrs & html5.forms.common.attrs
& attribute type { 'password' } & html5.forms.maxlength.attr?
& html5.forms.readonly.attr? & html5.forms.size.attr?
& html5.input.password.value.attr? & html5.input.autocomplete.attr?
& html5.forms.autofocus.attr? & html5.forms.pattern.attr?
& html5.forms.required.attr? & html5.forms.placeholder.attr?
& html5.input.common.attrs
html5.input.password.value.attr = attribute value { datatype.html5.forms.string.nolinebreaks }
html5.input.checkbox = element input { html5.input.checkbox.attlist }
html5.input.checkbox.attlist = html5.global.attrs & html5.forms.common.attrs
& attribute type { 'checkbox' } & html5.input.checked.attr?
& html5.input.checkbox.value.attr? & html5.forms.autofocus.attr?
& html5.forms.required.attr? & html5.input.common.attrs
html5.input.checkbox.value.attr = attribute value { datatype.string }
html5.input.radio = element input { html5.input.radio.attlist }
html5.input.radio.attlist = html5.global.attrs & html5.forms.common.attrs
& attribute type { 'radio' } & html5.input.checked.attr?
& html5.input.radio.value.attr? & html5.forms.autofocus.attr?
& html5.forms.required.attr? & html5.input.common.attrs
html5.input.radio.value.attr = attribute value { datatype.string }
html5.input.button = element input { html5.input.button.attlist }
html5.input.button.attlist = html5.global.attrs & html5.forms.common.attrs
& attribute type { 'button' } & html5.input.button.value.attr?
& html5.forms.autofocus.attr? & html5.input.common.attrs
html5.input.button.value.attr = attribute value { datatype.string }
html5.input.submit = element input { html5.input.submit.attlist }
html5.input.submit.attlist = html5.global.attrs & html5.forms.common.attrs
& attribute type { 'submit' } & html5.input.submit.value.attr?
& html5.forms.formaction.attr? & html5.forms.autofocus.attr?
& html5.forms.formenctype.attr? & html5.forms.formmethod.attr?
& html5.forms.formtarget.attr? & html5.forms.formnovalidate.attr?
& html5.input.common.attrs
html5.input.submit.value.attr = attribute value { datatype.string }
html5.input.reset = element input { html5.input.reset.attlist }
html5.input.reset.attlist = html5.global.attrs & html5.forms.common.attrs
& attribute type { 'reset' } & html5.input.reset.value.attr?
& html5.forms.autofocus.attr? & html5.input.common.attrs
html5.input.reset.value.attr = attribute value { datatype.string }
html5.input.file = element input { html5.input.file.attlist }
html5.input.file.attlist = html5.global.attrs & html5.forms.common.attrs
& attribute type { 'file'} & html5.input.file.accept.attr?
& html5.forms.autofocus.attr? & html5.forms.required.attr?
& html5.input.multiple.attr? & html5.input.common.attrs
html5.input.file.accept.attr = attribute accept { datatype.html5.forms.mimetypelist }
html5.input.hidden = element input { html5.input.hidden.attlist }
html5.input.hidden.attlist = html5.global.attrs & html5.forms.common.attrs
& attribute type { 'hidden' } & html5.input.hidden.value.attr?
& html5.input.common.attrs
html5.input.hidden.value.attr = attribute value { datatype.string }
html5.input.image = element input { html5.input.image.attlist }
html5.input.image.attlist = html5.global.attrs & html5.forms.common.attrs
& attribute type { 'image' } & html5.alt.attr & html5.src.attr
& html5.forms.formaction.attr? & html5.forms.autofocus.attr?
& html5.forms.formenctype.attr? & html5.forms.formmethod.attr?
& html5.forms.formtarget.attr? & html5.forms.formnovalidate.attr?
& html5.dimension.attrs? & html5.input.common.attrs
html5.input.datetime = element input { html5.input.datetime.attlist }
html5.input.datetime.attlist = html5.global.attrs
& html5.forms.common.attrs & attribute type { 'datetime'}
& html5.input.autocomplete.attr? & html5.forms.autofocus.attr?
& html5.input.list.attr? & html5.input.datetime.min.attr?
& html5.input.datetime.max.attr? & html5.input.step.float.attr?
& html5.forms.readonly.attr? & html5.forms.required.attr?
& html5.input.datetime.value.attr? & html5.input.common.attrs
html5.input.datetime.min.attr = attribute min { datatype.html5.datetime }
html5.input.datetime.max.attr = attribute max { datatype.html5.datetime }
html5.input.datetime.value.attr = attribute value { datatype.html5.datetime }
html5.input.datetime-local = element input { html5.input.datetime-local.attlist }
html5.input.datetime-local.attlist = html5.global.attrs & html5.forms.common.attrs
& attribute type { 'datetime-local' } & html5.input.autocomplete.attr?
& html5.forms.autofocus.attr? & html5.input.list.attr?
& html5.input.datetime-local.min.attr? & html5.input.datetime-local.max.attr?
& html5.input.step.float.attr? & html5.forms.readonly.attr?
& html5.forms.required.attr? & html5.input.datetime-local.value.attr?
& html5.input.common.attrs
html5.input.datetime-local.min.attr = attribute min { datatype.html5.datetime.local }
html5.input.datetime-local.max.attr = attribute max { datatype.html5.datetime.local }
html5.input.datetime-local.value.attr = attribute value { datatype.html5.datetime.local }
html5.input.date = element input { html5.input.date.attlist }
html5.input.date.attlist = html5.global.attrs & html5.forms.common.attrs
& attribute type { 'date' } & html5.input.autocomplete.attr?
& html5.forms.autofocus.attr? & html5.input.list.attr?
& html5.input.date.min.attr? & html5.input.date.max.attr?
& html5.input.step.integer.attr? & html5.forms.readonly.attr?
& html5.forms.required.attr? & html5.input.date.value.attr?
& html5.input.common.attrs
html5.input.date.min.attr = attribute min { datatype.html5.date }
html5.input.date.max.attr = attribute max { datatype.html5.date }
html5.input.date.value.attr = attribute value { datatype.html5.date }
html5.input.month = element input { html5.input.month.attlist }
html5.input.month.attlist = html5.global.attrs & html5.forms.common.attrs
& attribute type { 'month' } & html5.input.autocomplete.attr?
& html5.forms.autofocus.attr? & html5.input.list.attr?
& html5.input.month.min.attr? & html5.input.month.max.attr?
& html5.input.step.integer.attr? & html5.forms.readonly.attr?
& html5.forms.required.attr? & html5.input.month.value.attr?
& html5.input.common.attrs
html5.input.month.min.attr = attribute min { datatype.html5.month }
html5.input.month.max.attr = attribute max { datatype.html5.month }
html5.input.month.value.attr = attribute value { datatype.html5.month }
html5.input.time = element input { html5.input.time.attlist }
html5.input.time.attlist = html5.global.attrs & html5.forms.common.attrs
& attribute type { 'time' } & html5.input.autocomplete.attr?
& html5.forms.autofocus.attr? & html5.input.list.attr?
& html5.input.time.min.attr? & html5.input.time.max.attr?
& html5.input.step.float.attr? & html5.forms.readonly.attr?
& html5.forms.required.attr? & html5.input.time.value.attr?
& html5.input.common.attrs
html5.input.time.min.attr = attribute min { datatype.html5.time }
html5.input.time.max.attr = attribute max { datatype.html5.time }
html5.input.time.value.attr = attribute value { datatype.html5.time }
html5.input.week = element input { html5.input.week.attlist }
html5.input.week.attlist = html5.global.attrs & html5.forms.common.attrs
& attribute type { 'week' } & html5.input.autocomplete.attr?
& html5.forms.autofocus.attr? & html5.input.list.attr?
& html5.input.week.min.attr? & html5.input.week.max.attr?
& html5.input.step.integer.attr? & html5.forms.readonly.attr?
& html5.forms.required.attr? & html5.input.week.value.attr?
& html5.input.common.attrs
html5.input.week.min.attr = attribute min { datatype.html5.week }
html5.input.week.max.attr = attribute max { datatype.html5.week }
html5.input.week.value.attr = attribute value { datatype.html5.week }
html5.input.number = element input { input.number.attlist }
input.number.attlist = html5.global.attrs & html5.forms.common.attrs
& attribute type { 'number' } & html5.input.autocomplete.attr?
& html5.forms.autofocus.attr? & html5.input.list.attr?
& html5.input.number.min.attr? & html5.input.number.max.attr?
& html5.input.step.float.attr? & html5.forms.readonly.attr?
& html5.forms.required.attr? & html5.input.number.value.attr?
& html5.input.common.attrs
html5.input.number.min.attr = attribute min { datatype.float }
html5.input.number.max.attr = attribute max { datatype.float }
html5.input.number.value.attr = attribute value { datatype.float }
html5.input.range = element input { html5.input.range.attlist }
html5.input.range.attlist = html5.global.attrs & html5.forms.common.attrs
& attribute type { 'range' } & html5.input.autocomplete.attr?
& html5.forms.autofocus.attr? & html5.input.list.attr?
& html5.input.range.min.attr? & html5.input.range.max.attr?
& html5.input.step.float.attr? & html5.input.range.value.attr?
& html5.input.common.attrs
html5.input.range.min.attr = attribute min { datatype.float }
html5.input.range.max.attr = attribute max { datatype.float }
html5.input.range.value.attr = attribute value { datatype.float }
html5.input.email = element input { html5.input.email.attlist }
html5.input.email.attlist = html5.global.attrs & html5.forms.common.attrs
& attribute type { 'email' } & html5.input.autocomplete.attr?
& html5.forms.autofocus.attr? & html5.input.list.attr?
& html5.forms.maxlength.attr? & html5.forms.pattern.attr?
& html5.forms.readonly.attr? & html5.forms.required.attr?
& html5.forms.size.attr? & html5.forms.placeholder.attr?
& ((html5.input.multiple.attr & html5.input.email.value.multiple.attr?)
| html5.input.email.value.single.attr? )?
& html5.input.common.attrs
html5.input.email.value.single.attr = attribute value { datatype.html5.emailaddress }
html5.input.email.value.multiple.attr = attribute value { datatype.html5.emailaddresslist }
html5.input.url = element input { html5.input.url.attlist }
html5.input.url.attlist = html5.global.attrs & html5.forms.common.attrs
& attribute type { 'url' } & html5.input.autocomplete.attr?
& html5.forms.autofocus.attr? & html5.input.list.attr?
& html5.forms.maxlength.attr? & html5.forms.pattern.attr?
& html5.forms.readonly.attr? & html5.forms.required.attr?
& html5.forms.size.attr? & html5.forms.placeholder.attr?
& html5.input.url.value.attr? & html5.input.common.attrs
html5.input.url.value.attr = attribute value { '' | datatype.URI.absolute }
html5.input.search = element input { html5.input.search.attlist }
html5.input.search.attlist = html5.global.attrs & html5.forms.common.attrs
& attribute type { 'search' } & html5.input.autocomplete.attr?
& html5.forms.autofocus.attr? & html5.input.list.attr?
& html5.forms.maxlength.attr? & html5.forms.pattern.attr?
& html5.forms.readonly.attr? & html5.forms.required.attr?
& html5.forms.size.attr? & html5.forms.placeholder.attr?
& html5.input.search.value.attr? & html5.input.common.attrs
html5.input.search.value.attr = attribute value { datatype.html5.forms.string.nolinebreaks }
html5.input.tel = element input { html5.input.tel.attlist }
html5.input.tel.attlist = html5.global.attrs & html5.forms.common.attrs
& attribute type { 'tel' } & html5.input.autocomplete.attr?
& html5.forms.autofocus.attr? & html5.input.list.attr?
& html5.forms.maxlength.attr? & html5.forms.pattern.attr?
& html5.forms.readonly.attr? & html5.forms.required.attr?
& html5.forms.size.attr? & html5.forms.placeholder.attr?
& html5.input.tel.value.attr? & html5.input.common.attrs
html5.input.tel.value.attr = attribute value { datatype.string }
html5.input.color = element input { html5.input.color.attlist }
html5.input.color.attlist = html5.global.attrs & html5.forms.common.attrs
& attribute type { 'color' } & html5.input.autocomplete.attr?
& html5.forms.autofocus.attr? & html5.input.list.attr?
& html5.input.color.value.attr? & html5.input.common.attrs
html5.input.color.value.attr = attribute value { datatype.html5.color }
html5.textarea = element textarea { html5.textarea.attlist & html5.textarea.content }
html5.textarea.attlist = html5.global.attrs & html5.forms.common.attrs
& html5.forms.readonly.attr? & html5.forms.maxlength.attr?
& html5.forms.autofocus.attr? & html5.forms.required.attr?
& html5.forms.placeholder.attr? & html5.textarea.rows.attr?
& ((html5.textarea.wrap.hard.attr? & html5.textarea.cols.attr)|
(html5.textarea.wrap.soft.attr? & html5.textarea.cols.attr?))
& html5.forms.dirname.attr?
html5.textarea.cols.attr = attribute cols { datatype.positive.integer }
html5.textarea.rows.attr = attribute rows { datatype.positive.integer }
html5.textarea.wrap.hard.attr = attribute wrap { 'hard' }
html5.textarea.wrap.soft.attr = attribute wrap { 'soft' }
html5.textarea.content = datatype.text
html5.option = element option { html5.option.attlist & html5.option.content }
html5.option.attlist = html5.global.attrs & html5.forms.disabled.attr?
& html5.option.selected.attr? & html5.option.label.attr?
& html5.option.value.attr?
html5.option.selected.attr = attribute selected { 'selected' | '' }
html5.option.label.attr = attribute label { datatype.string }
html5.option.value.attr = attribute value { datatype.string }
html5.option.content = datatype.text
html5.optgroup = element optgroup { html5.optgroup.attlist & html5.optgroup.content }
html5.optgroup.attlist = html5.global.attrs & html5.optgroup.label.attr & html5.forms.disabled.attr?
html5.optgroup.label.attr = attribute label { datatype.string }
html5.optgroup.content = html5.option*
html5.select = element select { html5.select.attlist & html5.select.content }
html5.select.attlist = html5.global.attrs & html5.forms.common.attrs
& html5.select.size.attr? & html5.select.multiple.attr?
& html5.forms.autofocus.attr? & html5.forms.required.attr?
html5.select.size.attr = attribute size { datatype.positive.integer }
html5.select.multiple.attr = attribute multiple { 'multiple' | '' }
html5.select.content = html5.optgroup* & html5.option*
html5.button.submit = element button { html5.button.submit.attlist & html5.button.content }
html5.button.submit.attlist = html5.global.attrs & html5.forms.common.attrs
& html5.button.submit.type.attr? & html5.button.value.attr?
& html5.forms.formaction.attr? & html5.forms.autofocus.attr?
& html5.forms.formenctype.attr? & html5.forms.formmethod.attr?
& html5.forms.formtarget.attr? & html5.forms.formnovalidate.attr?
html5.button.submit.type.attr = attribute type { 'submit' }
html5.button.reset = element button { html5.button.reset.attlist & html5.button.content }
html5.button.reset.attlist = html5.global.attrs & html5.forms.common.attrs
& html5.button.reset.type.attr & html5.button.value.attr?
& html5.forms.autofocus.attr?
html5.button.reset.type.attr = attribute type { 'reset' }
html5.button.button = element button { html5.button.button.attlist & html5.button.content }
html5.button.button.attlist = html5.global.attrs & html5.forms.common.attrs
& html5.button.button.type.attr & html5.button.value.attr?
& html5.forms.autofocus.attr?
html5.button.button.type.attr = attribute type { 'button' }
html5.button.value.attr = attribute value { datatype.string }
html5.button.content = html5.phrasing.model
html5.fieldset = element fieldset { html5.fieldset.attlist & html5.fieldset.content }
html5.fieldset.attlist = html5.global.attrs & html5.forms.common.attrs
html5.fieldset.content = html5.legend?, html5.flow.model
html5.legend = element legend { html5.legend.attlist & html5.legend.content }
html5.legend.attlist = html5.global.attrs
html5.legend.content = html5.phrasing.model
html5.label = element label { html5.label.attlist & html5.label.content }
html5.label.attlist = html5.global.attrs & html5.label.for.attr?
& html5.forms.form.attr?
html5.label.for.attr = attribute for { datatype.IDREF }
html5.label.content = html5.phrasing.model
html5.meter = element meter { html5.meter.attlist & html5.meter.content }
html5.meter.attlist = html5.global.attrs & html5.meter.value.attr & html5.meter.min.attr?
& html5.meter.low.attr? & html5.meter.high.attr? & html5.meter.max.attr? & html5.meter.optimum.attr?
html5.meter.value.attr = attribute value { datatype.float }
html5.meter.min.attr = attribute min { datatype.float }
html5.meter.low.attr = attribute low { datatype.float }
html5.meter.high.attr = attribute high { datatype.float }
html5.meter.max.attr = attribute max { datatype.float }
html5.meter.optimum.attr = attribute optimum { datatype.float }
html5.meter.content = html5.phrasing.model
html5.output = element output { html5.output.attlist & html5.output.content }
html5.output.attlist = html5.global.attrs & html5.forms.name.attr?
& html5.forms.form.attr? & html5.output.for.attr?
html5.output.for.attr = attribute for { datatype.IDREFS }
html5.output.content = html5.phrasing.model
html5.datalist = element datalist { html5.datalist.attlist & html5.datalist.content }
html5.datalist.attlist = html5.global.attrs
html5.datalist.content = html5.option* & html5.phrasing.model
html5.keygen = element keygen { html5.keygen.attlist }
html5.keygen.attlist = html5.global.attrs & html5.keygen.challenge.attr?
& html5.keygen.keytype.attr? & html5.forms.autofocus.attr?
& html5.forms.common.attrs?
html5.keygen.challenge.attr = attribute challenge { datatype.string }
html5.keygen.keytype.attr = attribute keytype { 'rsa' }
html5.input.common.attrs = html5.forms.dirname.attr?
html5.input.checked.attr = attribute checked { 'checked' | '' }
html5.input.autocomplete.attr = attribute autocomplete { 'on' | 'off'}
html5.input.list.attr = attribute list { datatype.IDREF }
html5.input.step.float.attr = attribute step { 'any' | datatype.float.positive }
html5.input.step.integer.attr = attribute step { 'any' | datatype.positive.integer }
html5.input.multiple.attr = attribute multiple { 'multiple' | '' }
html5.forms.common.attrs = html5.forms.name.attr? & html5.forms.disabled.attr? & html5.forms.form.attr?
html5.forms.name.attr = attribute name { datatype.string }
html5.forms.disabled.attr = attribute disabled { 'disabled' | '' }
html5.forms.form.attr = attribute form { datatype.IDREF }
html5.forms.readonly.attr = attribute readonly { 'readonly' | '' }
html5.forms.maxlength.attr = attribute maxlength { datatype.non-negative.integer }
html5.forms.size.attr = attribute size { datatype.positive.integer }
html5.forms.formaction.attr = attribute formaction { datatype.html5.URL.spaces }
html5.forms.formenctype.attr = attribute formenctype { html5.forms.formenctype.attr.value }
html5.forms.formenctype.attr.value = ( 'application/x-www-form-urlencoded' | 'multipart/form-data'| 'text/plain' )
html5.forms.formmethod.attr = attribute formmethod { html5.forms.formmethod.attr.value }
html5.forms.formmethod.attr.value = ( 'get'| 'post')
html5.forms.formtarget.attr = attribute formtarget { datatype.html5.browsing.context.name.or.keyword }
html5.forms.formnovalidate.attr = attribute formnovalidate { 'formnovalidate' | '' }
html5.forms.autofocus.attr = attribute autofocus { 'autofocus' | '' }
html5.forms.pattern.attr = attribute pattern { datatype.html5.forms.pattern }
html5.forms.template.attr = attribute template { datatype.IDREF }
html5.forms.required.attr = attribute required { 'required' | '' }
html5.forms.placeholder.attr = attribute placeholder { datatype.html5.forms.string.nolinebreaks }
html5.forms.dirname.attr = attribute dirname { datatype.string }