datatypes w = "http://whattf.org/datatype-draft"
# #####################################################################
##  RELAX NG Schema for HTML 5: Obsolete Elements and Attributes      #
# #####################################################################

## In order to work around RELAX NG limitations and to thereby get more
## useful error messages, the following elements and attributes are
## allowed here but disallowed in the assertions-checking code.

## Obsolete elements

## Centering: <center>

	center.elem =
		element center { center.inner & center.attrs }
	center.attrs =
		( common.attrs )
	center.inner =
		( common.inner.flow )

	common.elem.flow |= center.elem

## Inline Styling: <font>

	font.elem =
		element font { font.inner & font.attrs }
	font.attrs =
		(	common.attrs
		&	font.attrs.color?
		&	font.attrs.face?
		&	font.attrs.size?
		&	common.attrs.aria?
		)
		font.attrs.color =
			attribute color {
				string
			}
		font.attrs.face =
			attribute face {
				string
			}
		font.attrs.size =
			attribute size {
				string
			}
	font.inner =
		( common.inner.phrasing )

	common.elem.phrasing |= font.elem

## Base Font Size: <basefont>

	basefont.elem =
		element basefont { empty & basefont.attrs }
	basefont.attrs =
		(	common.attrs
		&	basefont.attrs.color?
		&	basefont.attrs.face?
		&	basefont.attrs.size?
		)
		basefont.attrs.color =
			attribute color {
				string
			}
		basefont.attrs.face =
			attribute face {
				string
			}
		basefont.attrs.size =
			attribute size {
				string
			}

	common.elem.flow |= basefont.elem

## Larger Font: <big>

	big.elem =
		element big { big.inner & big.attrs }
	big.attrs =
		( common.attrs )
	big.inner =
		( common.inner.flow )

	common.elem.phrasing |= big.elem

## Struck Text: <strike>

	strike.elem =
		element strike { strike.inner & strike.attrs }
	strike.attrs =
		( common.attrs )
	strike.inner =
		( common.inner.flow )

	common.elem.phrasing |= strike.elem

## Teletype: <tt>

	tt.elem =
		element tt { tt.inner & tt.attrs }
	tt.attrs =
		( common.attrs )
	tt.inner =
		( common.inner.flow )

	common.elem.phrasing |= tt.elem

## Abbreviation: <acronym>

	acronym.elem =
		element acronym { acronym.inner & acronym.attrs }
	acronym.attrs =
		( common.attrs )
	acronym.inner =
		( common.inner.flow )

	common.elem.phrasing |= acronym.elem

## Directory: <dir>

	dir.elem =
		element dir { dir.inner & dir.attrs }
	dir.attrs =
		(	common.attrs
		&	dir.attrs.compact?
		)
	dir.attrs.compact =
		attribute compact {
			string
		}
	dir.inner =
		( li.elem* )

	common.elem.flow |= dir.elem

## Java Applets: <applet>

	applet.elem.flow =
		element applet { applet.inner.flow & applet.attrs }
	applet.elem.phrasing =
		element applet { applet.inner.phrasing & applet.attrs }
	applet.attrs =
		(	common.attrs
		&	applet.attrs.archive?
		&	applet.attrs.code
		&	applet.attrs.codebase?
		&	applet.attrs.name?
		&	applet.attrs.height
		&	applet.attrs.width
		)
		applet.attrs.archive =
			attribute archive {
				common.data.uri #FIXME *comma* separated URI list (*grumble*)
			}
		applet.attrs.code =
			attribute code {
				token
			}
		applet.attrs.codebase =
			attribute codebase {
				common.data.uri
			}
		applet.attrs.name =
			attribute name {
				string #FIXME refine
			}
		applet.attrs.height =
			attribute height {
				common.data.integer.positive
			}
		applet.attrs.width =
			attribute width {
				common.data.integer.positive
			}
	applet.inner.flow =
		(	param.elem*
		,	common.inner.flow
		)
	applet.inner.phrasing =
		(	param.elem*
		,	common.inner.phrasing
		)

	common.elem.flow |= applet.elem.flow
	common.elem.phrasing |= applet.elem.phrasing

## Frame Set: <frameset>

	frameset.elem =
		element frameset { frameset.inner & frameset.attrs }
	frameset.attrs =
		(	common.attrs
		&	frameset.attrs.rows?
		&	frameset.attrs.columns?
		&	frameset.attrs.onunload?
		)
		frameset.attrs.rows =
			attribute rows {
				string
			}
		frameset.attrs.columns =
			attribute columns {
				string
			}
		frameset.attrs.onunload =
			attribute onunload {
				string
			}
	frameset.inner =
		(
			(	frameset.elem
			|	frame.elem
			)+
			& noframes.elem?
		)

## Frame: <frame>

	frame.elem =
		element frame { empty & frame.attrs }
	frame.attrs =
		(	common.attrs.basic
		&	common.attrs.i18n
		&	common.attrs.present
		&	common.attrs.other
		&	frame.attrs.longdesc?
		&	frame.attrs.name?
		&	frame.attrs.src?
		&	frame.attrs.frameborder?
		&	frame.attrs.marginwidth?
		&	frame.attrs.marginheight?
		&	frame.attrs.noresize?
		&	frame.attrs.scrolling?
		)
		frame.attrs.longdesc =
			attribute longdesc {
				string
			}
		frame.attrs.name =
			attribute name {
				string
			}
		frame.attrs.src =
			attribute src {
				string
			}
		frame.attrs.frameborder =
			attribute frameborder {
				string
			}
		frame.attrs.marginwidth =
			attribute marginwidth {
				string
			}
		frame.attrs.marginheight =
			attribute marginheight {
				string
			}
		frame.attrs.noresize =
			attribute noresize {
				string
			}
		frame.attrs.scrolling =
			attribute scrolling {
				string
			}

## Alternate no-frames content: <noframes>

	noframes.elem =
		element noframes { noframes.inner & noframes.attrs }
	noframes.attrs =
		( common.attrs )
	noframes.inner =
		( common.inner.flow )

	common.elem.flow |= noframes.elem

## "content-language" pragma directive: <meta http-equiv='content-language'>

	meta.http-equiv.content-language.elem =
		element meta { meta.inner & meta.http-equiv.content-language.attrs }
	meta.http-equiv.content-language.attrs =
		(	common.attrs.basic
		&	common.attrs.i18n
		&	common.attrs.present
		&	common.attrs.other
		&	meta.http-equiv.attrs.http-equiv.content-language
		&	meta.http-equiv.attrs.content.content-language?
		)
		meta.http-equiv.attrs.http-equiv.content-language =
			attribute http-equiv {
				w:string "content-language"
			}
		meta.http-equiv.attrs.content.content-language =
			attribute content {
				string
			}

	common.elem.metadata |= meta.http-equiv.content-language.elem # not quite right per spec
                                                               # if the definition is
                                                               # reused in another language

## Key-pair generator/input control: <keygen>

	keygen.elem =
		element keygen { keygen.inner & keygen.attrs* }
	keygen.attrs = attribute * { text }
	keygen.inner =
		( empty )

	common.elem.phrasing |= keygen.elem

## Obsolete attributes

## abbr attribute

	td.attrs.abbr =
		attribute abbr {
			string
		}
	td.attrs &= td.attrs.abbr?

	th.attrs.abbr =
		attribute abbr {
			string
		}
	th.attrs &= th.attrs.abbr?

## archive attribute

	object.attrs.archive =
		attribute archive {
			string
		}
	object.attrs &= object.attrs.archive?

## axis attribute

	td.attrs.axis =
		attribute axis {
			string
		}
	td.attrs &= td.attrs.axis?

	th.attrs.axis =
		attribute axis {
			string
		}
	th.attrs &= th.attrs.axis?

## charset attribute

	link.attrs.charset =
		attribute charset {
			string
		}
	link.attrs &= link.attrs.charset?

	a.attrs.charset =
		attribute charset {
			string
		}
	a.attrs &= a.attrs.charset?

## classid attribute

	object.attrs.classid =
		attribute classid {
			common.data.uri
		}
	object.attrs &= object.attrs.classid?

## codebase attribute

	object.attrs.codebase =
		attribute codebase {
			common.data.uri
		}
	object.attrs &= object.attrs.codebase?

## codetype attribute

	object.attrs.codetype =
		attribute codetype {
			common.data.mimetype
		}
	object.attrs &= object.attrs.codetype?

## code attribute

	object.attrs.code =
		attribute code {
			token
		}
	object.attrs &= object.attrs.code?

## coords attribute

	a.attrs.coords =
		attribute coords {
			string
		}
	a.attrs &= a.attrs.coords?

## declare attribute

	object.attrs.declare =
		attribute declare {
			string
		}
	object.attrs &= object.attrs.declare?

## longdesc attribute

	img.attrs.longdesc =
		attribute longdesc {
			common.data.uri.non-empty
		}
	img.attrs &= img.attrs.longdesc?

	iframe.attrs.longdesc =
		attribute longdesc {
			string
		}
	iframe.attrs &= iframe.attrs.longdesc?

## methods attribute

	a.attrs.methods =
		attribute methods {
			string
		}
	a.attrs &= a.attrs.methods?

	link.attrs.methods =
		attribute methods {
			string
		}
	link.attrs &= link.attrs.methods?

## name attribute

	img.attrs.name =
		attribute name {
			string
		}
	img.attrs &= img.attrs.name?

	embed.attrs.name =
		attribute name {
			string
		}
	embed.attrs &= embed.attrs.name?

	option.attrs.name =
		attribute name {
			string
		}
	option.attrs &= option.attrs.name?

## nohref attribute

	area.attrs.nohref =
		attribute nohref {
			string
		}
	area.attrs &= area.attrs.nohref?

## profile attribute

	head.attrs.profile =
		attribute profile {
			string
		}
	head.attrs &= head.attrs.profile?

## rev attribute

	link.attrs.rev =
		attribute rev {
			string
		}
	link.attrs &= link.attrs.rev?

	a.attrs.rev =
		attribute rev {
			string
		}
	a.attrs &= a.attrs.rev?

## scheme attribute

	meta.attrs.scheme =
		attribute scheme {
			string
		}
	meta.name.attrs &= meta.attrs.scheme?

## scope attribute

	td.attrs.scope =
		attribute scope {
			string
		}
	td.attrs &= td.attrs.scope?

## shape attribute

	a.attrs.shape =
		attribute shape {
			string
		}
	a.attrs &= a.attrs.shape?

## standby attribute

	object.attrs.standby =
		attribute standby {
			string
		}
	object.attrs &= object.attrs.standby?

## target attribute

	link.attrs.target =
		attribute target {
			string
		}
	link.attrs &= link.attrs.target?

## type attribute

	param.attrs.type =
		attribute type {
			string
		}
	param.attrs &= param.attrs.type?

## urn attribute

	a.attrs.urn =
		attribute urn {
			string
		}
	a.attrs &= a.attrs.urn?

	link.attrs.urn =
		attribute urn {
			string
		}
	link.attrs &= link.attrs.urn?

## usemap attribute

	input.attrs.usemap =
		attribute usemap {
			string
		}
	input.image.attrs &= input.attrs.usemap?

## valuetype attribute

	param.attrs.valuetype =
		attribute valuetype {
			string
		}
	param.attrs &= param.attrs.valuetype?

## version attribute

	html.attrs.version =
		attribute version {
			string
		}
	html.attrs &= html.attrs.version?

## Obsolete ARIA attributes

	aria.state.grabbed =
		attribute aria-grabbed {
			string
		}
	aria.state.dropeffect =
		attribute aria-dropeffect {
			string
		}
	aria.global &= aria.state.grabbed?
	aria.global &= aria.state.dropeffect?

## Obsolete style attributes

## align attribute

	caption.attrs.align =
		attribute align {
			string
		}
	caption.attrs &= caption.attrs.align?

	col.attrs.align =
		attribute align {
			string
		}
	col.attrs &= col.attrs.align?

	colgroup.attrs.align =
		attribute align {
			string
		}
	colgroup.attrs &= colgroup.attrs.align?

	div.attrs.align =
		attribute align {
			string
		}
	div.attrs &= div.attrs.align?

	embed.attrs.align =
		attribute align {
			string
		}
	embed.attrs &= embed.attrs.align?

	h1.attrs.align =
		attribute align {
			string
		}
	h1.attrs &= h1.attrs.align?

	h2.attrs.align =
		attribute align {
			string
		}
	h2.attrs &= h2.attrs.align?

	h3.attrs.align =
		attribute align {
			string
		}
	h3.attrs &= h3.attrs.align?

	h4.attrs.align =
		attribute align {
			string
		}
	h4.attrs &= h4.attrs.align?

	h5.attrs.align =
		attribute align {
			string
		}
	h5.attrs &= h5.attrs.align?

	h6.attrs.align =
		attribute align {
			string
		}
	h6.attrs &= h6.attrs.align?

	hr.attrs.align =
		attribute align {
			string
		}
	hr.attrs &= hr.attrs.align?

	iframe.attrs.align =
		attribute align {
			string
		}
	iframe.attrs &= iframe.attrs.align?

	img.attrs.align =
		attribute align {
			string
		}
	img.attrs &= img.attrs.align?

	input.attrs.align =
		attribute align {
			string
		}
	input.text.attrs &= input.attrs.align?
	input.password.attrs &= input.attrs.align?
	input.checkbox.attrs &= input.attrs.align?
	input.radio.attrs &= input.attrs.align?
	input.button.attrs &= input.attrs.align?
	input.submit.attrs &= input.attrs.align?
	input.reset.attrs &= input.attrs.align?
	input.file.attrs &= input.attrs.align?
	input.image.attrs &= input.attrs.align?
	input.datetime.attrs &= input.attrs.align?
	input.datetime-local.attrs &= input.attrs.align?
	input.date.attrs &= input.attrs.align?
	input.month.attrs &= input.attrs.align?
	input.time.attrs &= input.attrs.align?
	input.week.attrs &= input.attrs.align?
	input.number.attrs &= input.attrs.align?
	input.range.attrs &= input.attrs.align?
	input.email.attrs &= input.attrs.align?
	input.url.attrs &= input.attrs.align?
	input.search.attrs &= input.attrs.align?
	input.tel.attrs &= input.attrs.align?
	input.color.attrs &= input.attrs.align?

	legend.attrs.align =
		attribute align {
			string
		}
	legend.attrs &= legend.attrs.align?

	object.attrs.align =
		attribute align {
			string
		}
	object.attrs &= object.attrs.align?

	p.attrs.align =
		attribute align {
			string
		}
	p.attrs &= p.attrs.align?

	table.attrs.align =
		attribute align {
			string
		}
	table.attrs &= table.attrs.align?

	tbody.attrs.align =
		attribute align {
			string
		}
	tbody.attrs &= tbody.attrs.align?

	td.attrs.align =
		attribute align {
			string
		}
	td.attrs &= td.attrs.align?

	tfoot.attrs.align =
		attribute align {
			string
		}
	tfoot.attrs &= tfoot.attrs.align?

	th.attrs.align =
		attribute align {
			string
		}
	th.attrs &= th.attrs.align?

	thead.attrs.align =
		attribute align {
			string
		}
	thead.attrs &= thead.attrs.align?

	tr.attrs.align =
		attribute align {
			string
		}
	tr.attrs &= tr.attrs.align?

## alink attribute

	body.attrs.alink =
		attribute alink {
			string
		}
	body.attrs &= body.attrs.alink?

	iframe.attrs.allowtransparency =
		attribute allowtransparency {
			string
		}
	iframe.attrs &= iframe.attrs.allowtransparency?

## background attribute

	body.attrs.background =
		attribute background {
			string
		}
	body.attrs &= body.attrs.background?

## color attribute

	hr.attrs.color =
		attribute color {
			string
		}
	hr.attrs &= hr.attrs.color?


## bgcolor attribute

	body.attrs.bgcolor =
		attribute bgcolor {
			string
		}
	body.attrs &= body.attrs.bgcolor?

	table.attrs.bgcolor =
		attribute bgcolor {
			string
		}
	table.attrs &= table.attrs.bgcolor?

	tr.attrs.bgcolor =
		attribute bgcolor {
			string
		}
	tr.attrs &= tr.attrs.bgcolor?

	td.attrs.bgcolor =
		attribute bgcolor {
			string
		}
	td.attrs &= td.attrs.bgcolor?

	th.attrs.bgcolor =
		attribute bgcolor {
			string
		}
	th.attrs &= th.attrs.bgcolor?

## border attribute

	object.attrs.border =
		attribute border {
			string
		}
	object.attrs &= object.attrs.border?

	table.attrs.border  =
		attribute border {
			string
		}
	table.attrs &= table.attrs.border?

## cellpadding attribute

	table.attrs.cellpadding =
		attribute cellpadding {
			string
		}
	table.attrs &= table.attrs.cellpadding?

## cellspacing attribute

	table.attrs.cellspacing =
		attribute cellspacing {
			string
		}
	table.attrs &= table.attrs.cellspacing?

## char attribute

	col.attrs.char =
		attribute char {
			string
		}
	col.attrs &= col.attrs.char?

	colgroup.attrs.char =
		attribute char {
			string
		}
	colgroup.attrs &= colgroup.attrs.char?

	tbody.attrs.char =
		attribute char {
			string
		}
	tbody.attrs &= tbody.attrs.char?

	td.attrs.char =
		attribute char {
			string
		}
	td.attrs &= td.attrs.char?

	tfoot.attrs.char =
		attribute char {
			string
		}
	tfoot.attrs &= tfoot.attrs.char?

	th.attrs.char =
		attribute char {
			string
		}
	th.attrs &= th.attrs.char?

	thead.attrs.char =
		attribute char {
			string
		}
	thead.attrs &= thead.attrs.char?

	tr.attrs.char =
		attribute char {
			string
		}
	tr.attrs &= tr.attrs.char?

## charoff attribute

	col.attrs.charoff =
		attribute charoff {
			string
		}
	col.attrs &= col.attrs.charoff?

	colgroup.attrs.charoff =
		attribute charoff {
			string
		}
	colgroup.attrs &= colgroup.attrs.charoff?

	tbody.attrs.charoff =
		attribute charoff {
			string
		}
	tbody.attrs &= tbody.attrs.charoff?

	td.attrs.charoff =
		attribute charoff {
			string
		}
	td.attrs &= td.attrs.charoff?

	tfoot.attrs.charoff =
		attribute charoff {
			string
		}
	tfoot.attrs &= tfoot.attrs.charoff?

	th.attrs.charoff =
		attribute charoff {
			string
		}
	th.attrs &= th.attrs.charoff?

	thead.attrs.charoff =
		attribute charoff {
			string
		}
	thead.attrs &= thead.attrs.charoff?

	tr.attrs.charoff =
		attribute charoff {
			string
		}
	tr.attrs &= tr.attrs.charoff?

## clear attribute

	br.attrs.clear =
		attribute clear {
			string
		}
	br.attrs &= br.attrs.clear?

## compact attribute

	dl.attrs.compact =
		attribute compact {
			string
		}
	dl.attrs &= dl.attrs.compact?

	menu.attrs.compact =
		attribute compact {
			string
		}
	menu.attrs &= menu.attrs.compact?

	ol.attrs.compact =
		attribute compact {
			string
		}
	ol.attrs &= ol.attrs.compact?

	ul.attrs.compact =
		attribute compact {
			string
		}
	ul.attrs &= ul.attrs.compact?

## frame attribute

	table.attrs.frame =
		attribute frame {
			string
		}
	table.attrs &= table.attrs.frame?

## frameborder attribute

	iframe.attrs.frameborder =
		attribute frameborder {
			string
		}
	iframe.attrs &= iframe.attrs.frameborder?

## height attribute

	td.attrs.height =
		attribute height {
			string
		}
	td.attrs &= td.attrs.height?

	th.attrs.height =
		attribute height {
			string
		}
	th.attrs &= th.attrs.height?

## hspace attribute

	embed.attrs.hspace =
		attribute hspace {
			string
		}
	embed.attrs &= embed.attrs.hspace?

	iframe.attrs.hspace =
		attribute hspace {
			string
		}
	iframe.attrs &= iframe.attrs.hspace?

	input.attrs.hspace =
		attribute hspace {
			string
		}
	input.text.attrs &= input.attrs.hspace?
	input.password.attrs &= input.attrs.hspace?
	input.checkbox.attrs &= input.attrs.hspace?
	input.radio.attrs &= input.attrs.hspace?
	input.button.attrs &= input.attrs.hspace?
	input.submit.attrs &= input.attrs.hspace?
	input.reset.attrs &= input.attrs.hspace?
	input.file.attrs &= input.attrs.hspace?
	input.image.attrs &= input.attrs.hspace?
	input.datetime.attrs &= input.attrs.hspace?
	input.datetime-local.attrs &= input.attrs.hspace?
	input.date.attrs &= input.attrs.hspace?
	input.month.attrs &= input.attrs.hspace?
	input.time.attrs &= input.attrs.hspace?
	input.week.attrs &= input.attrs.hspace?
	input.number.attrs &= input.attrs.hspace?
	input.range.attrs &= input.attrs.hspace?
	input.email.attrs &= input.attrs.hspace?
	input.url.attrs &= input.attrs.hspace?
	input.search.attrs &= input.attrs.hspace?
	input.tel.attrs &= input.attrs.hspace?
	input.color.attrs &= input.attrs.hspace?

	img.attrs.hspace =
		attribute hspace {
			string
		}
	img.attrs &= img.attrs.hspace?

	object.attrs.hspace =
		attribute hspace {
			string
		}
	object.attrs &= object.attrs.hspace?

## link attribute

	body.attrs.link =
		attribute link {
			string
		}
	body.attrs &= body.attrs.link?

## bottommargin attribute

	body.attrs.bottommargin =
		attribute bottommargin {
			string
		}
	body.attrs &= body.attrs.bottommargin?

## marginheight attribute

	body.attrs.marginheight =
		attribute marginheight {
			string
		}
	body.attrs &= body.attrs.marginheight?

	iframe.attrs.marginheight =
		attribute marginheight {
			string
		}
	iframe.attrs &= iframe.attrs.marginheight?

## leftmargin attribute

	body.attrs.leftmargin =
		attribute leftmargin {
			string
		}
	body.attrs &= body.attrs.leftmargin?

## rightmargin attribute

	body.attrs.rightmargin =
		attribute rightmargin {
			string
		}
	body.attrs &= body.attrs.rightmargin?

## topmargin attribute

	body.attrs.topmargin =
		attribute topmargin {
			string
		}
	body.attrs &= body.attrs.topmargin?

## marginwidth attribute

	body.attrs.marginwidth =
		attribute marginwidth {
			string
		}
	body.attrs &= body.attrs.marginwidth?

	iframe.attrs.marginwidth =
		attribute marginwidth {
			string
		}
	iframe.attrs &= iframe.attrs.marginwidth?

## noshade attribute

	hr.attrs.noshade =
		attribute noshade {
			string
		}
	hr.attrs &= hr.attrs.noshade?

## nowrap attribute

	td.attrs.nowrap =
		attribute nowrap {
			string
		}
	td.attrs &= td.attrs.nowrap?

	th.attrs.nowrap =
		attribute nowrap {
			string
		}
	th.attrs &= th.attrs.nowrap?

## rules attribute

	table.attrs.rules =
		attribute rules {
			string
		}
	table.attrs &= table.attrs.rules?

## datapagesize attribute

	table.attrs.datapagesize =
		attribute datapagesize {
			string
		}
	table.attrs &= table.attrs.datapagesize?

## scrolling attribute

	iframe.attrs.scrolling =
		attribute scrolling {
			string
		}
	iframe.attrs &= iframe.attrs.scrolling?

## size attribute

	hr.attrs.size =
		attribute size {
			string
		}
	hr.attrs &= hr.attrs.size?

## summary attribute

	table.attrs.summary =
		attribute summary {
			string
		}
	table.attrs &= table.attrs.summary?

## text attribute

	body.attrs.text =
		attribute text {
			string
		}
	body.attrs &= body.attrs.text?

## type attribute

	li.attrs.type =
		attribute type {
			string
		}
	li.attrs &= li.attrs.type?
	oli.attrs &= li.attrs.type?

	ul.attrs.type =
		attribute type {
			string
		}
	ul.attrs &= ul.attrs.type?

## valign attribute

	col.attrs.valign =
		attribute valign {
			string
		}
	col.attrs &= col.attrs.valign?

	colgroup.attrs.valign =
		attribute valign {
			string
		}
	colgroup.attrs &= colgroup.attrs.valign?

	table.attrs.valign =
		attribute valign {
			string
		}
	table.attrs &= table.attrs.valign?

	tbody.attrs.valign =
		attribute valign {
			string
		}
	tbody.attrs &= tbody.attrs.valign?

	td.attrs.valign =
		attribute valign {
			string
		}
	td.attrs &= td.attrs.valign?

	tfoot.attrs.valign =
		attribute valign {
			string
		}
	tfoot.attrs &= tfoot.attrs.valign?

	th.attrs.valign =
		attribute valign {
			string
		}
	th.attrs &= th.attrs.valign?

	thead.attrs.valign =
		attribute valign {
			string
		}
	thead.attrs &= thead.attrs.valign?

	tr.attrs.valign =
		attribute valign {
			string
		}
	tr.attrs &= tr.attrs.valign?

## vlink attribute

	body.attrs.vlink =
		attribute vlink {
			string
		}
	body.attrs &= body.attrs.vlink?

## vspace attribute

	embed.attrs.vspace =
		attribute vspace {
			string
		}
	embed.attrs &= embed.attrs.vspace?

	iframe.attrs.vspace =
		attribute vspace {
			string
		}
	iframe.attrs &= iframe.attrs.vspace?

	input.attrs.vspace =
		attribute vspace {
			string
		}
	input.text.attrs &= input.attrs.vspace?
	input.password.attrs &= input.attrs.vspace?
	input.checkbox.attrs &= input.attrs.vspace?
	input.radio.attrs &= input.attrs.vspace?
	input.button.attrs &= input.attrs.vspace?
	input.submit.attrs &= input.attrs.vspace?
	input.reset.attrs &= input.attrs.vspace?
	input.file.attrs &= input.attrs.vspace?
	input.image.attrs &= input.attrs.vspace?
	input.datetime.attrs &= input.attrs.vspace?
	input.datetime-local.attrs &= input.attrs.vspace?
	input.date.attrs &= input.attrs.vspace?
	input.month.attrs &= input.attrs.vspace?
	input.time.attrs &= input.attrs.vspace?
	input.week.attrs &= input.attrs.vspace?
	input.number.attrs &= input.attrs.vspace?
	input.range.attrs &= input.attrs.vspace?
	input.email.attrs &= input.attrs.vspace?
	input.url.attrs &= input.attrs.vspace?
	input.search.attrs &= input.attrs.vspace?
	input.tel.attrs &= input.attrs.vspace?
	input.color.attrs &= input.attrs.vspace?

	img.attrs.vspace =
		attribute vspace {
			string
		}
	img.attrs &= img.attrs.vspace?

	object.attrs.vspace =
		attribute vspace {
			string
		}
	object.attrs &= object.attrs.vspace?

## width attribute

	col.attrs.width =
		attribute width {
			string
		}
	col.attrs &= col.attrs.width?

	colgroup.attrs.width =
		attribute width {
			string
		}
	colgroup.attrs &= colgroup.attrs.width?

	hr.attrs.width =
		attribute width {
			string
		}
	hr.attrs &= hr.attrs.width?

	pre.attrs.width =
		attribute width {
			string
		}
	pre.attrs &= pre.attrs.width?

	table.attrs.width =
		attribute width {
			string
		}
	table.attrs &= table.attrs.width?

	td.attrs.width =
		attribute width {
			string
		}
	td.attrs &= td.attrs.width?

	th.attrs.width =
		attribute width {
			string
		}
	th.attrs &= th.attrs.width?

## event attribute

	script.attrs.event =
		attribute event {
			string
		}
	script.attrs.imported &= script.attrs.event?
	script.attrs.embedded &= script.attrs.event?

## for attribute

	script.attrs.for =
		attribute for {
			string
		}
	script.attrs.imported &= script.attrs.for?
	script.attrs.embedded &= script.attrs.for?

## datafld attribute

	legacy.attrs.datafld =
		attribute datafld {
			string
		}
	span.attrs &= legacy.attrs.datafld?
	div.attrs &= legacy.attrs.datafld?
	object.attrs &= legacy.attrs.datafld?
	input.text.attrs &= legacy.attrs.datafld?
	input.password.attrs &= legacy.attrs.datafld?
	input.checkbox.attrs &= legacy.attrs.datafld?
	input.radio.attrs &= legacy.attrs.datafld?
	input.button.attrs &= legacy.attrs.datafld?
	input.submit.attrs &= legacy.attrs.datafld?
	input.reset.attrs &= legacy.attrs.datafld?
	input.file.attrs &= legacy.attrs.datafld?
	input.image.attrs &= legacy.attrs.datafld?
	input.datetime.attrs &= legacy.attrs.datafld?
	input.datetime-local.attrs &= legacy.attrs.datafld?
	input.date.attrs &= legacy.attrs.datafld?
	input.month.attrs &= legacy.attrs.datafld?
	input.time.attrs &= legacy.attrs.datafld?
	input.week.attrs &= legacy.attrs.datafld?
	input.number.attrs &= legacy.attrs.datafld?
	input.range.attrs &= legacy.attrs.datafld?
	input.email.attrs &= legacy.attrs.datafld?
	input.url.attrs &= legacy.attrs.datafld?
	input.search.attrs &= legacy.attrs.datafld?
	input.tel.attrs &= legacy.attrs.datafld?
	input.color.attrs &= legacy.attrs.datafld?
	select.attrs &= legacy.attrs.datafld?
	textarea.attrs &= legacy.attrs.datafld?
	button.submit.attrs &= legacy.attrs.datafld?
	button.reset.attrs &= legacy.attrs.datafld?
	button.button.attrs &= legacy.attrs.datafld?
	table.attrs &= legacy.attrs.datafld?

## dataformatas attribute

	legacy.attrs.dataformatas =
		attribute dataformatas {
			string
		}
	span.attrs &= legacy.attrs.dataformatas?
	div.attrs &= legacy.attrs.dataformatas?
	object.attrs &= legacy.attrs.dataformatas?
	input.attrs &= legacy.attrs.dataformatas?
	input.text.attrs &= legacy.attrs.dataformatas?
	input.password.attrs &= legacy.attrs.dataformatas?
	input.checkbox.attrs &= legacy.attrs.dataformatas?
	input.radio.attrs &= legacy.attrs.dataformatas?
	input.button.attrs &= legacy.attrs.dataformatas?
	input.submit.attrs &= legacy.attrs.dataformatas?
	input.reset.attrs &= legacy.attrs.dataformatas?
	input.file.attrs &= legacy.attrs.dataformatas?
	input.image.attrs &= legacy.attrs.dataformatas?
	input.datetime.attrs &= legacy.attrs.dataformatas?
	input.datetime-local.attrs &= legacy.attrs.dataformatas?
	input.date.attrs &= legacy.attrs.dataformatas?
	input.month.attrs &= legacy.attrs.dataformatas?
	input.time.attrs &= legacy.attrs.dataformatas?
	input.week.attrs &= legacy.attrs.dataformatas?
	input.number.attrs &= legacy.attrs.dataformatas?
	input.range.attrs &= legacy.attrs.dataformatas?
	input.email.attrs &= legacy.attrs.dataformatas?
	input.url.attrs &= legacy.attrs.dataformatas?
	input.search.attrs &= legacy.attrs.dataformatas?
	input.tel.attrs &= legacy.attrs.dataformatas?
	input.color.attrs &= legacy.attrs.dataformatas?
	select.attrs &= legacy.attrs.dataformatas?
	textarea.attrs &= legacy.attrs.dataformatas?
	button.submit.attrs &= legacy.attrs.dataformatas?
	button.reset.attrs &= legacy.attrs.dataformatas?
	button.button.attrs &= legacy.attrs.dataformatas?
	table.attrs &= legacy.attrs.dataformatas?

## datasrc attribute

	legacy.attrs.datasrc =
		attribute datasrc {
			string
		}
	span.attrs &= legacy.attrs.datasrc?
	div.attrs &= legacy.attrs.datasrc?
	object.attrs &= legacy.attrs.datasrc?
	input.text.attrs &= legacy.attrs.datasrc?
	input.password.attrs &= legacy.attrs.datasrc?
	input.checkbox.attrs &= legacy.attrs.datasrc?
	input.radio.attrs &= legacy.attrs.datasrc?
	input.button.attrs &= legacy.attrs.datasrc?
	input.submit.attrs &= legacy.attrs.datasrc?
	input.reset.attrs &= legacy.attrs.datasrc?
	input.file.attrs &= legacy.attrs.datasrc?
	input.image.attrs &= legacy.attrs.datasrc?
	input.datetime.attrs &= legacy.attrs.datasrc?
	input.datetime-local.attrs &= legacy.attrs.datasrc?
	input.date.attrs &= legacy.attrs.datasrc?
	input.month.attrs &= legacy.attrs.datasrc?
	input.time.attrs &= legacy.attrs.datasrc?
	input.week.attrs &= legacy.attrs.datasrc?
	input.number.attrs &= legacy.attrs.datasrc?
	input.range.attrs &= legacy.attrs.datasrc?
	input.email.attrs &= legacy.attrs.datasrc?
	input.url.attrs &= legacy.attrs.datasrc?
	input.search.attrs &= legacy.attrs.datasrc?
	input.tel.attrs &= legacy.attrs.datasrc?
	input.color.attrs &= legacy.attrs.datasrc?
	select.attrs &= legacy.attrs.datasrc?
	textarea.attrs &= legacy.attrs.datasrc?
	button.submit.attrs &= legacy.attrs.datasrc?
	button.reset.attrs &= legacy.attrs.datasrc?
	button.button.attrs &= legacy.attrs.datasrc?
	table.attrs &= legacy.attrs.datasrc?

## manifest attribute

	html.attrs.manifest =
		attribute manifest {
			string
		}

	html.attrs &= html.attrs.manifest?
