emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[elpa] master dcd917c 01/23: Consolidated all RelaxNG files into `/schem


From: Stefan Monnier
Subject: [elpa] master dcd917c 01/23: Consolidated all RelaxNG files into `/schema` dir.
Date: Thu, 14 Jan 2016 19:22:32 +0000

branch: master
commit dcd917ce458345acd2aa7beef6493c54ce56ba5b
Author: Michael[tm] Smith <address@hidden>
Commit: Michael[tm] Smith <address@hidden>

    Consolidated all RelaxNG files into `/schema` dir.
---
 .htaccess                |   10 +
 LICENSE                  |   23 +
 applications.rnc         |  441 +++++++++++++++++
 aria.rnc                 | 1237 ++++++++++++++++++++++++++++++++++++++++++++++
 assertions.sch           | 1228 +++++++++++++++++++++++++++++++++++++++++++++
 block.rnc                |  249 ++++++++++
 common.rnc               |  512 +++++++++++++++++++
 core-scripting.rnc       |  344 +++++++++++++
 data.rnc                 |   94 ++++
 embed.rnc                |  732 +++++++++++++++++++++++++++
 form-datatypes.rnc       |   63 +++
 html5.rnc                |   56 +++
 html5exclusions.rnc      |   63 +++
 media.rnc                |  210 ++++++++
 meta.rnc                 |  390 +++++++++++++++
 microdata.rnc            |  101 ++++
 phrase.rnc               |  399 +++++++++++++++
 rdfa.rnc                 |  285 +++++++++++
 revision.rnc             |   54 ++
 ruby.rnc                 |   51 ++
 sectional.rnc            |  172 +++++++
 structural.rnc           |  135 +++++
 tables.rnc               |  244 +++++++++
 web-components.rnc       |   43 ++
 web-forms-scripting.rnc  |   27 +
 web-forms.rnc            |  604 ++++++++++++++++++++++
 web-forms2-scripting.rnc |    9 +
 web-forms2.rnc           |  830 +++++++++++++++++++++++++++++++
 xhtml5.rnc               |   40 ++
 29 files changed, 8646 insertions(+), 0 deletions(-)

diff --git a/.htaccess b/.htaccess
new file mode 100644
index 0000000..8727307
--- /dev/null
+++ b/.htaccess
@@ -0,0 +1,10 @@
+AddDescription "RelaxNG Schema for HTML 5 Core (XML)" xhtml5core.rnc
+AddDescription "RelaxNG Schema for HTML 5 Core (HTML)" html5core.rnc
+AddDescription "RelaxNG Schema for HTML 5 Exclusions" html5exclusions.rnc
+
+AddDescription "RelaxNG Schema for HTML 5: Common Definitions" common.rnc
+AddDescription "RelaxNG Schema for HTML 5: Global Structure & Meta Data" 
meta.rnc
+AddDescription "RelaxNG Schema for HTML 5: (Inline) Phrase Markup" phrase.rnc
+AddDescription "RelaxNG Schema for HTML 5: Basic Block Markup" block.rnc
+AddDescription "Schema Testing Scripts and Instances" tests
+
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..0a2a5e0
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,23 @@
+The RELAX NG Schema for (X)HTML 5 is licensed under the MIT open source 
license.
+The following legal notice applies to all files in this directory:
+
+Copyright (c) 2005-2007 Elika J. Etemad (fantasai) and Henri Sivonen (hsivonen)
+Copyright (c) 2007-2012 Mozilla Foundation
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+of the Software, and to permit persons to whom the Software is furnished to do
+so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/applications.rnc b/applications.rnc
new file mode 100644
index 0000000..2a592fb
--- /dev/null
+++ b/applications.rnc
@@ -0,0 +1,441 @@
+datatypes w = "http://whattf.org/datatype-draft";
+
+# #####################################################################
+##  RELAX NG Schema for HTML 5: Web Application Features              #
+# #####################################################################
+
+## Additions to Common Attributes
+
+       common.attrs.interact &=
+               (       common.attrs.contextmenu?
+               &       common.attrs.contenteditable?
+               &       common.attrs.draggable?
+               &       common.attrs.dropzone?
+               &       common.attrs.hidden?
+               &       common.attrs.spellcheck?
+               )
+               
+       common.attrs.other &= common.attrs.interact
+
+## Context Menu: contextmenu
+
+       common.attrs.contextmenu =
+               attribute contextmenu {
+                       common.data.idref
+               }
+
+## Editable Content: contenteditable
+
+       common.attrs.contenteditable =
+               attribute contenteditable {
+                       w:string "true" | w:string "false" | w:string ""
+               }
+
+## Draggable Element: draggable
+
+       common.attrs.draggable =
+               attribute draggable {
+                       w:string "true" | w:string "false"
+               }
+
+## Dropzone: dropzone
+
+       common.attrs.dropzone =
+               attribute dropzone {
+                       list {
+                               (       xsd:string { pattern = 
"[sS][tT][rR][iI][nN][gG]:.+" }
+                               |       xsd:string { pattern = 
"[fF][iI][lL][eE]:.+" }
+                               )*
+                               ,
+                               (       w:string "copy"
+                               |       w:string "move"
+                               |       w:string "link"
+                               )?
+                               ,
+                               (       xsd:string { pattern = 
"[sS][tT][rR][iI][nN][gG]:.+" }
+                               |       xsd:string { pattern = 
"[fF][iI][lL][eE]:.+" }
+                               )*
+                       }
+               }
+
+## Hidden Element: hidden
+
+       common.attrs.hidden =
+               attribute hidden {
+                       w:string "hidden" | w:string ""
+               }
+
+## Spellchecking and grammar checking: spellcheck
+
+       common.attrs.spellcheck =
+               attribute spellcheck{
+                       w:string "true" | w:string "false" | w:string ""
+               }
+
+## Application Cache: manifest
+
+       html.attrs.manifest =
+               attribute manifest {
+                       common.data.uri.non-empty
+               }
+               
+       html.attrs &= html.attrs.manifest?
+
+## Progess Indicator: <progress>
+
+       progress.elem =
+               element progress { progress.inner & progress.attrs }
+       progress.attrs =
+               (       common.attrs
+               &       progress.attrs.value?
+               &       progress.attrs.max?
+               &       (       common.attrs.aria.implicit.progressbar
+                       |       common.attrs.aria.role.progressbar
+                       |       common.attrs.aria.role.presentation
+                       |       common.attrs.aria.role.menuitem
+                       )?
+               )
+               progress.attrs.value =
+                       attribute value {
+                               common.data.float.non-negative
+                       }
+               progress.attrs.max =
+                       attribute max {
+                               common.data.float.positive
+                       }
+       progress.inner =
+               ( common.inner.phrasing ) #Cannot enforce textContent format 
here
+
+       common.elem.phrasing |= progress.elem
+
+## Dialog box, inspector, or window: <dialog>
+       dialog.elem =
+               element dialog { dialog.inner & dialog.attrs }
+       dialog.attrs =
+               (       common.attrs
+               &       dialog.attrs.open?
+               &       (       common.attrs.aria.implicit.dialog
+                       |       common.attrs.aria.role.alert
+                       |       common.attrs.aria.role.alertdialog
+                       |       common.attrs.aria.role.contentinfo
+                       |       common.attrs.aria.role.dialog
+                       |       common.attrs.aria.role.log
+                       |       common.attrs.aria.role.marquee
+                       |       common.attrs.aria.role.region
+                       |       common.attrs.aria.role.status
+                       |       common.attrs.aria.landmark.application
+                       |       common.attrs.aria.landmark.document
+                       |       common.attrs.aria.landmark.main
+                       |       common.attrs.aria.landmark.search
+                       )?
+               )
+               dialog.attrs.open =
+                       attribute open {
+                               w:string "open" | w:string ""
+                       }
+       dialog.inner =
+               ( common.inner.flow )
+       common.elem.flow |= dialog.elem
+
+## Toolbar: <menu type=toolbar>
+
+       menu.toolbar.elem =
+               element menu { menu.toolbar.inner & menu.toolbar.attrs }
+       menu.toolbar.attrs =
+               (       common.attrs
+               &       menu.toolbar.attrs.type?
+               &       (       common.attrs.aria.implicit.toolbar
+                       |       common.attrs.aria.role.directory
+                       |       common.attrs.aria.role.list
+                       |       common.attrs.aria.role.listbox
+                       |       common.attrs.aria.role.menu
+                       |       common.attrs.aria.role.menubar
+                       |       common.attrs.aria.role.tablist
+                       |       common.attrs.aria.role.toolbar
+                       |       common.attrs.aria.role.tree
+                       |       common.attrs.aria.role.presentation
+                       )?
+               )
+               menu.toolbar.attrs.type =
+                       attribute type {
+                               w:string "toolbar"
+                       }
+       menu.toolbar.inner =
+               (       mli.elem*
+               |       common.inner.flow
+               )
+       menu.elem |= menu.toolbar.elem
+       
+## Toolbar item: <li>
+
+       mli.elem =
+               element li { mli.inner & mli.attrs }
+       mli.attrs =
+               (       common.attrs
+               &       (       (       common.attrs.aria.role.listitem
+                               |       common.attrs.aria.role.menuitem
+                               |       common.attrs.aria.role.menuitemcheckbox
+                               |       common.attrs.aria.role.menuitemradio
+                               |       common.attrs.aria.role.option
+                               |       common.attrs.aria.role.tab
+                               |       common.attrs.aria.role.treeitem
+                               |       common.attrs.aria.role.presentation
+                               )
+                       )?
+               )
+       mli.inner =
+               ( common.inner.flow )
+
+## Popup menu: <menu type=popup>
+
+       menu.popup.elem =
+               element menu { menu.popup.inner & menu.popup.attrs }
+       menu.popup.attrs =
+               (       common.attrs
+               &       menu.popup.attrs.type?
+               &       menu.attrs.label?
+               &       common.attrs.aria?
+               )
+               menu.popup.attrs.type =
+                       attribute type {
+                               w:string "popup"
+                       }
+               menu.attrs.label =
+                       attribute label {
+                               string
+                       }
+       menu.popup.inner =
+               (       menuitem.elem*
+               &       hr.elem*
+               &       menu.popup.elem*
+               &       common.elem.script-supporting*
+               )
+       menu.elem |= menu.popup.elem
+
+## Ambiguous menu: <menu> (with no "type" attribute)
+       menu.ambiguous.elem =
+               element menu { menu.ambiguous.inner & menu.ambiguous.attrs }
+       menu.ambiguous.attrs =
+               (       common.attrs
+               &       menu.attrs.label?
+               &       common.attrs.aria?
+               )
+       menu.ambiguous.inner =
+               (       (       menuitem.elem*
+                       &       hr.elem*
+                       &       menu.ambiguous.elem*
+                       &       common.elem.script-supporting*
+                       )
+               |       (       mli.elem*
+                       |       common.inner.flow
+                       )
+               )
+       menu.elem |= menu.ambiguous.elem
+
+       common.elem.flow |= menu.elem
+       # REVISIT allow nested menus
+
+## Explicit command in popup menu: <menuitem type=command>
+       menuitem.explicit.command.elem =
+               element menuitem { menuitem.inner & 
menuitem.explicit.command.attrs }
+       menuitem.explicit.command.attrs =
+               (       common.attrs
+               &       menuitem.explicit.command.attrs.type?
+               &       menuitem.attrs.label?
+               &       menuitem.attrs.icon?
+               &       menuitem.attrs.disabled?
+               &       menuitem.attrs.default?
+               &       common.attrs.aria?
+               )
+               menuitem.explicit.command.attrs.type =
+                       attribute type {
+                               w:string "command"
+                       }
+               menuitem.attrs.label =
+                       attribute label {
+                               w:non-empty-string
+                       }
+               menuitem.attrs.icon =
+                       attribute icon {
+                               common.data.uri.non-empty
+                       }
+               menuitem.attrs.disabled =
+                       attribute disabled {
+                               w:string "" | w:string "disabled"
+                       }
+               menuitem.attrs.default =
+                       attribute default {
+                               w:string "" | w:string "default"
+                       }
+       menuitem.elem |= menuitem.explicit.command.elem
+
+## Checkbox in popup menu: <menuitem type=checkbox>
+       menuitem.checkbox.elem =
+               element menuitem { menuitem.inner & menuitem.checkbox.attrs }
+       menuitem.checkbox.attrs =
+               (       common.attrs
+               &       menuitem.checkbox.attrs.type
+               &       menuitem.attrs.label?
+               &       menuitem.attrs.icon?
+               &       menuitem.attrs.disabled?
+               &       menuitem.attrs.checked?
+               &       menuitem.attrs.radiogroup?
+               &       menuitem.attrs.default?
+               &       common.attrs.aria?
+               )
+               menuitem.checkbox.attrs.type =
+                       attribute type {
+                               w:string "checkbox"
+                       }
+               menuitem.attrs.checked =
+                       attribute checked {
+                               w:string "checked" | w:string ""
+                       }
+               menuitem.attrs.radiogroup =
+                       attribute radiogroup {
+                               string
+                       }
+       menuitem.elem |= menuitem.checkbox.elem
+
+## Radio button in popup menu: <menuitem type=radio>
+       menuitem.radio.elem =
+               element menuitem { menuitem.inner & menuitem.radio.attrs }
+       menuitem.radio.attrs =
+               (       common.attrs
+               &       menuitem.radio.attrs.type
+               &       menuitem.attrs.label?
+               &       menuitem.attrs.icon?
+               &       menuitem.attrs.disabled?
+               &       menuitem.attrs.checked?
+               &       menuitem.attrs.radiogroup?
+               &       menuitem.attrs.default?
+               &       common.attrs.aria?
+               )
+               menuitem.radio.attrs.type =
+                       attribute type {
+                               w:string "radio"
+                       }
+       menuitem.elem |= menuitem.radio.elem
+
+## Indirect command in popup menu: <menuitem command>
+       menuitem.indirect.command.elem =
+               element menuitem { menuitem.inner & 
menuitem.indirect.command.attrs }
+       menuitem.indirect.command.attrs =
+               (       common.attrs
+               &       menuitem.attrs.default?
+               &       menuitem.attrs.command
+               &       common.attrs.aria?
+               )
+               menuitem.attrs.command =
+                       attribute command {
+                               common.data.idref
+                       }
+       menuitem.elem |= menuitem.indirect.command.elem
+
+       menuitem.inner =
+               ( empty )
+
+## Canvas for Dynamic Graphics: <canvas>
+
+       canvas.elem.flow =
+               element canvas { canvas.inner.flow & canvas.attrs }
+       canvas.elem.phrasing =
+               element canvas { canvas.inner.phrasing & canvas.attrs }
+       canvas.attrs =
+               (       common.attrs
+               &       canvas.attrs.height?
+               &       canvas.attrs.width?
+               &       common.attrs.aria?
+               )
+               canvas.attrs.height =
+                       attribute height {
+                               common.data.integer.non-negative
+                       }
+               canvas.attrs.width =
+                       attribute width {
+                               common.data.integer.non-negative
+                       }
+       canvas.inner.flow =
+               ( common.inner.transparent.flow )
+       canvas.inner.phrasing =
+               ( common.inner.phrasing )
+       
+       common.elem.flow |= canvas.elem.flow
+       common.elem.phrasing |= canvas.elem.phrasing
+
+## Additional On-Demand Information: <details>
+
+       details.elem =
+               element details { details.inner & details.attrs }
+       details.attrs =
+               (       common.attrs
+               &       details.attrs.open?
+               &       (       common.attrs.aria.implicit.group # 
aria-expanded must be true if open attr present; check by assertions
+                       |       common.attrs.aria.role.alertdialog
+                       |       common.attrs.aria.role.banner
+                       |       common.attrs.aria.role.button
+                       |       common.attrs.aria.role.combobox
+                       |       common.attrs.aria.role.dialog
+                       |       common.attrs.aria.role.directory
+                       |       common.attrs.aria.role.group
+                       |       common.attrs.aria.role.heading
+                       |       common.attrs.aria.role.img
+                       |       common.attrs.aria.role.link
+                       |       common.attrs.aria.role.list
+                       |       common.attrs.aria.role.listbox
+                       |       common.attrs.aria.role.listitem
+                       |       common.attrs.aria.role.log
+                       |       common.attrs.aria.role.marquee
+                       |       common.attrs.aria.role.menu
+                       |       common.attrs.aria.role.menubar
+                       |       common.attrs.aria.role.note
+                       |       common.attrs.aria.role.status
+                       |       common.attrs.aria.role.tab
+                       |       common.attrs.aria.role.tablist
+                       |       common.attrs.aria.role.tabpanel
+                       |       common.attrs.aria.role.toolbar
+                       |       common.attrs.aria.role.tree
+                       |       common.attrs.aria.role.treeitem
+                       |       common.attrs.aria.landmark.application
+                       |       common.attrs.aria.landmark.article
+                       |       common.attrs.aria.landmark.complementary
+                       |       common.attrs.aria.landmark.contentinfo
+                       |       common.attrs.aria.landmark.document
+                       |       common.attrs.aria.landmark.form
+                       |       common.attrs.aria.landmark.main
+                       |       common.attrs.aria.landmark.navigation
+                       |       common.attrs.aria.landmark.search
+                       )?
+               )
+               details.attrs.open =
+                       attribute open {
+                               w:string "open" | w:string ""
+                       }
+       details.inner =
+               (       summary.elem
+               ,       common.inner.flow
+               )
+       
+       common.elem.flow |= details.elem
+
+## Caption/summary for details element: <summary>
+
+       summary.elem =
+               element summary { summary.inner & summary.attrs }
+       summary.attrs =
+               (       common.attrs
+               &       (       common.attrs.aria.role.presentation
+                       |       common.attrs.aria.role.menuitem
+                       |       common.attrs.aria.role.button
+                       )?
+               )
+       summary.inner =
+               (       common.inner.phrasing
+               |       h1.elem
+               |       h2.elem
+               |       h3.elem
+               |       h4.elem
+               |       h5.elem
+               |       h6.elem
+               |       hgroup.elem
+               )
diff --git a/aria.rnc b/aria.rnc
new file mode 100644
index 0000000..3e724a1
--- /dev/null
+++ b/aria.rnc
@@ -0,0 +1,1237 @@
+# #####################################################################
+##     RELAX NG Schema for HTML 5: Accessible Rich Internet Applications #
+# #####################################################################
+#
+# history: http://hsivonen.iki.fi/aria-html5-bis/
+
+# #####################################################################
+## ARIA
+
+## Global states and properties
+
+aria.global = 
+       (       aria.prop.atomic?
+       &       aria.state.busy?
+       &       aria.prop.controls?
+       &       aria.prop.describedby?
+       &       aria.state.disabled?
+       &       aria.state.dropeffect?
+       &       aria.prop.flowto?
+       &       aria.state.grabbed?
+       &       aria.prop.haspopup?
+       &       aria.state.hidden?
+       &       aria.state.invalid?
+       &       aria.prop.label?
+       &       aria.prop.labelledby?
+       &       aria.prop.live?
+       &       aria.prop.owns?
+       &       aria.prop.relevant?
+       )
+
+common.attrs.other &= aria.global?
+
+## States and Properties for Native Roles
+
+common.attrs.aria.implicit.button |=
+       (       aria.state.expanded?
+       &       aria.state.pressed?
+       )
+
+common.attrs.aria.implicit.checkbox |=
+       (       aria.state.checked? )
+
+common.attrs.aria.implicit.combobox |=
+       (       aria.state.expanded?
+       &       aria.prop.autocomplete?
+       &       aria.prop.required?
+       &       aria.prop.activedescendant?
+       )
+
+common.attrs.aria.implicit.dialog |=
+       (       aria.state.expanded? )
+
+common.attrs.aria.implicit.document |=
+       (       aria.state.expanded? )
+
+common.attrs.aria.implicit.group |=
+       (       aria.state.expanded?
+       &       aria.prop.activedescendant?
+       )
+
+common.attrs.aria.implicit.heading |=
+       (       aria.state.expanded?
+       &       aria.prop.level?
+       )
+
+common.attrs.aria.implicit.img |=
+       (       aria.state.expanded? )
+
+common.attrs.aria.implicit.link |=
+       (       aria.state.expanded? )
+
+common.attrs.aria.implicit.listbox |=
+       (       aria.prop.multiselectable?
+       &       aria.prop.required?
+       &       aria.prop.activedescendant?
+       &       aria.state.expanded?
+       )
+
+common.attrs.aria.implicit.listitem |=
+       (       aria.prop.level?
+       &       aria.prop.posinset?
+       &       aria.prop.setsize?
+       &       aria.state.expanded?
+       )
+
+common.attrs.aria.implicit.option |=
+       (       aria.prop.posinset?
+       &       aria.prop.setsize?
+       &       aria.state.checked?
+       &       aria.state.selected?
+       )
+
+common.attrs.aria.implicit.progressbar |=
+       (       aria.prop.valuemax?
+       &       aria.prop.valuemin?
+       &       aria.prop.valuenow?
+       &       aria.prop.valuetext?
+       )
+
+common.attrs.aria.implicit.radio |=
+       (       aria.prop.posinset?
+       &       aria.prop.setsize?
+       &       aria.state.checked?
+       &       aria.state.selected?
+       )
+
+common.attrs.aria.implicit.slider |=
+       (       aria.prop.valuemax?
+       &       aria.prop.valuemin?
+       &       aria.prop.valuenow?
+       &       aria.prop.valuetext?
+       &       aria.prop.orientation?
+       )
+
+common.attrs.aria.implicit.spinbutton |=
+       (       aria.prop.valuemax?
+       &       aria.prop.valuemin?
+       &       aria.prop.valuenow?
+       &       aria.prop.valuetext?
+       &       aria.prop.required?
+       )
+
+common.attrs.aria.implicit.textbox |=
+       (       aria.prop.activedescendant?
+       &       aria.prop.autocomplete?
+       &       aria.prop.multiline?
+       &       aria.prop.readonly?
+       &       aria.prop.required?
+       )
+
+common.attrs.aria.implicit.toolbar |=
+       (       aria.state.expanded?
+       &       aria.prop.activedescendant?
+       )
+
+common.attrs.aria.implicit.column-or-row-header |=
+       (       aria.prop.sort?
+       &       aria.prop.readonly?
+       &       aria.prop.required?
+       &       aria.state.selected?
+       &       aria.state.expanded?
+       )
+
+#common.attrs.aria.implicit.select |=
+#              (       aria.state.invalid?
+#      &       aria.prop.required?
+#      &       aria.prop.atomic?
+#      &       aria.state.busy?
+#      &       aria.prop.channel?
+#      &       aria.prop.controls?
+#      &       aria.prop.live?
+#      &       aria.prop.relevant?
+#      )
+
+# section
+#   |
+#   |_ region
+#        |
+#        |_ article
+#        |
+#        |_ landmark
+#        |     |_ banner
+#        |     |_ complementary
+#        |     |_ contentinfo
+#        |     |_ main
+#        |     |_ navigation
+#        |
+#        |_ list
+#        |
+#        |_ status
+
+common.attrs.aria.implicit.section |=
+       ( aria.state.expanded? )
+
+common.attrs.aria.implicit.region |= common.attrs.aria.implicit.section
+
+common.attrs.aria.implicit.article |= common.attrs.aria.implicit.region
+common.attrs.aria.implicit.landmark |= common.attrs.aria.implicit.region
+common.attrs.aria.implicit.list |= common.attrs.aria.implicit.region
+common.attrs.aria.implicit.status |= common.attrs.aria.implicit.region
+
+common.attrs.aria.implicit.banner |= common.attrs.aria.implicit.landmark
+common.attrs.aria.implicit.complementary |= common.attrs.aria.implicit.landmark
+common.attrs.aria.implicit.contentinfo |= common.attrs.aria.implicit.landmark
+common.attrs.aria.implicit.main |= common.attrs.aria.implicit.landmark
+common.attrs.aria.implicit.navigation |= common.attrs.aria.implicit.landmark
+
+# #####################################################################
+## States
+
+## busy
+       aria.state.busy =
+               attribute aria-busy 
+                       {       string "true"
+                       |       string "false" #default
+                       }
+
+## checked
+       aria.state.checked =
+               attribute aria-checked 
+                       {       string "true"
+                       |       string "false"
+                       |       string "mixed"
+                       |       string "undefined" #default
+                       }
+
+## disabled
+       aria.state.disabled =
+               attribute aria-disabled 
+                       {       string "true"
+                       |       string "false" #default
+                       }
+
+## dropeffect
+       aria.state.dropeffect =
+               attribute aria-dropeffect
+                       {       token "none" #default
+                       | token "popup"
+                       | token "execute"
+                       |       list 
+                               {       ( string "copy" )
+                               ,       ( string "execute" )?
+                               }
+                       |       list 
+                               {       ( string "move" )
+                               ,       ( string "execute" )?
+                               }
+                       |       list 
+                               {       ( string "link" )
+                               ,       ( string "execute" )?
+                               }
+                       |       list 
+                               {       ( string "execute" )
+                               ,       ( string "copy" )
+                               }
+                       |       list 
+                               {       ( string "execute" )
+                               ,       ( string "move" )
+                               }
+                       |       list 
+                               {       ( string "execute" )
+                               ,       ( string "link" )
+                               }
+                       }
+
+## expanded
+       aria.state.expanded =
+               attribute aria-expanded 
+                       {       string "true"
+                       |       string "false"
+                       |       string "undefined" #default
+                       }
+
+## grabbed
+       aria.state.grabbed =
+               attribute aria-grabbed 
+                       {       string "true"
+                       |       string "false"
+                       |       string "undefined" #default
+                       }
+
+## hidden
+       aria.state.hidden =
+               attribute aria-hidden 
+                       {       string "true"
+                       |       string "false" #default
+                       }
+
+## invalid
+       aria.state.invalid =
+               attribute aria-invalid 
+                       {       string "true"
+                       |       string "false" #default
+                       |       string "grammar"
+                       |       string "spelling"
+                       }
+
+## pressed
+       aria.state.pressed =
+               attribute aria-pressed 
+                       {       string "true"
+                       |       string "false"
+                       |       string "mixed"
+                       |       string "undefined" #default
+                       }
+
+## selected
+       aria.state.selected =
+               attribute aria-selected 
+                       {       string "true"
+                       |       string "false"
+                       |       string "undefined" #default
+                       }
+
+
+
+# #####################################################################
+## Properties
+
+## activedescendant
+       aria.prop.activedescendant =
+               attribute aria-activedescendant {
+                       common.data.idref #REVISIT add Schematron check
+               }
+
+## atomic
+       aria.prop.atomic =
+               attribute aria-atomic
+                       {       string "true"
+                       |       string "false" #default
+                       }       
+
+## autocomplete
+       aria.prop.autocomplete =
+               attribute aria-autocomplete
+                       {       string "inline"
+                       |       string "list"
+                       |       string "both"
+                       |       string "none" #default
+                       }
+
+## controls
+       aria.prop.controls =
+               attribute aria-controls {
+                       common.data.idrefs #REVISIT add Schematron check
+               }
+
+## describedby
+       aria.prop.describedby =
+               attribute aria-describedby {
+                       common.data.idrefs #REVISIT add Schematron check
+               }
+
+## flowto
+       aria.prop.flowto =
+               attribute aria-flowto {
+                       common.data.idrefs #REVISIT add Schematron check
+               }
+
+## haspopup
+       aria.prop.haspopup =
+               attribute aria-haspopup
+                       {       string "true" #REVISIT check owns or descendant
+                       |       string "false" #default
+                       }       
+
+## label
+       aria.prop.label =
+               attribute aria-label {
+                       string
+               }
+
+## labelledby
+       aria.prop.labelledby =
+               attribute aria-labelledby {
+                       common.data.idrefs #REVISIT add Schematron check
+               }
+
+## level
+       aria.prop.level =
+               attribute aria-level {
+                       common.data.integer.positive
+               }
+
+## live
+       aria.prop.live =
+               attribute aria-live
+                       {       string "off" #default
+                       |       string "polite"
+                       |       string "assertive"
+                       }       
+
+## multiline
+       aria.prop.multiline =
+               attribute aria-multiline
+                       {       string "true"
+                       |       string "false" #default
+                       }       
+
+## multiselectable
+       aria.prop.multiselectable =
+               attribute aria-multiselectable
+                       {       string "true"
+                       |       string "false" #default
+                       }       
+
+## orientation
+       aria.prop.orientation =
+               attribute aria-orientation
+                       {       string "vertical"
+                       |       string "horizontal" #default
+                       }
+
+## owns
+       aria.prop.owns =
+               attribute aria-owns {
+                       common.data.idrefs #REVISIT add Schematron check
+               }
+
+## posinset
+       aria.prop.posinset =
+               attribute aria-posinset {
+                       common.data.integer.positive
+               }
+
+## readonly
+       aria.prop.readonly =
+               attribute aria-readonly
+                       {       string "true"
+                       |       string "false" #default
+                       }       
+       common.attrs.aria.prop.readonly |= aria.prop.readonly
+
+## relevant
+       aria.prop.relevant =
+               attribute aria-relevant
+                       {       token "all"
+                       |       list 
+                               {       ( string "additions" )
+                               ,       ( string "removals" )?
+                               ,       ( string "text" )?
+                               }
+                       |       list 
+                               {       ( string "additions" )
+                               ,       ( string "text" )?
+                               ,       ( string "removals" )?
+                               }
+                       |       list 
+                               {       ( string "removals" )
+                               ,       ( string "additions" )?
+                               ,       ( string "text" )?
+                               }
+                       |       list 
+                               {       ( string "removals" )
+                               ,       ( string "text" )?
+                               ,       ( string "additions" )?
+                               }
+                       |       list 
+                               {       ( string "text" )
+                               ,       ( string "additions" )?
+                               ,       ( string "removals" )?
+                               }
+                       |       list 
+                               {       ( string "text" )
+                               ,       ( string "removals" )?
+                               ,       ( string "additions" )?
+                               }
+                       }       
+
+## required
+       aria.prop.required =
+               attribute aria-required
+                       {       string "true"
+                       |       string "false" #default
+                       }       
+
+## setsize
+       aria.prop.setsize =
+               attribute aria-setsize {
+                       common.data.integer.non-negative
+               }
+
+## sort
+       aria.prop.sort =
+               attribute aria-sort
+                       {       string "ascending"
+                       |       string "descending"
+                       |       string "none" #default
+                       |       string "other"
+                       }       
+
+## valuemax
+       aria.prop.valuemax =
+               attribute aria-valuemax {
+                       common.data.float #REVISIT
+               }
+
+## valuemin
+       aria.prop.valuemin =
+               attribute aria-valuemin {
+                       common.data.float #REVISIT
+               }
+
+## valuenow
+       aria.prop.valuenow =
+               attribute aria-valuenow {
+                       common.data.float #REVISIT
+               }
+
+## valuetext
+       aria.prop.valuetext =
+               attribute aria-valuetext {
+                       string
+               }
+
+# #####################################################################
+## Roles
+
+## alert
+       aria.alert =
+               (       aria.role.alert
+               &       aria.state.expanded? 
+               )
+               aria.role.alert = 
+                       attribute role { string "alert" }
+       
+       common.attrs.aria |= aria.alert
+       common.attrs.aria.role.alert |= aria.alert
+
+## alertdialog
+       aria.alertdialog =
+               (       aria.role.alertdialog
+               &       aria.state.expanded?
+               )
+               aria.role.alertdialog = 
+                       attribute role { string "alertdialog" }
+       
+       common.attrs.aria |= aria.alertdialog
+       common.attrs.aria.role.alertdialog |= aria.alertdialog
+
+## application
+       aria.application =
+               (       aria.role.application
+               &       aria.state.expanded?
+               )
+               aria.role.application = 
+                       attribute role { string "application" }
+
+       common.attrs.aria |= aria.application
+       common.attrs.aria.landmark.application |= aria.application
+
+## article
+       aria.article =
+               (       aria.role.article
+               &       aria.state.expanded?
+               )
+               aria.role.article = 
+                       attribute role { string "article" }
+
+       common.attrs.aria |= aria.article
+       common.attrs.aria.landmark.article |= aria.article
+
+## banner
+       aria.banner =
+               (       aria.role.banner
+               &       aria.state.expanded?
+               )
+               aria.role.banner = 
+                       attribute role { string "banner" }
+       
+       common.attrs.aria |= aria.banner
+       common.attrs.aria.landmark.banner |= aria.banner
+       
+## button
+       aria.button =
+               (       aria.role.button
+               &       aria.state.expanded?
+               &       aria.state.pressed? # not inherited
+               )
+               aria.role.button = 
+                       attribute role { string "button" }
+       
+       common.attrs.aria |= aria.button
+       common.attrs.aria.role.button |= aria.button
+
+## checkbox
+       aria.checkbox =
+               (       aria.role.checkbox
+               &       aria.state.checked #required!
+               )
+               aria.role.checkbox = 
+                       attribute role { string "checkbox" }
+       
+       common.attrs.aria |= aria.checkbox
+       common.attrs.aria.role.checkbox |= aria.checkbox
+
+# columnheader
+       aria.columnheader =
+               (       aria.role.columnheader
+               &       aria.prop.sort? # not inherited
+               &       aria.prop.readonly? # not inherited
+               &       aria.state.selected? # not inherited
+               &       aria.state.expanded?
+               &       aria.prop.required?
+               )
+               aria.role.columnheader = 
+                       attribute role { string "columnheader" }
+       
+       common.attrs.aria |= aria.columnheader
+
+## combobox
+       aria.combobox =
+               (       aria.role.combobox
+               &       aria.prop.activedescendant?
+               &       aria.state.expanded #required!
+               &       aria.prop.autocomplete?
+               &       aria.prop.required?
+               )
+               aria.role.combobox = 
+                       attribute role { string "combobox" }
+       
+       common.attrs.aria |= aria.combobox
+       common.attrs.aria.role.combobox |= aria.combobox
+
+## complementary
+       aria.complementary =
+               (       aria.role.complementary
+               &       aria.state.expanded?
+               )
+               aria.role.complementary = 
+                       attribute role { string "complementary" }
+
+       common.attrs.aria |= aria.complementary
+       common.attrs.aria.landmark.complementary |= aria.complementary
+
+## contentinfo
+       aria.contentinfo =
+               (       aria.role.contentinfo
+               &       aria.state.expanded?
+               )
+               aria.role.contentinfo = 
+                       attribute role { string "contentinfo" }
+
+       common.attrs.aria |= aria.contentinfo
+       common.attrs.aria.landmark.contentinfo |= aria.contentinfo
+
+## definition
+       aria.definition =
+               (       aria.role.definition
+               &       aria.state.expanded?
+               )
+               aria.role.definition = 
+                       attribute role { string "definition" }
+
+       common.attrs.aria |= aria.definition
+
+## dialog
+       aria.dialog =
+               (       aria.role.dialog
+               &       aria.state.expanded?
+               )
+               aria.role.dialog = 
+                       attribute role { string "dialog" }
+
+       common.attrs.aria |= aria.dialog
+       common.attrs.aria.role.dialog |= aria.dialog
+
+## directory
+       aria.directory =
+               (       aria.role.directory
+               &       aria.state.expanded?
+               )
+               aria.role.directory = 
+                       attribute role { string "directory" }
+
+       common.attrs.aria |= aria.directory
+       common.attrs.aria.role.directory |= aria.directory
+
+## document
+       aria.document =
+               (       aria.role.document
+               &       aria.state.expanded?
+               )
+               aria.role.document = 
+                       attribute role { string "document" }
+
+       common.attrs.aria |= aria.document
+       common.attrs.aria.landmark.document |= aria.document
+
+## form
+       aria.form =
+               (       aria.role.form
+               &       aria.state.expanded?
+               )
+               aria.role.form =
+                       attribute role { string "form" }
+
+       common.attrs.aria |= aria.form
+       common.attrs.aria.landmark.form |= aria.form
+
+## grid
+       aria.grid =
+               (       aria.role.grid
+               &       aria.prop.level? # not inherited
+               &       aria.prop.multiselectable? # not inherited
+               &       aria.prop.readonly? # not inherited
+               &       aria.prop.activedescendant?
+               &       aria.state.expanded?
+               )
+               aria.role.grid = 
+                       attribute role { string "grid" }
+       
+       common.attrs.aria |= aria.grid
+       
+## gridcell
+       aria.gridcell =
+               (       aria.role.gridcell
+               &       aria.prop.level? # net inherited
+               &       aria.prop.readonly? # not inherited
+               &       aria.state.selected? # not inherited
+               &       aria.state.expanded?
+               &       aria.prop.required?
+               )
+               aria.role.gridcell = 
+                       attribute role { string "gridcell" }
+       
+       common.attrs.aria |= aria.gridcell
+
+## group
+       aria.group =
+               (       aria.role.group
+               &       aria.prop.activedescendant? # not inherited
+               &       aria.state.expanded? # not inherited
+               )
+               aria.role.group = 
+                       attribute role { string "group" }
+       
+       common.attrs.aria |= aria.group
+       common.attrs.aria.role.group |= aria.group
+
+## heading
+       aria.heading =
+               (       aria.role.heading
+               &       aria.prop.level ? # not inherited
+               &       aria.state.expanded?
+               )
+               aria.role.heading =
+                       attribute role { string "heading" }
+       
+       common.attrs.aria |= aria.heading
+       common.attrs.aria.role.heading |= aria.heading
+
+## img
+       aria.img =
+               (       aria.role.img
+               &       aria.state.expanded?
+               )
+               aria.role.img = 
+                       attribute role { string "img" }
+       
+       common.attrs.aria |= aria.img
+       common.attrs.aria.role.img |= aria.img
+
+## link
+       aria.link =
+               (       aria.role.link
+               &       aria.state.expanded?
+               )
+               aria.role.link = 
+                       attribute role { string "link" }
+       
+       common.attrs.aria |= aria.link
+       common.attrs.aria.role.link |= aria.link
+
+## list
+       aria.list =
+               (       aria.role.list
+               &       aria.state.expanded?
+               )
+               aria.role.list = 
+                       attribute role { string "list" }
+       
+       common.attrs.aria |= aria.list
+       common.attrs.aria.role.list |= aria.list
+
+## listbox
+       aria.listbox =
+               (       aria.role.listbox
+               &       aria.prop.multiselectable? # not inherited
+               &       aria.prop.required?
+               &       aria.prop.activedescendant?
+               &       aria.state.expanded?
+               )
+               aria.role.listbox = 
+                       attribute role { string "listbox" }
+       
+       common.attrs.aria |= aria.listbox
+       common.attrs.aria.role.listbox |= aria.listbox
+
+## listitem
+       aria.listitem =
+               (       aria.role.listitem
+               &       aria.prop.posinset? # not inherited
+               &       aria.prop.setsize? # not inherited
+               &       aria.prop.level? # not inherited
+               &       aria.state.expanded?
+               )
+               aria.role.listitem = 
+                       attribute role { string "listitem" }
+       
+       common.attrs.aria |= aria.listitem
+       common.attrs.aria.role.listitem |= aria.listitem
+
+## log
+       aria.log =
+               (       aria.role.log
+               &       aria.state.expanded?
+               )
+               aria.role.log = 
+                       attribute role { string "log" }
+       
+       common.attrs.aria |= aria.log
+       common.attrs.aria.role.log |= aria.log
+
+## main
+       aria.main =
+               (       aria.role.main
+               &       aria.state.expanded?
+               )
+               aria.role.main = 
+                       attribute role { string "main" }
+       
+       common.attrs.aria |= aria.main
+       common.attrs.aria.landmark.main |= aria.main
+
+## marquee
+       aria.marquee =
+               (       aria.role.marquee
+               &       aria.state.expanded?
+               )
+               aria.role.marquee = 
+                       attribute role { string "marquee" }
+       
+       common.attrs.aria |= aria.marquee
+       common.attrs.aria.role.marquee |= aria.marquee
+
+## math
+       aria.math =
+               (       aria.role.math
+               &       aria.state.expanded?
+               )
+               aria.role.math = 
+                       attribute role { string "math" }
+       
+       common.attrs.aria |= aria.math
+
+## menu
+       aria.menu =
+               (       aria.role.menu
+               &       aria.prop.activedescendant?
+               &       aria.state.expanded?
+               )
+               aria.role.menu = 
+                       attribute role { string "menu" }
+       
+       common.attrs.aria |= aria.menu
+       common.attrs.aria.role.menu |= aria.menu
+
+## menubar
+       aria.menubar =
+               (       aria.role.menubar
+               &       aria.prop.activedescendant?
+               &       aria.state.expanded?
+               )
+               aria.role.menubar = 
+                       attribute role { string "menubar" }
+       
+       common.attrs.aria |= aria.menubar
+       common.attrs.aria.role.menubar |= aria.menubar
+
+
+## menuitem
+       aria.menuitem =
+               (       aria.role.menuitem )
+               aria.role.menuitem = 
+                       attribute role { string "menuitem" }
+       
+       common.attrs.aria |= aria.menuitem
+       common.attrs.aria.role.menuitem |= aria.menuitem
+
+## menuitemcheckbox
+       aria.menuitemcheckbox =
+               (       aria.role.menuitemcheckbox
+               &       aria.state.checked #required
+               )
+               aria.role.menuitemcheckbox = 
+                       attribute role { string "menuitemcheckbox" }
+       
+       common.attrs.aria |= aria.menuitemcheckbox
+       common.attrs.aria.role.menuitemcheckbox |= aria.menuitemcheckbox
+
+## menuitemradio
+       aria.menuitemradio =
+               (       aria.role.menuitemradio
+               &       aria.state.checked #required
+               &       aria.state.selected?
+               &       aria.prop.posinset?
+               &       aria.prop.setsize?
+               )
+               aria.role.menuitemradio = 
+                       attribute role { string "menuitemradio" }
+       
+       common.attrs.aria |= aria.menuitemradio
+       common.attrs.aria.role.menuitemradio |= aria.menuitemradio
+
+## navigation
+       aria.navigation =
+               (       aria.role.navigation
+               &       aria.state.expanded?
+               )
+               aria.role.navigation = 
+                       attribute role { string "navigation" }
+       
+       common.attrs.aria |= aria.navigation
+       common.attrs.aria.landmark.navigation |= aria.navigation
+
+## note
+       aria.note =
+               (       aria.role.note
+               &       aria.state.expanded?
+               )
+               aria.role.note = 
+                       attribute role { string "note" }
+       
+       common.attrs.aria |= aria.note
+       common.attrs.aria.landmark.note |= aria.note
+
+## option
+       aria.option =
+               (       aria.role.option
+               &       aria.state.checked? # not inherited
+               &       aria.state.selected? # not inherited
+               &       aria.prop.posinset?
+               &       aria.prop.setsize?
+               )
+               aria.role.option = 
+                       attribute role { string "option" }
+       
+       common.attrs.aria |= aria.option
+       common.attrs.aria.role.option |= aria.option
+
+
+## presentation
+       aria.presentation =
+               (       aria.role.presentation
+               &       aria.state.expanded?
+               )
+               aria.role.presentation = 
+                       attribute role { string "presentation" }
+       
+       common.attrs.aria |= aria.presentation
+       common.attrs.aria.role.presentation |= aria.presentation
+
+## progressbar
+       aria.progressbar =
+               (       aria.role.progressbar
+               &       aria.prop.valuemax? # not inherited
+               &       aria.prop.valuemin? # not inherited
+               &       aria.prop.valuenow? # not inherited
+               &       aria.prop.valuetext? # not inherited
+               )
+               aria.role.progressbar = 
+                       attribute role { string "progressbar" }
+       
+       common.attrs.aria |= aria.progressbar
+       common.attrs.aria.role.progressbar |= aria.progressbar
+
+## radio
+       aria.radio =
+               (       aria.role.radio
+               &       aria.state.checked #required!
+               &       aria.state.selected?
+               &       aria.prop.posinset?
+               &       aria.prop.setsize?
+               )
+               aria.role.radio = 
+                       attribute role { string "radio" }
+       
+       common.attrs.aria |= aria.radio
+       common.attrs.aria.role.radio |= aria.radio
+
+## radiogroup
+       aria.radiogroup =
+               (       aria.role.radiogroup
+               &       aria.prop.activedescendant?
+               &       aria.state.expanded?
+               &       aria.prop.required?
+               )
+               aria.role.radiogroup = 
+                       attribute role { string "radiogroup" }
+       
+       common.attrs.aria |= aria.radiogroup
+
+## region
+       aria.region =
+               (       aria.role.region
+               &       aria.state.expanded?
+               )
+               aria.role.region = 
+                       attribute role { string "region" }
+       
+       common.attrs.aria |= aria.region
+       common.attrs.aria.role.region |= aria.region
+
+## row
+       aria.row =
+               (       aria.role.row
+               &       aria.prop.level? # not inherited
+               &       aria.state.selected? # not inherited
+               &       aria.prop.activedescendant?
+               &       aria.state.expanded?
+               )
+               aria.role.row = 
+                       attribute role { string "row" }
+       
+       common.attrs.aria |= aria.row
+
+## rowgroup
+       aria.rowgroup =
+               (       aria.role.rowgroup
+               &       aria.prop.activedescendant?
+               &       aria.state.expanded?
+               )
+               aria.role.rowgroup =
+                       attribute role { string "rowgroup" }
+
+       common.attrs.aria |= aria.rowgroup
+
+# rowheader
+       aria.rowheader =
+               (       aria.role.rowheader
+               &       aria.prop.sort? # not inherited
+               &       aria.prop.readonly? # not inherited
+               &       aria.state.selected? # not inherited
+               &       aria.state.expanded?
+               &       aria.prop.required?
+               )
+               aria.role.rowheader = 
+                       attribute role { string "rowheader" }
+       
+       common.attrs.aria |= aria.rowheader
+
+## scrollbar
+       aria.scrollbar =
+               (       aria.role.scrollbar
+               &       aria.prop.orientation
+               &       aria.prop.valuemax
+               &       aria.prop.valuemin
+               &       aria.prop.valuenow
+               &       aria.prop.valuetext?
+               )
+               aria.role.scrollbar =
+                       attribute role { string "scrollbar" }
+
+       common.attrs.aria |= aria.scrollbar
+
+## search
+       aria.search =
+               (       aria.role.search
+               &       aria.state.expanded?
+               )
+               aria.role.search = 
+                       attribute role { string "search" }
+       
+       common.attrs.aria |= aria.search
+       common.attrs.aria.landmark.search |= aria.search
+
+## separator
+       aria.separator =
+               (       aria.role.separator
+               &       aria.state.expanded?
+               &       aria.prop.orientation?
+               )
+               aria.role.separator = 
+                       attribute role { string "separator" }
+       
+       common.attrs.aria |= aria.separator
+       common.attrs.aria.role.separator |= aria.separator
+
+## slider
+       aria.slider =
+               (       aria.role.slider
+               &       aria.prop.valuemax
+               &       aria.prop.valuemin
+               &       aria.prop.valuenow
+               &       aria.prop.valuetext?
+               &       aria.prop.orientation?
+               )
+               aria.role.slider = 
+                       attribute role { string "slider" }
+       
+       common.attrs.aria |= aria.slider
+       common.attrs.aria.role.slider |= aria.slider
+
+## spinbutton
+       aria.spinbutton =
+               (       aria.role.spinbutton
+               &       aria.prop.valuemax
+               &       aria.prop.valuemin
+               &       aria.prop.valuenow
+               &       aria.prop.valuetext?
+               &       aria.prop.required?
+               )
+               aria.role.spinbutton = 
+                       attribute role { string "spinbutton" }
+       
+       common.attrs.aria |= aria.spinbutton
+       common.attrs.aria.role.spinbutton |= aria.spinbutton
+
+## status
+       aria.status =
+               (       aria.role.status
+               &       aria.state.expanded?
+               )
+               aria.role.status = 
+                       attribute role { string "status" }
+       
+       common.attrs.aria |= aria.status
+       common.attrs.aria.role.status |= aria.status
+
+## tab
+       aria.tab =
+               (       aria.role.tab
+               &       aria.state.selected?
+               &       aria.state.expanded?
+               )
+               aria.role.tab = 
+                       attribute role { string "tab" }
+       
+       common.attrs.aria |= aria.tab
+       common.attrs.aria.role.tab |= aria.tab
+
+## tablist
+       aria.tablist =
+               (       aria.role.tablist
+               &       aria.prop.activedescendant?
+               &       aria.state.expanded?
+               &       aria.prop.level?
+               &       aria.prop.multiselectable?
+               )
+               aria.role.tablist = 
+                       attribute role { string "tablist" }
+       common.attrs.aria |= aria.tablist
+       common.attrs.aria.role.tablist |= aria.tablist
+
+## tabpanel
+       aria.tabpanel =
+               (       aria.role.tabpanel
+               &       aria.state.expanded?
+               )
+               aria.role.tabpanel = 
+                       attribute role { string "tabpanel" }
+       
+       common.attrs.aria |= aria.tabpanel
+       common.attrs.aria.role.tabpanel |= aria.tabpanel
+
+## textbox
+       aria.textbox =
+               (       aria.role.textbox
+               &       aria.prop.activedescendant?
+               &       aria.prop.autocomplete? # not inherited
+               &       aria.prop.multiline? # not inherited
+               &       aria.prop.readonly? # not inherited
+               &       aria.prop.required?
+               )
+               aria.role.textbox = 
+                       attribute role { string "textbox" }
+       
+       common.attrs.aria |= aria.textbox
+       common.attrs.aria.role.textbox |= aria.textbox
+
+## timer
+       aria.timer =
+               (       aria.role.timer
+               &       aria.state.expanded?
+               )
+               aria.role.timer = 
+                       attribute role { string "timer" }
+       
+       common.attrs.aria |= aria.timer
+
+## toolbar
+       aria.toolbar =
+               (       aria.role.toolbar
+               &       aria.prop.activedescendant?
+               &       aria.state.expanded?
+               )
+               aria.role.toolbar = 
+                       attribute role { string "toolbar" }
+       
+       common.attrs.aria |= aria.toolbar
+       common.attrs.aria.role.toolbar |= aria.toolbar
+
+## tooltip
+       aria.tooltip =
+               (       aria.role.tooltip
+               &       aria.state.expanded?
+               )
+               aria.role.tooltip = 
+                       attribute role { string "tooltip" }
+       
+       common.attrs.aria |= aria.tooltip
+
+## tree
+       aria.tree =
+               (       aria.role.tree
+               &       aria.prop.multiselectable? # not inherited
+               &       aria.prop.activedescendant?
+               &       aria.state.expanded?
+               &       aria.prop.required?
+               )
+               aria.role.tree = 
+                       attribute role { string "tree" }
+       
+       common.attrs.aria |= aria.tree
+       common.attrs.aria.role.tree |= aria.tree
+
+## treegrid
+       aria.treegrid =
+               (       aria.role.treegrid
+               &       aria.prop.activedescendant?
+               &       aria.state.expanded?
+               &       aria.prop.level?
+               &       aria.prop.multiselectable?
+               &       aria.prop.readonly?
+               &       aria.prop.required?
+               )
+               aria.role.treegrid = 
+                       attribute role { string "treegrid" }
+       
+       common.attrs.aria |= aria.treegrid
+
+## treeitem
+       aria.treeitem =
+               (       aria.role.treeitem
+               &       aria.state.checked?
+               &       aria.state.expanded?
+               &       aria.prop.level?
+               &       aria.prop.posinset?
+               &       aria.state.selected?
+               &       aria.prop.setsize?
+               )
+               aria.role.treeitem = 
+                       attribute role { string "treeitem" }
+       
+       common.attrs.aria |= aria.treeitem
+       common.attrs.aria.role.treeitem |= aria.treeitem
diff --git a/assertions.sch b/assertions.sch
new file mode 100644
index 0000000..77656f8
--- /dev/null
+++ b/assertions.sch
@@ -0,0 +1,1228 @@
+<?xml version="1.0"?>
+<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
-->
+<!-- Schematron assertions for HTML5                                         
-->
+<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
-
+
+Copyright (c) 2005-2007 Elika J. Etemad (fantasai) and Henri Sivonen (hsivonen)
+Copyright (c) 2007-2012 Mozilla Foundation
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+of the Software, and to permit persons to whom the Software is furnished to do
+so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
+
+<schema xmlns='http://www.ascc.net/xml/schematron'>
+       <ns prefix='h' uri='http://www.w3.org/1999/xhtml'/>
+
+       <pattern name="required attributes">
+               <rule context='h:bdo'>
+                       <assert test='@dir'>
+                               A &#x201C;bdo&#x201D; element must have a
+                               &#x201C;dir&#x201D; attribute.
+                       </assert>
+               </rule>
+               <rule context='h:img[not(@alt)]'>
+                       <assert test='(@title and not(@title = ""))
+                       or //h:meta[(translate(@name,
+                               "GENERATOR", "generator") = "generator")]
+                       or (ancestor::h:figure
+                               and (ancestor::h:figure[1]/h:figcaption
+                                       and 
not(ancestor::h:figure[1]/h:figcaption = ""))
+                               and normalize-space(ancestor::h:figure[1])
+                                       = 
normalize-space(ancestor::h:figure[1]/h:figcaption)
+                               and not(ancestor::h:figure[1]//*[
+                                       local-name() = "audio"
+                                       or local-name() = "canvas"
+                                       or local-name() = "embed"
+                                       or local-name() = "iframe"
+                                       or local-name() = "math"
+                                       or local-name() = "object"
+                                       or local-name() = "svg"
+                                       or local-name() = "video"])
+                               and not(count(ancestor::h:figure[1]//h:img) > 
1))'>
+                               An &#x201C;img&#x201D; element must have an
+                               &#x201C;alt&#x201D; attribute, except under 
certain
+                               conditions. For details, consult guidance on
+                               providing text alternatives for images.
+                               
http://www.w3.org/wiki/HTML/Usage/TextAlternatives
+                       </assert>
+               </rule>
+       </pattern>
+
+       <pattern name='Triggered on mutually exclusive elements and 
prohibited-descendant cases'>
+
+       <!-- Exclusions and prohibited-descendant contraints  - - - - - - - - - 
- - -->
+
+       <rule context='h:form|h:dfn|h:noscript|h:address'>
+                       <report test='ancestor::*[name() = name(current())]'>
+                               The &#x201C;<name/>&#x201D; element must not 
contain any nested 
+                               &#x201C;<name/>&#x201D; elements.
+                       </report>
+               </rule>
+
+       <rule context='h:label'>
+                       <report test='ancestor::*[name() = name(current())]'>
+                               The &#x201C;<name/>&#x201D; element must not 
contain any nested 
+                               &#x201C;<name/>&#x201D; elements.
+                       </report>
+                       <report test='count(descendant::h:input
+                                          | descendant::h:button
+                                          | descendant::h:select
+                                          | descendant::h:keygen
+                                          | descendant::h:textarea) > 1'>
+                               The &#x201C;label&#x201D; element may contain 
at most one descendant
+                               &#x201C;input&#x201D; element,
+                               &#x201C;button&#x201D; element,
+                               &#x201C;select&#x201D; element,
+                               or &#x201C;textarea&#x201D; element.
+                       </report>
+                       <report test='@for and 
+                                     not(//h:input[not(translate(@type, 
"HIDEN", "hiden")="hidden")address@hidden = current()/@for] or 
+                                     //h:address@hidden = current()/@for] or 
+                                     //h:address@hidden = current()/@for] or 
+                                     //h:address@hidden = current()/@for] or 
+                                     //h:address@hidden = current()/@for] or 
+                                     //h:address@hidden = current()/@for])'>
+                               The &#x201C;for&#x201D; attribute of the 
&#x201C;label&#x201D; 
+                               element must refer to a form control.
+                       </report>
+               </rule>
+
+               <rule context='h:section|h:nav|h:article|h:aside'>
+                       <report test='ancestor::h:address'>
+                               The sectioning element &#x201C;<name/>&#x201D; 
must not
+                               appear as a descendant of the 
&#x201C;address&#x201D; element.
+                       </report>
+               </rule>
+
+               <rule context='h:footer'>
+                       <report test='ancestor::h:header'>
+                               The element &#x201C;footer&#x201D; must not
+                               appear as a descendant of the 
&#x201C;header&#x201D; element.
+                       </report>
+                       <report test='ancestor::h:footer'>
+                               The element &#x201C;footer&#x201D; must not
+                               appear as a descendant of the 
&#x201C;footer&#x201D; element.
+                       </report>
+                       <report test='ancestor::h:address'>
+                               The element &#x201C;footer&#x201D; must not
+                               appear as a descendant of the 
&#x201C;address&#x201D; element.
+                       </report>
+               </rule>
+
+               <rule context='h:h1|h:h2|h:h3|h:h4|h:h5|h:h6'>
+                       <report test='ancestor::h:address'>
+                               The &#x201C;<name/>&#x201D; element must not 
appear as a 
+                               descendant of the &#x201C;address&#x201D; 
element.
+                       </report>
+               </rule>
+
+               <rule context='h:header'>
+                       <report test='ancestor::h:footer'>
+                               The &#x201C;<name/>&#x201D; element must not 
appear as a 
+                               descendant of the &#x201C;footer&#x201D; 
element.
+                       </report>
+                       <report test='ancestor::h:address'>
+                               The &#x201C;<name/>&#x201D; element must not 
appear as a 
+                               descendant of the &#x201C;address&#x201D; 
element.
+                       </report>
+                       <report test='ancestor::h:header'>
+                               The &#x201C;header&#x201D; element must not 
appear as a 
+                               descendant of the &#x201C;header&#x201D; 
element.
+                       </report>
+               </rule>
+
+               <rule context='h:table'>
+                       <report test='ancestor::h:caption'>
+                               The element &#x201C;table&#x201D; must not 
appear as a
+                               descendant of the &#x201C;caption&#x201D; 
element.
+                       </report>
+                       <report test='@summary' role='warning'>
+                               The &#x201C;summary&#x201D; attribute on the
+                               &#x201C;table&#x201D; element is obsolete.
+                               Consider describing the structure of the table
+                               in a &#x201C;caption&#x201D; element or
+                               in a &#x201C;figure&#x201D; element containing
+                               the &#x201C;table&#x201D; element; or, simplify
+                               the structue of the table so that no
+                               description is needed.
+                       </report>
+               </rule>
+       </pattern>
+
+       <!-- Interactive element exclusions -->
+       <pattern name='interactive element exclusions'>
+       
+               <!-- 
+                  - Interactive descendants:
+                  - a
+                  - video[controls]
+                  - audio[controls]
+                  - details
+                  - menu[type=toolbar]
+                  - button
+                  - input[type!=hidden]
+                  - textarea
+                  - select
+                  - img[usemap]
+                  - embed
+                  - iframe
+                  - keygen
+                  - label
+                  - object[usemap]
+               
+                  - Interactive ancestors
+                  - a
+                  - button
+                 -->
+
+               <rule context='h:a|h:details|h:embed|h:iframe|h:label'>
+                       <report test='ancestor::h:a'>
+                               The interactive element &#x201C;<name/>&#x201D; 
must not 
+                               appear as a descendant of the &#x201C;a&#x201D; 
element.
+                       </report>
+                       <report test='ancestor::h:button'>
+                               The interactive element &#x201C;<name/>&#x201D; 
must not 
+                               appear as a descendant of the 
&#x201C;button&#x201D; element.
+                       </report>
+               </rule>
+
+               <rule 
context='h:button|h:textarea|h:select|h:keygen|h:input[not(translate(@type, 
"HIDEN", "hiden")="hidden")]'>
+                       <report test='ancestor::h:a'>
+                               The interactive element &#x201C;<name/>&#x201D; 
must not 
+                               appear as a descendant of the &#x201C;a&#x201D; 
element.
+                       </report>
+                       <report test='ancestor::h:button'>
+                               The interactive element &#x201C;<name/>&#x201D; 
must not 
+                               appear as a descendant of the 
&#x201C;button&#x201D; element.
+                       </report>
+                       <report test='ancestor::h:address@hidden and 
not(ancestor::h:address@hidden = current()/@id])'>
+                               Any &#x201C;<name/>&#x201D; element descendant 
of a &#x201C;label&#x201D; element
+                               with a &#x201C;for&#x201D; attribute must have 
an
+                               ID value that matches that &#x201C;for&#x201D; 
attribute.
+                       </report>
+               </rule>
+
+               <rule context='h:address@hidden|h:address@hidden'>
+                       <report test='ancestor::h:a'>
+                               The interactive element &#x201C;<name/>&#x201D;
+                               with the attribute &#x201C;controls&#x201D; 
must not
+                               appear as a descendant of the &#x201C;a&#x201D; 
element.
+                       </report>
+                       <report test='ancestor::h:button'>
+                               The interactive element &#x201C;<name/>&#x201D;
+                               with the attribute &#x201C;controls&#x201D; 
must not
+                               appear as a descendant of the 
&#x201C;button&#x201D; element.
+                       </report>
+               </rule>
+
+               <rule context='h:menu[translate(@type, "TOLBAR", 
"tolbar")="toolbar"]'>
+                       <report test='ancestor::h:a'>
+                               The element &#x201C;menu&#x201D;
+                               with the attribute &#x201C;type&#x201D; whose 
value is &#x201C;toolbar&#x201D; must not
+                               appear as a descendant of the &#x201C;a&#x201D; 
element.
+                       </report>
+                       <report test='ancestor::h:button'>
+                               The element &#x201C;menu&#x201D;
+                               with the attribute &#x201C;type&#x201D; whose 
value is &#x201C;toolbar&#x201D; must not
+                               appear as a descendant of the 
&#x201C;button&#x201D; element.
+                       </report>
+               </rule>
+
+               <rule context='h:address@hidden'>
+                       <report test='ancestor::h:a'>
+                               The element &#x201C;img&#x201D;
+                               with the attribute &#x201C;usemap&#x201D; must 
not
+                               appear as a descendant of the &#x201C;a&#x201D; 
element.
+                       </report>
+                       <report test='ancestor::h:button'>
+                               The element &#x201C;img&#x201D;
+                               with the attribute &#x201C;usemap&#x201D; must 
not
+                               appear as a descendant of the 
&#x201C;button&#x201D; element.
+                       </report>
+               </rule>
+
+               <rule context='h:address@hidden'>
+                       <report test='ancestor::h:a'>
+                               The element &#x201C;object&#x201D;
+                               with the attribute &#x201C;usemap&#x201D; must 
not
+                               appear as a descendant of the &#x201C;a&#x201D; 
element.
+                       </report>
+                       <report test='ancestor::h:button'>
+                               The element &#x201C;object&#x201D;
+                               with the attribute &#x201C;usemap&#x201D; must 
not
+                               appear as a descendant of the 
&#x201C;button&#x201D; element.
+                       </report>
+               </rule>
+       </pattern>
+
+       <!-- REVISIT fieldset 
http://lists.whatwg.org/pipermail/whatwg-whatwg.org/2006-April/006181.html -->
+
+       <!-- Misc requirements -->
+               
+       <pattern name="miscellaneous requirements">
+               <rule context='h:area'>
+                       <assert test='ancestor::h:map'>
+                               The &#x201C;area&#x201D; element must have an 
ancestor
+                               &#x201C;map&#x201D; element.
+                       </assert>
+               </rule>
+
+               <rule context='h:address@hidden'>
+                       <assert test='ancestor::h:address@hidden'>
+                               The &#x201C;img&#x201D; element with the 
+                               &#x201C;ismap&#x201D; attribute set must have 
an ancestor 
+                               &#x201C;a&#x201D; element with the 
&#x201C;href&#x201D; attribute.
+                       </assert>
+               </rule>
+
+               <rule context='h:input'>
+                       <report test='@list and not(//h:address@hidden = 
current()/@list])'>
+                               The &#x201C;list&#x201D; attribute of the 
&#x201C;input&#x201D; 
+                               element must refer to a 
&#x201C;datalist&#x201D; element.
+                       </report>
+                       <report test='@type = "button" and (not(@value) or 
@value = "")'>
+                               Element &#x201C;input&#x201D; with attribute 
&#x201C;type&#x201D;
+                               whose value is &#x201C;button&#x201D; must have 
non-empty attribute
+                               &#x201C;value&#x201D;.
+                       </report>
+               </rule>
+
+               <rule context='h:track'>
+                       <report test='@label = ""'>
+                               Attribute &#x201C;label&#x201D; for element 
&#x201C;track&#x201D;
+                               must have non-empty value.
+                       </report>
+                       <report test='@default and 
preceding-sibling::h:address@hidden'>
+                               The &#x201C;default&#x201D; attribute must not 
occur on more than one
+                               &#x201C;track&#x201D; element within the same 
&#x201C;audio&#x201D;
+                               element or &#x201C;video&#x201D; element.
+                       </report>
+               </rule>
+
+               <rule context='h:address@hidden and @name]'>
+                       <assert test='@id = @name'>
+                               The &#x201C;id&#x201D; attribute on a 
&#x201C;map&#x201D; element must have
+                               the same value as the &#x201C;name&#x201D; 
attribute.
+                       </assert>
+               </rule>
+
+               <rule context='h:select'>
+                       <report test='not(@multiple) and 
count(descendant::h:address@hidden) > 1'>
+                               The &#x201C;select&#x201D; element cannot have 
more than one 
+                               selected &#x201C;option&#x201D; element 
descendant unless the 
+                               &#x201C;multiple&#x201D; attribute is specified.
+                       </report>
+                       <report test='@required and not(@multiple)
+                               and (not(@size)
+                                       or (starts-with(normalize-space(@size), 
"+")
+                                       and substring-after(@size,"+") = 1)
+                                       or @size = 1)
+                               and not(h:option)'>
+                               A &#x201C;select&#x201D; element with
+                               a &#x201C;required&#x201D; attribute and without
+                               a &#x201C;multiple&#x201D; attribute, and whose
+                               size is &#x201C;1&#x201D;, must have a child
+                               &#x201C;option&#x201D; element.
+                       </report>
+               </rule>
+
+               <rule context='h:address@hidden and not(@multiple)
+                       and (not(@size)
+                               or (starts-with(normalize-space(@size), "+")
+                               and substring-after(@size,"+") = 1)
+                               or @size = 1)]/h:option[1]'>
+                       <assert test='(@value and @value = "")
+                               or ((not(@value) or @value = "") and . = "")'>
+                               The first child &#x201C;option&#x201D; element
+                               of a &#x201C;select&#x201D; element with
+                               a &#x201C;required&#x201D; attribute and without
+                               a &#x201C;multiple&#x201D; attribute, and whose
+                               size is &#x201C;1&#x201D;, must have either an
+                               empty &#x201C;value&#x201D; attribute, or must
+                               have no text content.
+                       </assert>
+               </rule>
+
+               <rule context='h:script'>
+                       <report test='@language and translate(@language, 
"JAVSCRIPT", "javscript")="javascript"
+                               and @type and not(translate(@type, 
"EXJAVSCRIPT", "exjavscript")="text/javascript")'>
+                               Element &#x201C;script&#x201D; with attribute
+                               &#x201C;language&#x201D; whose value is 
&#x201C;JavaScript&#x201D;
+                               must not have attribute &#x201C;type&#x201D; 
whose value is not
+                               &#x201C;text/javascript&#x201D;.
+                       </report>
+                       <report test='not(@src) and @charset'>
+                               Element &#x201C;script&#x201D; must not have 
attribute
+                               &#x201C;charset&#x201D; unless attribute 
&#x201C;src&#x201D; is
+                               also specified.
+                       </report>
+                       <report test='not(@src) and @defer'>
+                               Element &#x201C;script&#x201D; must not have 
attribute
+                               &#x201C;defer&#x201D; unless attribute 
&#x201C;src&#x201D; is
+                               also specified.
+                       </report>
+                       <report test='not(@src) and @async'>
+                               Element &#x201C;script&#x201D; must not have 
attribute
+                               &#x201C;async&#x201D; unless attribute 
&#x201C;src&#x201D; is
+                               also specified.
+                       </report>
+               </rule>
+
+               <rule context='h:time'>
+                       <report test='ancestor::h:time'>
+                               The element &#x201C;time&#x201D; must not
+                               appear as a descendant of the 
&#x201C;time&#x201D; element.
+                       </report>
+               </rule>
+
+               <rule context='h:progress'>
+                       <report test='ancestor::h:progress'>
+                               The element &#x201C;progress&#x201D; must not
+                               appear as a descendant of the 
&#x201C;progress&#x201D; element.
+                       </report>
+                       <assert test='@max and @value and number(@value) &lt;= 
number(@max)'>
+                               The value of the &#x201C;value&#x201D; 
attribute must be less than or equal to
+                               the value of the &#x201C;max&#x201D; attribute.
+                       </assert>
+                       <assert test='not(@max) and @value and number(@value) 
&lt;= 1'>
+                               The value of the  &#x201C;value&#x201D; 
attribute must be less than or equal to
+                               one when the &#x201C;max&#x201D; attribute is 
absent.
+                       </assert>
+               </rule>
+
+               <!-- 
+                       min <= value <= max
+               min <= low <= high <= max
+                       min <= optimum <= max 
+               -->
+
+               <rule context='h:meter'>
+                       <report test='ancestor::h:meter'>
+                               The element &#x201C;meter&#x201D; must not
+                               appear as a descendant of the 
&#x201C;meter&#x201D; element.
+                       </report>
+                       <report test='@min and @value and not(number(@min) 
&lt;= number(@value))'>
+                               The value of the  &#x201C;min&#x201D; attribute 
must be less than or equal to
+                               the value of the &#x201C;value&#x201D; 
attribute.
+                       </report>
+                       <report test='not(@min) and @value and not(0 &lt;= 
number(@value))'>
+                               The value of the &#x201C;value&#x201D; 
attribute must be greater than or equal to
+                               zero when the &#x201C;min&#x201D; attribute is 
absent.
+                       </report>
+                       <report test='@value and @max and not(number(@value) 
&lt;= number(@max))'>
+                               The value of the  &#x201C;value&#x201D; 
attribute must be less than or equal to
+                               the value of the &#x201C;max&#x201D; attribute.
+                       </report>
+                       <report test='@value and not(@max) and 
not(number(@value) &lt;= 1)'>
+                               The value of the  &#x201C;value&#x201D; 
attribute must be less than or equal to
+                               one when the &#x201C;max&#x201D; attribute is 
absent.
+                       </report>
+                       <report test='@min and @max and not(number(@min) &lt;= 
number(@max))'>
+                               The value of the  &#x201C;min&#x201D; attribute 
must be less than or equal to
+                               the value of the &#x201C;max&#x201D; attribute.
+                       </report>
+                       <report test='not(@min) and @max and not(0 &lt;= 
number(@max))'>
+                               The value of the &#x201C;max&#x201D; attribute 
must be greater than or equal to
+                               zero when the &#x201C;min&#x201D; attribute is 
absent.
+                       </report>
+                       <report test='@min and not(@max) and not(number(@min) 
&lt;= 1)'>
+                               The value of the  &#x201C;min&#x201D; attribute 
must be less than or equal to
+                               one when the &#x201C;max&#x201D; attribute is 
absent.
+                       </report>
+                       <report test='@min and @low and not(number(@min) &lt;= 
number(@low))'>
+                               The value of the  &#x201C;min&#x201D; attribute 
must be less than or equal to
+                               the value of the &#x201C;low&#x201D; attribute.
+                       </report>
+                       <report test='not(@min) and @low and not(0 &lt;= 
number(@low))'>
+                               The value of the &#x201C;low&#x201D; attribute 
must be greater than or equal to
+                               zero when the &#x201C;min&#x201D; attribute is 
absent.
+                       </report>
+                       <report test='@min and @high and not(number(@min) &lt;= 
number(@high))'>
+                               The value of the  &#x201C;min&#x201D; attribute 
must be less than or equal to
+                               the value of the &#x201C;high&#x201D; attribute.
+                       </report>
+                       <report test='not(@min) and @high and not(0 &lt;= 
number(@high))'>
+                               The value of the &#x201C;high&#x201D; attribute 
must be greater than or equal to
+                               zero when the &#x201C;min&#x201D; attribute is 
absent.
+                       </report>
+                       <report test='@low and @high and not(number(@low) &lt;= 
number(@high))'>
+                               The value of the  &#x201C;low&#x201D; attribute 
must be less than or equal to
+                               the value of the &#x201C;high&#x201D; attribute.
+                       </report>
+                       <report test='@high and @max and not(number(@high) 
&lt;= number(@max))'>
+                               The value of the  &#x201C;high&#x201D; 
attribute must be less than or equal to
+                               the value of the &#x201C;max&#x201D; attribute.
+                       </report>
+                       <report test='@high and not(@max) and not(number(@high) 
&lt;= 1)'>
+                               The value of the  &#x201C;high&#x201D; 
attribute must be less than or equal to
+                               one when the &#x201C;max&#x201D; attribute is 
absent.
+                       </report>
+                       <report test='@low and @max and not(number(@low) &lt;= 
number(@max))'>
+                               The value of the  &#x201C;low&#x201D; attribute 
must be less than or equal to
+                               the value of the &#x201C;max&#x201D; attribute.
+                       </report>
+                       <report test='@low and not(@max) and not(number(@low) 
&lt;= 1)'>
+                               The value of the  &#x201C;low&#x201D; attribute 
must be less than or equal to
+                               one when the &#x201C;max&#x201D; attribute is 
absent.
+                       </report>
+                       <report test='@min and @optimum and not(number(@min) 
&lt;= number(@optimum))'>
+                               The value of the  &#x201C;min&#x201D; attribute 
must be less than or equal to
+                               the value of the &#x201C;optimum&#x201D; 
attribute.
+                       </report>
+                       <report test='not(@min) and @optimum and not(0 &lt;= 
number(@optimum))'>
+                               The value of the &#x201C;optimum&#x201D; 
attribute must be greater than or equal to
+                               zero when the &#x201C;min&#x201D; attribute is 
absent.
+                       </report>
+                       <report test='@optimum and @max and 
not(number(@optimum) &lt;= number(@max))'>
+                               The value of the  &#x201C;optimum&#x201D; 
attribute must be less than or equal to
+                               the value of the &#x201C;max&#x201D; attribute.
+                       </report>
+                       <report test='@optimum and not(@max) and 
not(number(@optimum) &lt;= 1)'>
+                               The value of the  &#x201C;optimum&#x201D; 
attribute must be less than or equal to
+                               one when the &#x201C;max&#x201D; attribute is 
absent.
+                       </report>
+               </rule>
+       </pattern>
+
+       <!-- Obsolete Elements - - - - - - - - - - - - - - - - - - - - - - -->
+       <pattern name="obsolete elements">
+               <rule context='h:acronym'>
+                       <report test='true()'>
+                               The &#x201C;acronym&#x201D; element is 
obsolete. Use the &#x201C;abbr&#x201D; element instead.
+                       </report>
+               </rule>
+
+               <rule context='h:applet'>
+                       <report test='true()'>
+                               The &#x201C;applet&#x201D; element is obsolete. 
Use the &#x201C;object&#x201D; element instead.
+                       </report>
+               </rule>
+
+               <rule context='h:center|h:font|h:big|h:strike|h:tt|h:basefont'>
+                       <report test='true()'>
+                               The &#x201C;<name/>&#x201D; element is obsolete.
+                               Use CSS instead. 
http://wiki.whatwg.org/wiki/Presentational_elements_and_attributes
+                       </report>
+               </rule>
+
+               <rule context='h:dir'>
+                       <report test='true()'>
+                               The &#x201C;dir&#x201D; element is obsolete. 
Use the &#x201C;ul&#x201D; element instead.
+                       </report>
+               </rule>
+
+               <rule context='h:frameset|h:noframes'>
+                       <report test='true()'>
+                               The &#x201C;<name/>&#x201D; element is obsolete.
+                               Use the &#x201C;iframe&#x201D; element and CSS 
instead, or use server-side includes.
+                       </report>
+               </rule>
+       </pattern>
+
+       <!-- Obsolete Attributes- - - - - - - - - - - - - - - - - - - - - - -->
+
+       <pattern name="obsolete attributes">
+               <rule context='h:a'>
+                       <report test='@coords'>
+                               The &#x201C;coords&#x201D; attribute on the 
&#x201C;<name/>&#x201D; element is obsolete.
+                               For image maps, use the &#x201C;area&#x201D; 
element instead of the &#x201C;a&#x201D; element.
+                       </report>
+                       <report test='@shape'>
+                               The &#x201C;shape&#x201D; attribute on the 
&#x201C;<name/>&#x201D; element is obsolete.
+                               For image maps, use the &#x201C;area&#x201D; 
element instead of the &#x201C;a&#x201D; element.
+                       </report>
+                       <report test='@urn'>
+                               The &#x201C;urn&#x201D; attribute on the 
&#x201C;<name/>&#x201D; element is obsolete.
+                               Specify the preferred persistent identifier 
using the &#x201C;href&#x201D; attribute instead.
+                       </report>
+                       <report test='@charset'>
+                               The &#x201C;charset&#x201D; attribute on the 
&#x201C;<name/>&#x201D; element is obsolete.
+                               Use an HTTP Content-Type header on the linked 
resource instead.
+                       </report>
+                       <report test='@methods'>
+                               The &#x201C;methods&#x201D; attribute on the 
&#x201C;<name/>&#x201D; element is obsolete.
+                               Use the HTTP OPTIONS feature instead.
+                       </report>
+                       <report test='@rev'>
+                               The &#x201C;rev&#x201D; attribute on the 
&#x201C;<name/>&#x201D; element is obsolete.
+                               Use the &#x201C;rel&#x201D; attribute instead, 
with a term having the opposite meaning.
+                       </report>
+               </rule>
+
+               <rule context='h:link'>
+                       <report test='@target'>
+                               The &#x201C;target&#x201D; attribute on the 
&#x201C;<name/>&#x201D; element is obsolete.
+                               You can safely omit it.
+                       </report>
+                       <report test='@urn'>
+                               The &#x201C;urn&#x201D; attribute on the 
&#x201C;<name/>&#x201D; element is obsolete.
+                               Specify the preferred persistent identifier 
using the &#x201C;href&#x201D; attribute instead.
+                       </report>
+                       <report test='@charset'>
+                               The &#x201C;charset&#x201D; attribute on the 
&#x201C;<name/>&#x201D; element is obsolete.
+                               Use an HTTP Content-Type header on the linked 
resource instead.
+                       </report>
+                       <report test='@methods'>
+                               The &#x201C;methods&#x201D; attribute on the 
&#x201C;<name/>&#x201D; element is obsolete.
+                               Use the HTTP OPTIONS feature instead.
+                       </report>
+                       <report test='@rev'>
+                               The &#x201C;rev&#x201D; attribute on the 
&#x201C;<name/>&#x201D; element is obsolete.
+                               Use the &#x201C;rel&#x201D; attribute instead, 
with a term having the opposite meaning.
+                       </report>
+               </rule>
+
+               <rule context="h:area">
+                       <report test='@nohref'>
+                               The &#x201C;nohref&#x201D; attribute on the 
&#x201C;<name/>&#x201D; element is obsolete.
+                               Omitting the &#x201C;href&#x201D; attribute is 
sufficient.
+                       </report>
+               </rule>
+
+               <rule context='h:embed'>
+                       <report test='@name'>
+                               The &#x201C;name&#x201D; attribute on the 
&#x201C;<name/>&#x201D; element is obsolete.
+                               Use the &#x201C;id&#x201D; attribute instead.
+                       </report>
+               </rule>
+
+               <rule context='h:head'>
+                       <report test='@profile'>
+                               The &#x201C;profile&#x201D; attribute on the 
&#x201C;<name/>&#x201D; element is obsolete.
+                               To declare which &#x201C;meta&#x201D; element 
terms are used in the document, instead register the
+                               names as meta extensions. 
&lt;http://wiki.whatwg.org/wiki/MetaExtensions>
+                               To trigger specific UA behaviors, use a 
&#x201C;link&#x201D; element instead.
+                       </report>
+               </rule>
+
+               <rule context='h:html'>
+                       <report test='@version'>
+                               The &#x201C;version&#x201D; attribute on the 
&#x201C;<name/>&#x201D; element is obsolete.
+                               You can safely omit it.
+                       </report>
+               </rule>
+
+               <rule context='h:iframe'>
+                       <report test='@longdesc'>
+                               The &#x201C;longdesc&#x201D; attribute on the 
&#x201C;<name/>&#x201D; element is obsolete.
+                               Use a regular &#x201C;a&#x201D; element to link 
to the description.
+                       </report>
+               </rule>
+
+               <rule context='h:img'>
+                       <report test='@longdesc'>
+                               The &#x201C;longdesc&#x201D; attribute on the 
&#x201C;<name/>&#x201D; element is obsolete.
+                               Use a regular &#x201C;a&#x201D; element to link 
to the description.
+                       </report>
+                       <report test='@name'>
+                               The &#x201C;name&#x201D; attribute on the 
&#x201C;<name/>&#x201D; element is obsolete.
+                               Use the &#x201C;id&#x201D; attribute instead.
+                       </report>
+               </rule>
+
+               <rule context='h:input'>
+                       <report test='@usemap'>
+                               The &#x201C;usemap&#x201D; attribute on the 
&#x201C;<name/>&#x201D; element is obsolete.
+                               Use the &#x201C;img&#x201D; element instead of 
the &#x201C;input&#x201D; element for image maps.
+                       </report>
+               </rule>
+
+               <rule context='h:li|h:ul'>
+                       <report test='@type'>
+                               The &#x201C;type&#x201D; attribute on the 
&#x201C;<name/>&#x201D; element is obsolete.
+                               Use CSS instead. 
http://wiki.whatwg.org/wiki/Presentational_elements_and_attributes
+                       </report>
+               </rule>
+
+               <rule context='h:meta'>
+                       <report test='@scheme'>
+                               The &#x201C;scheme&#x201D; attribute on the 
&#x201C;<name/>&#x201D; element is obsolete.
+                               Use only one scheme per field, or make the 
scheme declaration part of the value.
+                       </report>
+                       <report test='translate(@http-equiv,"CONTELAGUA", 
"contelagua")="content-language"' role='warning'>
+                               Using the &#x201C;meta&#x201D; element to 
specify the document-wide default language is obsolete.
+                               Consider specifying the language on the root 
element instead.
+                       </report>
+               </rule>
+
+               <rule context='h:object'>
+                       <report test='@archive'>
+                               The &#x201C;archive&#x201D; attribute on the 
&#x201C;<name/>&#x201D; element is obsolete.
+                               Use the &#x201C;data&#x201D; attribute and 
&#x201C;type&#x201D; attribute to invoke plugins.
+                               To set a parameter with the name 
&#x201C;archive&#x201D;, use the &#x201C;param&#x201D; element.
+                       </report>
+                       <report test='@classid'>
+                               The &#x201C;classid&#x201D; attribute on the 
&#x201C;<name/>&#x201D; element is obsolete.
+                               Use the &#x201C;data&#x201D; attribute and 
&#x201C;type&#x201D; attribute to invoke plugins.
+                               To set a parameter with the name 
&#x201C;classid&#x201D;, use the &#x201C;param&#x201D; element.
+                       </report>
+                       <report test='@code'>
+                               The &#x201C;code&#x201D; attribute on the 
&#x201C;<name/>&#x201D; element is obsolete.
+                               Use the &#x201C;data&#x201D; attribute and 
&#x201C;type&#x201D; attribute to invoke plugins.
+                               To set a parameter with the name 
&#x201C;code&#x201D;, use the &#x201C;param&#x201D; element.
+                       </report>
+                       <report test='@codebase'>
+                               The &#x201C;codebase&#x201D; attribute on the 
&#x201C;<name/>&#x201D; element is obsolete.
+                               Use the &#x201C;data&#x201D; attribute and 
&#x201C;type&#x201D; attribute to invoke plugins.
+                               To set a parameter with the name 
&#x201C;codebase&#x201D;, use the &#x201C;param&#x201D; element.
+                       </report>
+                       <report test='@codetype'>
+                               The &#x201C;codetype&#x201D; attribute on the 
&#x201C;<name/>&#x201D; element is obsolete.
+                               Use the &#x201C;data&#x201D; attribute and 
&#x201C;type&#x201D; attribute to invoke plugins.
+                               To set a parameter with the name 
&#x201C;codetype&#x201D;, use the &#x201C;param&#x201D; element.
+                       </report>
+                       <report test='@declare'>
+                               The &#x201C;declare&#x201D; attribute on the 
&#x201C;<name/>&#x201D; element is obsolete.
+                               Repeat the &#x201C;object&#x201D; element 
completely each time the resource is to be reused.
+                       </report>
+                       <report test='@standby'>
+                               The &#x201C;standby&#x201D; attribute on the 
&#x201C;<name/>&#x201D; element is obsolete.
+                               Optimize the linked resource so that it loads 
quickly or, at least, incrementally.
+                       </report>
+               </rule>
+
+               <rule context='h:option'>
+                       <report test='@name'>
+                               The &#x201C;name&#x201D; attribute on the 
&#x201C;<name/>&#x201D; element is obsolete.
+                               Use the &#x201C;id&#x201D; attribute instead.
+                       </report>
+               </rule>
+
+               <rule context='h:param'>
+                       <report test='@type'>
+                               The &#x201C;type&#x201D; attribute on the 
&#x201C;<name/>&#x201D; element is obsolete.
+                               Use the &#x201C;name&#x201D; attribute and 
&#x201C;value&#x201D; attribute without declaring value types.
+                       </report>
+                       <report test='@valuetype'>
+                               The &#x201C;valuetype&#x201D; attribute on the 
&#x201C;<name/>&#x201D; element is obsolete.
+                               Use the &#x201C;name&#x201D; attribute and 
&#x201C;value&#x201D; attribute without declaring value types.
+                       </report>
+               </rule>
+
+               <rule context='h:address@hidden and not(translate(@language, 
"JAVSCRIPT", "javscript")="javascript")]'>
+                       <report test='true()'>
+                               The &#x201C;language&#x201D; attribute on the 
&#x201C;script&#x201D; element is obsolete.
+                               Use the &#x201C;type&#x201D; attribute instead.
+                       </report>
+               </rule>
+
+               <rule context='h:td|h:th'>
+                       <report test='@scope and self::h:td'>
+                               The &#x201C;scope&#x201D; attribute on the 
&#x201C;td&#x201D; element is obsolete.
+                               Use the &#x201C;scope&#x201D; attribute on a 
&#x201C;th&#x201D; element instead.
+                       </report>
+                       <report test='@abbr'>
+                               The &#x201C;abbr&#x201D; attribute on the 
&#x201C;<name/>&#x201D; element is obsolete.
+                               Consider instead beginning the cell contents 
with concise text, followed by further elaboration if needed.
+                       </report>
+                       <report test='@axis'>
+                               The &#x201C;axis&#x201D; attribute on the 
&#x201C;<name/>&#x201D; element is obsolete.
+                               Use the &#x201C;scope&#x201D; attribute instead.
+                       </report>
+               </rule>
+       </pattern>
+
+       <pattern name="obsolete presentational align attribute">
+               <rule 
context='h:caption|h:iframe|h:img|h:input|h:object|h:embed|h:legend
+                       
|h:table|h:hr|h:div|h:h1|h:h2|h:h3|h:h4|h:h5|h:h6|h:p|h:col|h:colgroup
+                       |h:tbody|h:td|h:tfoot|h:th|h:thead|h:tr'>
+                       <report test='@align'>
+                               The &#x201C;align&#x201D; attribute on the 
&#x201C;<name/>&#x201D; element is obsolete.
+                               Use CSS instead. 
http://wiki.whatwg.org/wiki/Presentational_elements_and_attributes
+                       </report>
+               </rule>
+       </pattern>
+
+       <pattern name="obsolete presentational width attribute">
+               <rule context='h:col|h:colgroup|h:hr|h:pre|h:table|h:td|h:th'>
+                       <report test='@width'>
+                               The &#x201C;width&#x201D; attribute on the 
&#x201C;<name/>&#x201D; element is obsolete.
+                               Use CSS instead. 
http://wiki.whatwg.org/wiki/Presentational_elements_and_attributes
+                       </report>
+               </rule>
+       </pattern>
+
+       <pattern name="obsolete presentational table attributes">
+               <rule 
context='h:col|h:colgroup|h:tbody|h:td|h:tfoot|h:th|h:thead|h:tr'>
+                       <report test='@char'>
+                               The &#x201C;char&#x201D; attribute on the 
&#x201C;<name/>&#x201D; element is obsolete.
+                               Use CSS instead. 
http://wiki.whatwg.org/wiki/Presentational_elements_and_attributes
+                       </report>
+                       <report test='@charoff'>
+                               The &#x201C;charoff&#x201D; attribute on the 
&#x201C;<name/>&#x201D; element is obsolete.
+                               Use CSS instead. 
http://wiki.whatwg.org/wiki/Presentational_elements_and_attributes
+                       </report>
+                       <report test='@valign'>
+                               The &#x201C;valign&#x201D; attribute on the 
&#x201C;<name/>&#x201D; element is obsolete.
+                               Use CSS instead. 
http://wiki.whatwg.org/wiki/Presentational_elements_and_attributes
+                       </report>
+               </rule>
+       </pattern>
+
+       <pattern name="obsolete presentational attributes">
+               <rule context='h:body'>
+                       <report test='@alink'>
+                               The &#x201C;alink&#x201D; attribute on the 
&#x201C;<name/>&#x201D; element is obsolete.
+                               Use CSS instead. 
http://wiki.whatwg.org/wiki/Presentational_elements_and_attributes
+                       </report>
+                       <report test='@background'>
+                               The &#x201C;background&#x201D; attribute on the 
&#x201C;<name/>&#x201D; element is obsolete.
+                               Use CSS instead. 
http://wiki.whatwg.org/wiki/Presentational_elements_and_attributes
+                       </report>
+                       <report test='@bgcolor'>
+                               The &#x201C;bgcolor&#x201D; attribute on the 
&#x201C;<name/>&#x201D; element is obsolete.
+                               Use CSS instead. 
http://wiki.whatwg.org/wiki/Presentational_elements_and_attributes
+                       </report>
+                       <report test='@link'>
+                               The &#x201C;link&#x201D; attribute on the 
&#x201C;<name/>&#x201D; element is obsolete.
+                               Use CSS instead. 
http://wiki.whatwg.org/wiki/Presentational_elements_and_attributes
+                       </report>
+                       <report test='@marginbottom'>
+                               The &#x201C;marginbottom&#x201D; attribute on 
the &#x201C;<name/>&#x201D; element is obsolete.
+                               Use CSS instead. 
http://wiki.whatwg.org/wiki/Presentational_elements_and_attributes
+                       </report>
+                       <report test='@marginheight'>
+                               The &#x201C;marginheight&#x201D; attribute on 
the &#x201C;<name/>&#x201D; element is obsolete.
+                               Use CSS instead. 
http://wiki.whatwg.org/wiki/Presentational_elements_and_attributes
+                       </report>
+                       <report test='@marginleft'>
+                               The &#x201C;marginleft&#x201D; attribute on the 
&#x201C;<name/>&#x201D; element is obsolete.
+                               Use CSS instead. 
http://wiki.whatwg.org/wiki/Presentational_elements_and_attributes
+                       </report>
+                       <report test='@marginright'>
+                               The &#x201C;marginright&#x201D; attribute on 
the &#x201C;<name/>&#x201D; element is obsolete.
+                               Use CSS instead. 
http://wiki.whatwg.org/wiki/Presentational_elements_and_attributes
+                       </report>
+                       <report test='@margintop'>
+                               The &#x201C;margintop&#x201D; attribute on the 
&#x201C;<name/>&#x201D; element is obsolete.
+                               Use CSS instead. 
http://wiki.whatwg.org/wiki/Presentational_elements_and_attributes
+                       </report>
+                       <report test='@marginwidth'>
+                               The &#x201C;marginwidth&#x201D; attribute on 
the &#x201C;<name/>&#x201D; element is obsolete.
+                               Use CSS instead. 
http://wiki.whatwg.org/wiki/Presentational_elements_and_attributes
+                       </report>
+                       <report test='@text'>
+                               The &#x201C;text&#x201D; attribute on the 
&#x201C;<name/>&#x201D; element is obsolete.
+                               Use CSS instead. 
http://wiki.whatwg.org/wiki/Presentational_elements_and_attributes
+                       </report>
+                       <report test='@vlink'>
+                               The &#x201C;vlink&#x201D; attribute on the 
&#x201C;<name/>&#x201D; element is obsolete.
+                               Use CSS instead. 
http://wiki.whatwg.org/wiki/Presentational_elements_and_attributes
+                       </report>
+               </rule>
+
+               <rule context='h:br'>
+                       <report test='@clear'>
+                               The &#x201C;clear&#x201D; attribute on the 
&#x201C;<name/>&#x201D; element is obsolete.
+                               Use CSS instead. 
http://wiki.whatwg.org/wiki/Presentational_elements_and_attributes
+                       </report>
+               </rule>
+
+               <rule context='h:embed'>
+                       <report test='@hspace'>
+                               The &#x201C;hspace&#x201D; attribute on the 
&#x201C;<name/>&#x201D; element is obsolete.
+                               Use CSS instead. 
http://wiki.whatwg.org/wiki/Presentational_elements_and_attributes
+                       </report>
+                       <report test='@vspace'>
+                               The &#x201C;vspace&#x201D; attribute on the 
&#x201C;<name/>&#x201D; element is obsolete.
+                               Use CSS instead. 
http://wiki.whatwg.org/wiki/Presentational_elements_and_attributes
+                       </report>
+               </rule>
+
+               <rule context='h:hr'>
+                       <report test='@noshade'>
+                               The &#x201C;noshade&#x201D; attribute on the 
&#x201C;<name/>&#x201D; element is obsolete.
+                               Use CSS instead. 
http://wiki.whatwg.org/wiki/Presentational_elements_and_attributes
+                       </report>
+                       <report test='@size'>
+                               The &#x201C;size&#x201D; attribute on the 
&#x201C;<name/>&#x201D; element is obsolete.
+                               Use CSS instead. 
http://wiki.whatwg.org/wiki/Presentational_elements_and_attributes
+                       </report>
+                       <report test='@color'>
+                               The &#x201C;color&#x201D; attribute on the 
&#x201C;<name/>&#x201D; element is obsolete.
+                               Use CSS instead. 
http://wiki.whatwg.org/wiki/Presentational_elements_and_attributes
+                       </report>
+               </rule>
+
+               <rule context='h:dl|h:menu|h:ol|h:ul'>
+                       <report test='@compact'>
+                               The &#x201C;compact&#x201D; attribute on the 
&#x201C;<name/>&#x201D; element is obsolete.
+                               Use CSS instead. 
http://wiki.whatwg.org/wiki/Presentational_elements_and_attributes
+                       </report>
+               </rule>
+
+               <rule context='h:iframe'>
+                       <report test='@allowtransparency'>
+                               The &#x201C;allowtransparency&#x201D; attribute 
on the &#x201C;<name/>&#x201D; element is obsolete.
+                               Use CSS instead. 
http://wiki.whatwg.org/wiki/Presentational_elements_and_attributes
+                       </report>
+                       <report test='@frameborder'>
+                               The &#x201C;frameborder&#x201D; attribute on 
the &#x201C;<name/>&#x201D; element is obsolete.
+                               Use CSS instead. 
http://wiki.whatwg.org/wiki/Presentational_elements_and_attributes
+                       </report>
+                       <report test='@marginheight'>
+                               The &#x201C;marginheight&#x201D; attribute on 
the &#x201C;<name/>&#x201D; element is obsolete.
+                               Use CSS instead. 
http://wiki.whatwg.org/wiki/Presentational_elements_and_attributes
+                       </report>
+                       <report test='@marginwidth'>
+                               The &#x201C;marginwidth&#x201D; attribute on 
the &#x201C;<name/>&#x201D; element is obsolete.
+                               Use CSS instead. 
http://wiki.whatwg.org/wiki/Presentational_elements_and_attributes
+                       </report>
+                       <report test='@scrolling'>
+                               The &#x201C;scrolling&#x201D; attribute on the 
&#x201C;<name/>&#x201D; element is obsolete.
+                               Use CSS instead. 
http://wiki.whatwg.org/wiki/Presentational_elements_and_attributes
+                       </report>
+               </rule>
+
+               <rule context='h:img|h:object'>
+                       <report test='@hspace'>
+                               The &#x201C;hspace&#x201D; attribute on the 
&#x201C;<name/>&#x201D; element is obsolete.
+                               Use CSS instead. 
http://wiki.whatwg.org/wiki/Presentational_elements_and_attributes
+                       </report>
+                       <report test='@vspace'>
+                               The &#x201C;vspace&#x201D; attribute on the 
&#x201C;<name/>&#x201D; element is obsolete.
+                               Use CSS instead. 
http://wiki.whatwg.org/wiki/Presentational_elements_and_attributes
+                       </report>
+                       <report test='@border and self::h:object'>
+                               The &#x201C;border&#x201D; attribute on the 
&#x201C;<name/>&#x201D; element is obsolete.
+                               Use CSS instead. 
http://wiki.whatwg.org/wiki/Presentational_elements_and_attributes
+                       </report>
+               </rule>
+
+               <rule context='h:table'>
+                       <report test='@bgcolor'>
+                               The &#x201C;bgcolor&#x201D; attribute on the 
&#x201C;<name/>&#x201D; element is obsolete.
+                               Use CSS instead. 
http://wiki.whatwg.org/wiki/Presentational_elements_and_attributes
+                       </report>
+                       <report test='@border and not(@border = "" or @border = 
"1")'>
+                               The value of the &#x201C;border&#x201D; 
attribute on the &#x201C;<name/>&#x201D; element
+                               must be either &#x201C;1&#x201D; or the empty 
string. To regulate the thickness of table borders, 
+                               Use CSS instead. 
http://wiki.whatwg.org/wiki/Presentational_elements_and_attributes
+                       </report>
+                       <report test='@cellpadding'>
+                               The &#x201C;cellpadding&#x201D; attribute on 
the &#x201C;<name/>&#x201D; element is obsolete.
+                               Use CSS instead. 
http://wiki.whatwg.org/wiki/Presentational_elements_and_attributes
+                       </report>
+                       <report test='@cellspacing'>
+                               The &#x201C;cellspacing&#x201D; attribute on 
the &#x201C;<name/>&#x201D; element is obsolete.
+                               Use CSS instead. 
http://wiki.whatwg.org/wiki/Presentational_elements_and_attributes
+                       </report>
+                       <report test='@frame'>
+                               The &#x201C;frame&#x201D; attribute on the 
&#x201C;<name/>&#x201D; element is obsolete.
+                               Use CSS instead. 
http://wiki.whatwg.org/wiki/Presentational_elements_and_attributes
+                       </report>
+                       <report test='@rules'>
+                               The &#x201C;rules&#x201D; attribute on the 
&#x201C;<name/>&#x201D; element is obsolete.
+                               Use CSS instead. 
http://wiki.whatwg.org/wiki/Presentational_elements_and_attributes
+                       </report>
+               </rule>
+
+               <rule context='h:td|h:th'>
+                       <report test='@bgcolor'>
+                               The &#x201C;bgcolor&#x201D; attribute on the 
&#x201C;<name/>&#x201D; element is obsolete.
+                               Use CSS instead. 
http://wiki.whatwg.org/wiki/Presentational_elements_and_attributes
+                       </report>
+                       <report test='@height'>
+                               The &#x201C;height&#x201D; attribute on the 
&#x201C;<name/>&#x201D; element is obsolete.
+                               Use CSS instead. 
http://wiki.whatwg.org/wiki/Presentational_elements_and_attributes
+                       </report>
+                       <report test='@nowrap'>
+                               The &#x201C;nowrap&#x201D; attribute on the 
&#x201C;<name/>&#x201D; element is obsolete.
+                               Use CSS instead. 
http://wiki.whatwg.org/wiki/Presentational_elements_and_attributes
+                       </report>
+               </rule>
+
+               <rule context='h:tr'>
+                       <report test='@bgcolor'>
+                               The &#x201C;bgcolor&#x201D; attribute on the 
&#x201C;<name/>&#x201D; element is obsolete.
+                               Use CSS instead. 
http://wiki.whatwg.org/wiki/Presentational_elements_and_attributes
+                       </report>
+               </rule>
+       </pattern>
+
+<!-- lang and xml:lang in XHTML  - - - - - - - - - - - - - - - - - -->
+
+       <pattern name='lang and xml:lang in XHTML'>
+               <rule context='h:address@hidden and @xml:lang]'>
+                       <assert test='translate(@lang, 
"ABCDEFGHIJKLMNOPQRSTUVWXYZ", "abcdefghijklmnopqrstuvwxyz") = 
translate(@xml:lang, "ABCDEFGHIJKLMNOPQRSTUVWXYZ", 
"abcdefghijklmnopqrstuvwxyz")'>
+                               When the attribute &#x201C;lang&#x201D; in no 
namespace and the attribute &#x201C;lang&#x201D;
+                               in the XML namespace are both present, they 
must have the same value.
+                       </assert>
+               </rule>
+       </pattern>
+
+<!-- IDREFs  - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
+
+       <!-- Assuming that ID uniqueness is already enforced. -->
+
+       <pattern name='contextmenu must refer to a menu'>
+               <rule context='h:address@hidden'>
+                 <assert test='//h:address@hidden = current()/@contextmenu]'>
+                               The &#x201C;contextmenu&#x201D; attribute must 
refer to a 
+                               &#x201C;menu&#x201D; element.
+                       </assert>
+               </rule>
+       </pattern>
+
+       <!-- FIXME form attribute -->
+       
+       <!-- FIXME output for -->
+       
+<!-- Unique Definitions  - - - - - - - - - - - - - - - - - - - - - -->
+       
+       <!-- Only one definition per term per document' -->
+
+<!-- ARIA containment    - - - - - - - - - - - - - - - - - - - - - -->
+
+       <pattern name='Mutually Exclusive Role triggers'>
+
+    <!-- XXX columnheader and rowheader require row parent -->
+
+               <rule context='address@hidden"option"]'>
+                       <assert test='../@role="listbox"'>
+                               An element with &#x201C;role=option&#x201D; 
requires 
+                               &#x201C;role=listbox&#x201D; on the parent.
+                       </assert>
+               </rule>
+
+               <rule context='address@hidden"menuitem"]'>
+                       <assert test='../@role="menu"'>
+                               An element with &#x201C;role=menuitem&#x201D; 
requires 
+                               &#x201C;role=menu&#x201D; on the parent.
+                       </assert>
+               </rule>
+
+               <rule context='address@hidden"menuitemcheckbox"]'>
+                       <assert test='../@role="menu"'>
+                               An element with 
&#x201C;role=menuitemcheckbox&#x201D; requires 
+                               &#x201C;role=menu&#x201D; on the parent.
+                       </assert>
+               </rule>
+
+               <rule context='address@hidden"menuitemradio"]'>
+                       <assert test='../@role="menu"'>
+                               An element with 
&#x201C;role=menuitemradio&#x201D; requires 
+                               &#x201C;role=menu&#x201D; on the parent.
+                       </assert>
+               </rule>
+
+               <rule context='address@hidden"tab"]'>
+                       <assert test='../@role="tablist"'>
+                               An element with &#x201C;role=tab&#x201D; 
requires 
+                               &#x201C;role=tablist&#x201D; on the parent.
+                       </assert>
+               </rule>
+
+               <rule context='address@hidden"treeitem"]'>
+                       <assert test='../@role="tree"'>
+                               An element with &#x201C;role=treeitem&#x201D; 
requires 
+                               &#x201C;role=tree&#x201D; on the parent.
+                       </assert>
+               </rule>
+
+               <rule context='address@hidden"listitem"]'>
+                       <assert test='../@role="list"'>
+                               An element with &#x201C;role=listitem&#x201D; 
requires 
+                               &#x201C;role=list&#x201D; on the parent.
+                       </assert>
+               </rule>
+
+               <rule context='address@hidden"row"]'>
+                       <assert test='../@role="grid" or 
+                                     ../../@role="grid" or
+                                                 ../@role="treegrid" or 
+                                     ../../@role="treegrid"'>
+                               An element with &#x201C;role=row&#x201D; 
requires 
+                               &#x201C;role=treegrid&#x201D; or 
&#x201C;role=grid&#x201D; on the parent or grandparent.
+                       </assert>
+               </rule> 
+               <!-- XXX hoping for a spec change so not bothering with the 
reciprocal case -->
+
+               <rule context='address@hidden"gridcell"]'>
+                       <assert test='../@role="row"'>
+                               An element with &#x201C;role=gridcell&#x201D; 
requires 
+                               &#x201C;role=row&#x201D; on the parent.
+                       </assert>
+               </rule>
+               <!-- XXX hoping for a spec change so not bothering with the 
reciprocal case -->
+
+       </pattern>
+       
+       <pattern name='Not Option'>
+               <rule context='*[not(@role="option")]'>
+                       <report test='../@role="listbox"'>
+                               An element must not be a child of
+                               &#x201C;role=listbox&#x201D; unless it has 
&#x201C;role=option&#x201D;.
+                       </report>
+               </rule>
+       </pattern>
+       
+       <pattern name='Not menuitem*'>
+               <rule context='*[not(@role="menuitem" or 
+                                    @role="menuitemcheckbox" or 
+                                    @role="menuitemradio")]'>
+                       <report test='../@role="menu"'>
+                               An element must not be a child of
+                               &#x201C;role=menu&#x201D; unless it has 
+                               &#x201C;role=menuitem&#x201D;, 
+                               &#x201C;role=menuitemcheckbox&#x201D; or 
+                               &#x201C;role=menuitemradio&#x201D;.
+                       </report>
+               </rule>
+       </pattern>
+       
+       <pattern name='Not treeitem'>
+               <rule context='*[not(@role="treeitem")]'>
+                       <report test='../@role="tree"'>
+                               An element must not be a child of
+                               &#x201C;role=tree&#x201D; unless it has 
+                               &#x201C;role=treeitem&#x201D;.
+                       </report>
+               </rule>
+       </pattern>
+       
+       <pattern name='Not listitem'>
+               <rule context='*[not(@role="listitem")]'>
+                       <report test='../@role="list"'>
+                               An element must not be a child of
+                               &#x201C;role=list&#x201D; unless it has 
+                               &#x201C;role=listitem&#x201D;.
+                       </report>
+               </rule>
+               <!-- XXX role=group omitted due to lack of detail in spec -->
+       </pattern>
+       
+       <pattern name='Not radio'>
+               <rule context='*[not(@role="radio")]'>
+                       <report test='../@role="radiogroup"'>
+                               An element must not be a child of
+                               &#x201C;role=radiogroup&#x201D; unless it has 
+                               &#x201C;role=radio&#x201D;.
+                       </report>
+               </rule>
+       </pattern>
+       
+       <pattern name='Not gridcell'>
+               <rule context='*[not(@role="gridcell")]'>
+                       <report test='../@role="row"'>
+                               An element must not be a child of
+                               &#x201C;role=row&#x201D; unless it has 
+                               &#x201C;role=gridcell&#x201D;.
+                       </report>
+               </rule>
+       </pattern>
+       
+       <pattern name='Not tab'>
+               <rule context='*[not(@role="tab")]'>
+                       <report test='../@role="tablist"'>
+                               An element must not be a child of
+                               &#x201C;role=tablist&#x201D; unless it has 
+                               &#x201C;role=role&#x201D;.
+                       </report>
+               </rule>
+       </pattern>
+
+  <!-- XXX combobox requires a listbox child -->
+       
+       <pattern name='aria-activedescendant must refer to a descendant'>
+               <rule context='address@hidden'>
+                       <assert test='descendant::address@hidden = 
current()/@aria-activedescendant]'>
+                               The &#x201C;aria-activedescendant&#x201D; 
attribute must refer to a 
+                               descendant element.
+                       </assert>
+               </rule>
+       </pattern>
+
+       <pattern name='controls must not dangle'>
+               <rule context='address@hidden'>
+                 <assert test='//address@hidden = current()/@aria-controls]'>
+                               The &#x201C;aria-controls&#x201D; attribute 
must point to an element in the 
+                               same document.
+                       </assert>
+               </rule>
+       </pattern>
+
+       <pattern name='describedby must not dangle'>
+               <rule context='address@hidden'>
+                 <assert test='//address@hidden = 
current()/@aria-describedby]'>
+                               The &#x201C;aria-describedby&#x201D; attribute 
must point to an element in the 
+                               same document.
+                       </assert>
+               </rule>
+       </pattern>
+
+       <pattern name='flowto must not dangle'>
+               <rule context='address@hidden'>
+                 <assert test='//address@hidden = current()/@aria-flowto]'>
+                               The &#x201C;aria-flowto&#x201D; attribute must 
point to an element in the 
+                               same document.
+                       </assert>
+               </rule>
+       </pattern>
+
+       <pattern name='labelledby must not dangle'>
+               <rule context='address@hidden'>
+                 <assert test='//address@hidden = current()/@aria-labelledby]'>
+                               The &#x201C;aria-labelledby&#x201D; attribute 
must point to an element in the 
+                               same document.
+                       </assert>
+               </rule>
+       </pattern>
+
+       <pattern name='owns must not dangle'>
+               <rule context='address@hidden'>
+                 <assert test='//address@hidden = current()/@aria-owns]'>
+                               The &#x201C;aria-owns&#x201D; attribute must 
point to an element in the 
+                               same document.
+                       </assert>
+               </rule>
+       </pattern>
+
+<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
-->
+<!--                               Warnings                                  
-->
+<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
-->
+       <pattern name="Warnings for HTML5 attributes that are obsolete but 
conforming">
+               <rule context='h:img'>
+                       <report test='@border' role='warning'>
+                               The &#x201C;border&#x201D; attribute on the 
&#x201C;img&#x201D; element is obsolete.
+                               Consider specifying &#x201C;img { border: 0; 
}&#x201C; in CSS instead.
+                       </report>
+               </rule>
+               <rule context='h:script[translate(@language, "JAVSCRIPT", 
"javscript")="javascript"]'>
+                       <report test='not(@type) or translate(@type, 
"EXJAVSCRIPT", "exjavscript")="text/javascript"' role='warning'>
+                               The &#x201C;language&#x201D; attribute on the 
&#x201C;script&#x201D; element is obsolete. You can safely omit it.
+                       </report>
+               </rule>
+               <rule context='h:a'>
+                       <report test='@name' role='warning'>
+                               The &#x201C;name&#x201D; attribute on the 
&#x201C;a&#x201D; element is obsolete. Consider putting an
+                               &#x201C;id&#x201D; attribute on the nearest 
container instead.
+                       </report>
+               </rule>
+       </pattern>
+
+       <pattern name="Other warnings">
+               <rule context='h:video|h:audio'>
+                       <report test='count(h:address@hidden) > 1' 
role='warning'>
+                               &#x201C;<name/>&#x201D; element has more than 
one &#x201C;track&#x201D;
+                               child element with a &#x201C;default&#x201D; 
attribute.
+                       </report>
+               </rule>
+       </pattern>
+
+</schema>
diff --git a/block.rnc b/block.rnc
new file mode 100644
index 0000000..bc2b3a1
--- /dev/null
+++ b/block.rnc
@@ -0,0 +1,249 @@
+datatypes w = "http://whattf.org/datatype-draft";
+
+# #####################################################################
+##  RELAX NG Schema for HTML 5: Basic Prose Markup                    #
+# #####################################################################
+
+# #####################################################################
+## Paragraph-Level
+
+## Paragraph: <p>
+
+       p.elem =
+               element p { p.inner & p.attrs }
+       p.attrs =
+               (       common.attrs
+               &       common.attrs.aria?
+               )
+       p.inner =
+               ( common.inner.phrasing ) # REVISIT lists in span?
+
+       common.elem.flow |= p.elem
+
+## Hint Transition: <hr>
+
+       hr.elem =
+               element hr { hr.inner & hr.attrs }
+       hr.attrs =
+               (       common.attrs
+               &       (       common.attrs.aria.role.separator
+                       |       common.attrs.aria.role.presentation
+                       |       common.attrs.aria.role.menuitem
+                       )?
+               )
+       hr.inner =
+               ( empty )
+
+       common.elem.flow |= hr.elem
+
+# #####################################################################
+## Preformatting Blocks
+
+## Preformatted Text: <pre>
+
+       pre.elem =
+               element pre { pre.inner & pre.attrs }
+       pre.attrs =
+               (       common.attrs
+               &       common.attrs.aria?
+               )
+       pre.inner =
+               ( common.inner.phrasing )
+
+       common.elem.flow |= pre.elem
+
+# #####################################################################
+## Simple Lists
+
+## Unordered List: <ul>
+
+       ul.elem =
+               element ul { ul.inner & ul.attrs }
+       ul.attrs =
+               (       common.attrs
+               &       (       (       common.attrs.aria.role.directory
+                               |       common.attrs.aria.role.group
+                               |       common.attrs.aria.role.list
+                               |       common.attrs.aria.role.listbox
+                               |       common.attrs.aria.role.menu
+                               |       common.attrs.aria.role.menubar
+                               |       common.attrs.aria.role.tablist
+                               |       common.attrs.aria.role.toolbar
+                               |       common.attrs.aria.role.tree
+                               |       common.attrs.aria.role.presentation
+                               )
+                               |       common.attrs.aria.implicit.list
+                       )?
+               )
+       ul.inner =
+               (       li.elem*
+               &       common.elem.script-supporting*
+               )
+
+       common.elem.flow |= ul.elem
+
+## Unordered List Item: <li>
+
+       li.elem =
+               element li { li.inner & li.attrs }
+       li.attrs =
+               (       common.attrs 
+               &       (       common.attrs.aria.implicit.listitem
+                       |       common.attrs.aria.role.listitem
+                       |       common.attrs.aria.role.menuitem
+                       |       common.attrs.aria.role.menuitemcheckbox
+                       |       common.attrs.aria.role.menuitemradio
+                       |       common.attrs.aria.role.option
+                       |       common.attrs.aria.role.tab
+                       |       common.attrs.aria.role.treeitem
+                       |       common.attrs.aria.role.separator
+                       |       common.attrs.aria.role.presentation
+                       )?
+               )
+       li.inner =
+               ( common.inner.flow )
+
+## Ordered List: <ol>
+
+       ol.elem =
+               element ol { ol.inner & ol.attrs }
+       ol.attrs =
+               (       common.attrs
+               &       ol.attrs.start?
+               &       ol.attrs.reversed?
+               &       ol.attrs.type?
+               &       (       (       common.attrs.aria.role.directory
+                               |       common.attrs.aria.role.group
+                               |       common.attrs.aria.role.list
+                               |       common.attrs.aria.role.listbox
+                               |       common.attrs.aria.role.menu
+                               |       common.attrs.aria.role.menubar
+                               |       common.attrs.aria.role.tablist
+                               |       common.attrs.aria.role.toolbar
+                               |       common.attrs.aria.role.tree
+                               |       common.attrs.aria.role.presentation
+                               )
+                               |       common.attrs.aria.implicit.list
+                       )?
+               )
+               ol.attrs.start =
+                       attribute start {
+                               common.data.integer
+                       }
+               ol.attrs.reversed =
+                       attribute reversed {
+                               w:string "reversed" | w:string ""
+                       }
+               ol.attrs.type =
+                       attribute type {
+                               w:string "1" | w:string "a" | w:string "A" | 
w:string "i" | w:string "I"
+                       }
+       ol.inner =
+               (       oli.elem*
+               &       common.elem.script-supporting*
+               )
+
+       common.elem.flow |= ol.elem
+
+## Ordered List Item: <li>
+
+       oli.elem =
+               element li { oli.inner & oli.attrs }
+       oli.attrs =
+               (       common.attrs
+               &       oli.attrs.value?
+               &       (       common.attrs.aria.implicit.listitem
+                       |       common.attrs.aria.role.listitem
+                       |       common.attrs.aria.role.menuitemcheckbox
+                       |       common.attrs.aria.role.menuitemradio
+                       |       common.attrs.aria.role.option
+                       |       common.attrs.aria.role.treeitem
+                       |       common.attrs.aria.role.separator
+                       |       common.attrs.aria.role.presentation
+                       )?
+               )
+               oli.attrs.value =
+                       attribute value {
+                               common.data.integer
+                       }
+       oli.inner =
+               ( common.inner.flow )
+
+# #####################################################################
+## Definition Lists
+
+## Definition List: <dl>
+
+       dl.elem =
+               element dl { dl.inner & dl.attrs }
+       dl.attrs =
+               (       common.attrs
+               &       common.attrs.aria?
+               )
+       dl.inner =
+               (       (       (       dt.elem
+                               &       common.elem.script-supporting*
+                               )+
+                       ,
+                               (       dd.elem
+                               &       common.elem.script-supporting*
+                               )+
+                       )*
+               )
+
+       common.elem.flow |= dl.elem
+
+## Definition Term: <dt>
+
+       dt.elem =
+               element dt { dt.inner & dt.attrs }
+       dt.attrs =
+               (       common.attrs
+               &       common.attrs.aria?
+               )
+       dt.inner =
+               ( common.inner.flow )
+
+## Definition Description: <dd>
+
+       dd.elem =
+               element dd { dd.inner & dd.attrs }
+       dd.elem.phrasing =
+               element dd { dd.inner.phrasing & dd.attrs }
+       dd.attrs =
+               (       common.attrs
+               &       common.attrs.aria?
+               )
+       dd.inner =
+               ( common.inner.flow )
+       dd.inner.phrasing =
+               ( common.inner.phrasing )
+
+# #####################################################################
+## Miscellaneous Elements
+
+## Generic Container: <div>
+
+       div.elem =
+               element div { div.inner & div.attrs }
+       div.attrs =
+               (       common.attrs
+               &       common.attrs.aria?
+               )
+       div.inner =
+               ( common.inner.flow )
+
+       common.elem.flow |= div.elem
+
+## Title or Explanatory Caption: <legend>
+
+       legend.elem =
+               element legend { legend.inner & legend.attrs }
+       legend.attrs =
+               (       common.attrs
+               &       (       common.attrs.aria.role.presentation
+                       |       common.attrs.aria.role.menuitem
+                       )?
+               )       
+       legend.inner =
+               ( common.inner.phrasing )
diff --git a/common.rnc b/common.rnc
new file mode 100644
index 0000000..e87d49b
--- /dev/null
+++ b/common.rnc
@@ -0,0 +1,512 @@
+datatypes w = "http://whattf.org/datatype-draft";
+
+# #####################################################################
+##  RELAX NG Schema for HTML 5: Common Definitions                    #
+# #####################################################################
+
+
+# #####################################################################
+##  Language Parameters - redefine in inclusion block as necessary    #
+# #####################################################################
+
+## HTML vs. XHTML restrictions
+
+       XMLonly = empty
+       HTMLonly = notAllowed
+
+## HTML 4 Compatibility - set to notAllowed to disallow markup introduced in 
HTML 5
+#                         (This only affects mixed-version modules; wholly 
HTML5
+#                          modules should simply be left out of the inclusion 
list.)
+
+       v5only = empty
+
+## HTML Compatibility Switches - set to notAllowed to disallow
+
+       ## XML features that can't be roundtripped HTML <-> XHTML
+       #  (xml:base on elements other than <html>)
+       nonRoundtrippable = empty
+
+       ## XML features that can't be serialized as HTML
+       nonHTMLizable = empty
+
+## features that are not part of the W3C HTML spec
+       nonW3C = empty
+
+# #####################################################################
+##  Wildcards                                                         #
+# #####################################################################
+
+## Any attribute from any namespace
+
+       common.attr.anything =
+               attribute * { text }*
+
+## Any element from any namespace
+
+       common.elem.anything =
+               element * { common.inner.anything & common.attr.anything }
+
+## Any content from any namespace
+
+       common.inner.anything =
+               (       text
+               &       common.elem.anything*
+               )
+
+# #####################################################################
+##  Common Element Classes                                            #
+# #####################################################################
+
+## Metadata Elements
+
+       common.elem.metadata =
+               ( notAllowed )
+
+## Phrase Elements
+
+       common.elem.phrasing =
+               ( notAllowed )
+
+## Prose Elements
+
+       common.elem.flow =
+               ( common.elem.phrasing )
+
+
+# #####################################################################
+##  Common Content Models                                             #
+# #####################################################################
+
+## Metadata Content
+
+       common.inner.metadata =
+               ( common.elem.metadata* )
+
+## Phrase Content
+
+       common.inner.phrasing =
+               ( text & common.elem.phrasing* )
+
+## Prose Content
+
+       common.inner.transparent.flow =
+               ( text & common.elem.flow* )
+
+       common.inner.flow =
+               (       style.elem.scoped*,
+                       (       text
+                       &       common.elem.flow*
+                       )
+               )
+
+# #####################################################################
+##  Common Attributes                                                 #
+# #####################################################################
+
+# When updating, check <bdo> definition too
+
+common.attrs =
+       (       common.attrs.basic
+       &       common.attrs.i18n
+       &       common.attrs.present
+       &       common.attrs.other
+       )
+
+common.attrs.basic =
+       (       common.attrs.id?
+       &       common.attrs.class?
+       &       common.attrs.title?
+       &       common.attrs.base?
+       &       common.attrs.space?
+       )
+       common.attrs.id =
+               attribute id {
+                       common.data.id
+               }
+       common.attrs.class =
+               attribute class {
+                       common.data.tokens
+               }
+       common.attrs.title =
+               attribute title {
+                       text
+               }
+       common.attrs.base =
+               common.attrs.xmlbase
+               & nonRoundtrippable
+       common.attrs.xmlbase =
+               attribute xml:base {
+                       common.data.uri
+               } & XMLonly
+       common.attrs.space =
+               common.attrs.xmlspace
+       common.attrs.xmlspace =
+               attribute xml:space {
+                       string "preserve" | string "default"
+               } & XMLonly
+
+common.attrs.i18n =
+       (       common.attrs.dir?
+       &       common.attrs.language?
+       &       common.attrs.translate?
+       )
+       common.attrs.dir =
+               attribute dir {
+                       w:string "ltr" | w:string "rtl" | w:string "auto"
+               }
+       # This lang definition is a hack for enviroments where
+       # the HTML5 parser maps lang to xml:lang.
+       # Sameness check left to Schematron
+       common.attrs.language =
+               (       common.attrs.xmllang?
+               &       common.attrs.lang?
+               )
+       common.attrs.lang =
+               attribute lang {
+                       common.data.langcode
+               } & XMLonly
+       common.attrs.xmllang =
+               attribute xml:lang {
+                       common.data.langcode
+               }
+#      common.attrs.language =
+#              (       common.attrs.lang
+#              |       common.attrs.xmllang
+#              )
+#      common.attrs.lang =
+#              attribute lang {
+#                      common.data.langcode
+#              } & HTMLonly
+#      common.attrs.xmllang =
+#              attribute xml:lang {
+#                      common.data.langcode
+#              } & XMLonly
+       common.attrs.translate =
+               attribute translate {
+                       w:string "" | w:string "yes" | w:string "no"
+               }
+
+common.attrs.present =
+       (       common.attrs.style?
+       &       common.attrs.tabindex?
+       &       common.attrs.accesskey?
+       )
+       common.attrs.style =
+               attribute style {
+                       string
+               }
+       common.attrs.tabindex =
+               attribute tabindex {
+                       common.data.integer
+               }
+               # REVISIT move style to a module and bundle tabindex with ARIA
+       common.attrs.accesskey =
+               attribute accesskey {
+                       common.data.keylabellist
+               }
+
+common.attrs.other =
+       empty
+
+# #####################################################################
+##  Common Datatypes                                                  #
+# #####################################################################
+
+## Names and Tokens
+
+       common.data.tokens =
+               list { token* }
+
+       common.data.browsing-context =
+               w:browsing-context
+
+       common.data.browsing-context-or-keyword =
+               w:browsing-context-or-keyword
+#              xsd:string {
+#                      pattern = 
"()|([^_].*)|(_[bB][lL][aA][nN][kK])|(_[sS][eE][lL][fF])|(_[pP][aA][rR][eE][nN][tT])|(_[tT][oO][pP])"
+#              }
+
+
+## IDs and IDREFs
+
+       common.data.id =
+               w:ID
+#              xsd:string {
+#                      pattern = "\S+"
+#              }
+
+       common.data.idref =
+               w:IDREF
+               
+       common.data.idrefs =
+               w:IDREFS
+
+       common.data.name =
+               w:ID #FIXME
+
+       common.data.hash-name =
+               w:hash-name     
+#              xsd:string {
+#                      pattern = "#.+"
+#              }
+
+## Numerical
+
+       common.data.integer =
+               w:integer
+#              xsd:string {
+#                      pattern = "-?[0-9]+"
+#              }
+
+       common.data.integer.positive =
+               w:integer-positive
+#              xsd:string {
+#                      pattern = "0*[1-9][0-9]*"
+#              }
+
+       common.data.integer.non-negative =
+               w:integer-non-negative
+#              xsd:string {
+#                      pattern = "[0-9]+"
+#              }
+               
+#      common.data.percent =
+#              xsd:string {
+#                      pattern = "(100)|([1-9]?[0-9](\.[0-9]+)?)%"
+#              }
+               
+       common.data.float =
+               w:float
+#              xsd:string {
+#                      pattern = "-?[0-9]+(\.[0-9]+)?([eE]-?[0-9]+)?"
+#              }
+
+       common.data.float.positive =
+               w:float-positive
+#              xsd:string {
+#                      pattern = 
"(0*[1-9][0-9]*(\.[0-9]+)?)|([0-9]+(\.0*[1-9][0-9]*)?)([eE]-?[0-9]+)?"
+#              }
+               
+       common.data.float.non-negative =
+               w:float-non-negative
+#              xsd:string {
+#                      pattern = "[0-9]+(\.[0-9]+)?([eE]-?[0-9]+)?"
+#              }
+               
+## Temporal
+
+       common.data.datetime =
+               w:datetime-tz
+
+       common.data.date-or-time =
+               w:date-or-time
+
+       common.data.date =
+               w:date
+
+       common.data.time-datetime =
+               w:time-datetime
+
+## IRIs
+
+       common.data.uri =
+               # allow either a non-empty IRI ref or zero or more HTML
+               # space characters (which are: space, tab, LF, FF, CR)
+               (       w:iri-ref
+               |       xsd:string {
+                               pattern = "[ \x{0A}-\x{0D}]*"
+                               # NOTE The range above incorrectly allows U+000B
+                               # in addition to the HTML space characters; but
+                               # that's not a problem in practice because HTML
+                               # and XML parsers will both catch any U+000B
+                               # and report an error for it before that pattern
+                               # ever gets evaluated.
+                       }
+               )
+
+       common.data.uri.non-empty =
+               w:iri-ref
+
+       common.data.uris =
+               list { w:iri-ref* }
+
+       common.data.uri.absolute =
+               w:iri
+
+## <link type='icon'> sizes
+
+       common.data.sizes =
+#              list { w:sizes }
+               list {
+                       xsd:string {
+                               pattern = "[1-9][0-9]*x[1-9][0-9]*"
+                       }+
+               }
+
+## MIME types
+
+       common.data.mimetype =
+               w:mime-type
+
+## Encodings
+
+       common.data.charset =
+               w:charset
+
+       common.data.meta-charset =
+               w:meta-charset
+
+## Refresh
+
+       common.data.refresh =
+               w:refresh
+
+## Default style
+
+       common.data.default-style =
+        string
+#              w:default-style
+
+## X-UA-Compatible
+
+       common.data.x-ua-compatible =
+               string
+
+## Media Queries
+
+       common.data.mediaquery =
+               w:media-query
+
+## Language Codes
+
+       common.data.langcode =
+               w:string "" | w:language
+
+## List of Key Labels
+       common.data.keylabellist =
+               w:keylabellist
+
+## List of Source Sizes
+       common.data.source.size.list =
+               w:source-size-list
+
+## Microdata Properties
+  common.data.microdata-properties =
+    list { w:microdata-property+ }
+
+## Zero
+  common.data.zero =
+    w:zero
+
+## ECMAScript FunctionBody
+  common.data.functionbody =
+    w:functionbody
+
+# #####################################################################
+##  WF2 Module Hook                                                   #
+# #####################################################################
+               
+common-form.attrs.form = ( notAllowed )
+
+# #####################################################################
+##  Script-supporting elements
+# #####################################################################
+
+common.elem.script-supporting = ( notAllowed )
+
+# #####################################################################
+##  ARIA Module Hooks                                                 #
+# #####################################################################
+
+common.attrs.aria = ( notAllowed )
+common.attrs.aria.role.alert = ( notAllowed )
+common.attrs.aria.role.alertdialog = ( notAllowed )
+common.attrs.aria.role.application = ( notAllowed )
+common.attrs.aria.role.article = ( notAllowed )
+common.attrs.aria.role.banner = ( notAllowed )
+common.attrs.aria.role.button = ( notAllowed )
+common.attrs.aria.role.checkbox = ( notAllowed )
+common.attrs.aria.role.combobox = ( notAllowed )
+common.attrs.aria.role.complementary = ( notAllowed )
+common.attrs.aria.role.contentinfo = ( notAllowed )
+common.attrs.aria.role.dialog = ( notAllowed )
+common.attrs.aria.role.directory = ( notAllowed )
+common.attrs.aria.role.document = ( notAllowed )
+common.attrs.aria.role.group = ( notAllowed )
+common.attrs.aria.role.heading = ( notAllowed )
+common.attrs.aria.role.img = ( notAllowed )
+common.attrs.aria.role.link = ( notAllowed )
+common.attrs.aria.role.list = ( notAllowed )
+common.attrs.aria.role.listitem = ( notAllowed )
+common.attrs.aria.role.log = ( notAllowed )
+common.attrs.aria.role.listbox = ( notAllowed )
+common.attrs.aria.role.main = ( notAllowed )
+common.attrs.aria.role.marquee = ( notAllowed )
+common.attrs.aria.role.menu = ( notAllowed )
+common.attrs.aria.role.menubar = ( notAllowed )
+common.attrs.aria.role.menuitem = ( notAllowed )
+common.attrs.aria.role.menuitemcheckbox = ( notAllowed )
+common.attrs.aria.role.menuitemradio = ( notAllowed )
+common.attrs.aria.role.note = ( notAllowed )
+common.attrs.aria.role.option = ( notAllowed )
+common.attrs.aria.role.presentation = ( notAllowed )
+common.attrs.aria.role.progressbar = ( notAllowed )
+common.attrs.aria.role.radio = ( notAllowed )
+common.attrs.aria.role.region = ( notAllowed )
+common.attrs.aria.role.search = ( notAllowed )
+common.attrs.aria.role.separator = ( notAllowed )
+common.attrs.aria.role.slider = ( notAllowed )
+common.attrs.aria.role.spinbutton = ( notAllowed )
+common.attrs.aria.role.status = ( notAllowed )
+common.attrs.aria.role.tab = ( notAllowed )
+common.attrs.aria.role.tablist = ( notAllowed )
+common.attrs.aria.role.tabpanel = ( notAllowed )
+common.attrs.aria.role.textbox = ( notAllowed )
+common.attrs.aria.role.toolbar = ( notAllowed )
+common.attrs.aria.role.tree = ( notAllowed )
+common.attrs.aria.role.treeitem = ( notAllowed )
+common.attrs.aria.implicit.article = ( notAllowed )
+common.attrs.aria.implicit.banner = ( notAllowed )
+common.attrs.aria.implicit.button = ( notAllowed )
+common.attrs.aria.implicit.checkbox = ( notAllowed )
+common.attrs.aria.implicit.column-or-row-header = ( notAllowed )
+common.attrs.aria.implicit.combobox = ( notAllowed )
+common.attrs.aria.implicit.complementary = ( notAllowed )
+common.attrs.aria.implicit.contentinfo = ( notAllowed )
+common.attrs.aria.implicit.dialog = ( notAllowed )
+common.attrs.aria.implicit.document = ( notAllowed )
+common.attrs.aria.implicit.group = ( notAllowed )
+common.attrs.aria.implicit.heading = ( notAllowed )
+common.attrs.aria.implicit.img = ( notAllowed )
+common.attrs.aria.implicit.landmark = ( notAllowed )
+common.attrs.aria.implicit.link = ( notAllowed )
+common.attrs.aria.implicit.list = ( notAllowed )
+common.attrs.aria.implicit.listbox = ( notAllowed )
+common.attrs.aria.implicit.listitem = ( notAllowed )
+common.attrs.aria.implicit.main = ( notAllowed )
+common.attrs.aria.implicit.navigation = ( notAllowed )
+common.attrs.aria.implicit.option = ( notAllowed )
+common.attrs.aria.implicit.progressbar = ( notAllowed )
+common.attrs.aria.implicit.radio = ( notAllowed )
+common.attrs.aria.implicit.region = ( notAllowed )
+common.attrs.aria.implicit.section = ( notAllowed )
+common.attrs.aria.implicit.select = ( notAllowed )
+common.attrs.aria.implicit.slider = ( notAllowed )
+common.attrs.aria.implicit.spinbutton = ( notAllowed )
+common.attrs.aria.implicit.status = ( notAllowed )
+common.attrs.aria.implicit.structure = ( notAllowed )
+common.attrs.aria.implicit.textbox = ( notAllowed )
+common.attrs.aria.implicit.toolbar = ( notAllowed )
+common.attrs.aria.prop.readonly = ( notAllowed )
+common.attrs.aria.landmark.application = ( notAllowed )
+common.attrs.aria.landmark.banner = ( notAllowed )
+common.attrs.aria.landmark.complementary = ( notAllowed )
+common.attrs.aria.landmark.contentinfo = ( notAllowed )
+common.attrs.aria.landmark.form = ( notAllowed )
+common.attrs.aria.landmark.main = ( notAllowed )
+common.attrs.aria.landmark.navigation = ( notAllowed )
+common.attrs.aria.landmark.search = ( notAllowed )
+# per ARIA spec: article, document, and note are not actually landmarks
+common.attrs.aria.landmark.article = ( notAllowed )
+common.attrs.aria.landmark.document = ( notAllowed )
+common.attrs.aria.landmark.note = ( notAllowed )
diff --git a/core-scripting.rnc b/core-scripting.rnc
new file mode 100644
index 0000000..ff64969
--- /dev/null
+++ b/core-scripting.rnc
@@ -0,0 +1,344 @@
+datatypes w = "http://whattf.org/datatype-draft";
+
+# #####################################################################
+##  RELAX NG Schema for HTML 5: Core Scripting                        #
+# #####################################################################
+
+# #####################################################################
+## Scripting Elements
+
+## Inline Scripts: <script>
+
+       script.elem.embedded =
+               element script { script.inner.embedded & script.attrs.embedded }
+       script.attrs.embedded =
+               (       common.attrs
+               &       script.attrs.type?
+               &       script.attrs.language? # restricted in Schematron
+               &       embedded.content.attrs.crossorigin?
+               &       (       common.attrs.aria.role.presentation
+                       |       common.attrs.aria.role.menuitem
+                       )?
+               )
+       script.elem.imported =
+               element script { script.inner.imported & script.attrs.imported }
+       script.attrs.imported =
+               (       common.attrs
+               &       script.attrs.src?
+               &       script.attrs.defer?
+               &       script.attrs.async?
+               &       script.attrs.type?
+               &       script.attrs.charset?
+               &       script.attrs.language? # restricted in Schematron
+               &       embedded.content.attrs.crossorigin?
+               &       (       common.attrs.aria.role.presentation
+                       |       common.attrs.aria.role.menuitem
+                       )?
+               )
+               script.attrs.src =
+                       attribute src {
+                               common.data.uri.non-empty
+                       }
+               script.attrs.defer =
+                       attribute defer {
+                               w:string "defer" | w:string ""
+                       }
+               script.attrs.async =
+                       attribute async {
+                               w:string "async" | w:string ""
+                       } & v5only
+               script.attrs.type =
+                       attribute type {
+                               common.data.mimetype # XXX without charset 
parameter!
+                       }
+               script.attrs.charset =
+                       attribute charset {
+                               common.data.charset
+                       }
+               script.attrs.language =
+                       attribute language {
+                               string
+                       }
+       script.inner.embedded =
+               ( common.inner.anything )
+       script.inner.imported =
+               ( common.inner.anything )
+               
+       script.elem = 
+               (       script.elem.embedded
+               |       script.elem.imported
+               )
+               
+       common.elem.metadata |= script.elem
+       common.elem.phrasing |= script.elem
+
+## Fallback Unscripted Content: <noscript>
+
+       noscript.elem.head =
+               element noscript { noscript.inner.head & noscript.attrs }
+               & HTMLonly
+               noscript.inner.head = 
+                       (       link.elem
+                       |       meta.http-equiv.default-style.elem
+                       |       meta.http-equiv.refresh.elem
+                       |       style.elem
+                       )*
+       noscript.elem.phrasing =
+               element noscript { noscript.inner.phrasing & noscript.attrs }
+               & HTMLonly
+       noscript.inner.phrasing =
+               ( common.inner.phrasing )
+       noscript.elem.flow =
+               element noscript { noscript.inner.flow & noscript.attrs }
+               & HTMLonly
+       noscript.inner.flow =
+               ( common.inner.flow )
+       noscript.attrs =
+               (       common.attrs
+               &       (       common.attrs.aria.role.presentation
+                       |       common.attrs.aria.role.menuitem
+                       )?
+               )
+
+       common.elem.metadata |= noscript.elem.head
+       common.elem.phrasing |= noscript.elem.phrasing
+       common.elem.flow |= noscript.elem.flow
+
+# #####################################################################
+## Event Handler Attribute Definitions
+
+       common.attrs.scripting &=
+               (       scripting.attr.onabort?
+               &       scripting.attr.onblur?
+               &       scripting.attr.oncanplay?
+               &       scripting.attr.oncanplaythrough?
+               &       scripting.attr.onchange?
+               &       scripting.attr.onclick?
+               &       scripting.attr.onclose?
+               &       scripting.attr.oncontextmenu?
+               &       scripting.attr.ondblclick?
+               &       scripting.attr.ondrag?
+               &       scripting.attr.ondragend?
+               &       scripting.attr.ondragenter?
+               &       scripting.attr.ondragleave?
+               &       scripting.attr.ondragover?
+               &       scripting.attr.ondragstart?
+               &       scripting.attr.ondrop?
+               &       scripting.attr.ondurationchange?
+               &       scripting.attr.onemptied?
+               &       scripting.attr.onended?
+               &       scripting.attr.onerror?
+               &       scripting.attr.onfocus?
+               &       scripting.attr.oninput?
+               &       scripting.attr.oninvalid?
+               &       scripting.attr.onkeydown?
+               &       scripting.attr.onkeypress?
+               &       scripting.attr.onkeyup?
+               &       scripting.attr.onload?
+               &       scripting.attr.onloadeddata?
+               &       scripting.attr.onloadedmetadata?
+               &       scripting.attr.onloadstart?
+               &       scripting.attr.onmousedown?
+               &       scripting.attr.onmousemove?
+               &       scripting.attr.onmouseout?
+               &       scripting.attr.onmouseover?
+               &       scripting.attr.onmouseup?
+               &       scripting.attr.onmousewheel?
+               &       scripting.attr.onpause?
+               &       scripting.attr.onplay?
+               &       scripting.attr.onplaying?
+               &       scripting.attr.onprogress?
+               &       scripting.attr.onratechange?
+               &       scripting.attr.onreset?
+               &       scripting.attr.onscroll?
+               &       scripting.attr.onseeked?
+               &       scripting.attr.onseeking?
+               &       scripting.attr.onselect?
+               &       scripting.attr.onshow?
+               &       scripting.attr.onstalled?
+               &       scripting.attr.onsubmit?
+               &       scripting.attr.onsuspend?
+               &       scripting.attr.ontimeupdate?
+               &       scripting.attr.onvolumechange?
+               &       scripting.attr.onwaiting?
+               )
+               
+       common.attrs.other &= common.attrs.scripting
+
+       scripting.attr.onabort =
+               attribute onabort { common.data.functionbody }
+       scripting.attr.onblur =
+               attribute onblur { common.data.functionbody }
+       scripting.attr.oncanplay =
+               attribute oncanplay { common.data.functionbody }
+       scripting.attr.oncanplaythrough =
+               attribute oncanplaythrough { common.data.functionbody }
+       scripting.attr.onchange =
+               attribute onchange { common.data.functionbody }
+       scripting.attr.onclick =
+               attribute onclick { common.data.functionbody }
+       scripting.attr.onclose =
+               attribute onclose { common.data.functionbody }
+       scripting.attr.oncontextmenu =
+               attribute oncontextmenu { common.data.functionbody }
+       scripting.attr.ondblclick =
+               attribute ondblclick { common.data.functionbody }
+       scripting.attr.ondrag =
+               attribute ondrag { common.data.functionbody }
+       scripting.attr.ondragend =
+               attribute ondragend { common.data.functionbody }
+       scripting.attr.ondragenter =
+               attribute ondragenter { common.data.functionbody }
+       scripting.attr.ondragleave =
+               attribute ondragleave { common.data.functionbody }
+       scripting.attr.ondragover =
+               attribute ondragover { common.data.functionbody }
+       scripting.attr.ondragstart =
+               attribute ondragstart { common.data.functionbody }
+       scripting.attr.ondrop =
+               attribute ondrop { common.data.functionbody }
+       scripting.attr.ondurationchange =
+               attribute ondurationchange { common.data.functionbody }
+       scripting.attr.onemptied =
+               attribute onemptied { common.data.functionbody }
+       scripting.attr.onended =
+               attribute onended { common.data.functionbody }
+       scripting.attr.onerror =
+               attribute onerror { common.data.functionbody }
+       scripting.attr.onfocus =
+               attribute onfocus { common.data.functionbody }
+       scripting.attr.onformchange =
+               attribute onformchange { common.data.functionbody }
+       scripting.attr.onforminput =
+               attribute onforminput { common.data.functionbody }
+       scripting.attr.oninput =
+               attribute oninput { common.data.functionbody }
+       scripting.attr.oninvalid =
+               attribute oninvalid { common.data.functionbody }
+       scripting.attr.onkeydown =
+               attribute onkeydown { common.data.functionbody }
+       scripting.attr.onkeypress =
+               attribute onkeypress { common.data.functionbody }
+       scripting.attr.onkeyup =
+               attribute onkeyup { common.data.functionbody }
+       scripting.attr.onload =
+               attribute onload { common.data.functionbody }
+       scripting.attr.onloadeddata =
+               attribute onloadeddata { common.data.functionbody }
+       scripting.attr.onloadedmetadata =
+               attribute onloadedmetadata { common.data.functionbody }
+       scripting.attr.onloadstart =
+               attribute onloadstart { common.data.functionbody }
+       scripting.attr.onmousedown =
+               attribute onmousedown { common.data.functionbody }
+       scripting.attr.onmousemove =
+               attribute onmousemove { common.data.functionbody }
+       scripting.attr.onmouseout =
+               attribute onmouseout { common.data.functionbody }
+       scripting.attr.onmouseover =
+               attribute onmouseover { common.data.functionbody }
+       scripting.attr.onmouseup =
+               attribute onmouseup { common.data.functionbody }
+       scripting.attr.onmousewheel =
+               attribute onmousewheel { common.data.functionbody }
+       scripting.attr.onpause =
+               attribute onpause { common.data.functionbody }
+       scripting.attr.onplay =
+               attribute onplay { common.data.functionbody }
+       scripting.attr.onplaying =
+               attribute onplaying { common.data.functionbody }
+       scripting.attr.onprogress =
+               attribute onprogress { common.data.functionbody }
+       scripting.attr.onratechange =
+               attribute onratechange { common.data.functionbody }
+       scripting.attr.onreset =
+               attribute onreset { common.data.functionbody }
+       scripting.attr.onscroll =
+               attribute onscroll { common.data.functionbody }
+       scripting.attr.onseeked =
+               attribute onseeked { common.data.functionbody }
+       scripting.attr.onseeking =
+               attribute onseeking { common.data.functionbody }
+       scripting.attr.onselect =
+               attribute onselect { common.data.functionbody }
+       scripting.attr.onshow =
+               attribute onshow { common.data.functionbody }
+       scripting.attr.onstalled =
+               attribute onstalled { common.data.functionbody }
+       scripting.attr.onsubmit =
+               attribute onsubmit { common.data.functionbody }
+       scripting.attr.onsuspend =
+               attribute onsuspend { common.data.functionbody }
+       scripting.attr.ontimeupdate =
+               attribute ontimeupdate { common.data.functionbody }
+       scripting.attr.onvolumechange =
+               attribute onvolumechange { common.data.functionbody }
+       scripting.attr.onwaiting =
+               attribute onwaiting { common.data.functionbody }
+
+#      scripting.attr.common =
+#              (       scripting.attr.mouse
+#              &       scripting.attr.keyboard
+#              &       scripting.attr.focus
+#              )
+#      
+#      scripting.attr.mouse =
+#              (       scripting.attr.mouse.click?
+#              &       scripting.attr.mouse.dblclick?
+#              &       scripting.attr.mouse.down?
+#              &       scripting.attr.mouse.up?
+#              &       scripting.attr.mouse.over?
+#              &       scripting.attr.mouse.move?
+#              &       scripting.attr.mouse.out?
+#              )
+#              scripting.attr.mouse.click =
+#                      attribute onclick { string }
+#              scripting.attr.mouse.dblclick =
+#                      attribute ondblclick { string }
+#              scripting.attr.mouse.down =
+#                      attribute onmousedown { string }
+#              scripting.attr.mouse.up =
+#                      attribute onmouseup { string }
+#              scripting.attr.mouse.over =
+#                      attribute onmouseover { string }
+#              scripting.attr.mouse.move =
+#                      attribute onmousemove { string }
+#              scripting.attr.mouse.out =
+#                      attribute onmouseout { string }
+#      
+#      scripting.attr.keyboard =
+#              (       scripting.attr.keyboard.press?
+#              &       scripting.attr.keyboard.down?
+#              &       scripting.attr.keyboard.up?
+#              )
+#              scripting.attr.keyboard.press =
+#                      attribute onkeypress { string }
+#              scripting.attr.keyboard.down =
+#                      attribute onkeydown { string }
+#              scripting.attr.keyboard.up =
+#                      attribute onkeyup { string }
+#      
+#      
+#      scripting.attr.focus =
+#              (       scripting.attr.focus.gain?
+#              &       scripting.attr.focus.lose?
+#              )
+#              scripting.attr.focus.gain =
+#                      attribute onfocus { string }
+#              scripting.attr.focus.lose =
+#                      attribute onblur { string }
+#      
+#      scripting.attr.loading =
+#              (       scripting.attr.loading.load?
+#              &       scripting.attr.loading.unload?
+#              )
+#              scripting.attr.loading.load =
+#                      attribute onload { string }
+#              scripting.attr.loading.unload =
+#                      attribute onunload { string }
+
+
+# #####################################################################
+# Event Handler Attribute Assignments
+
+#      body.attrs   &= scripting.attr.loading
diff --git a/data.rnc b/data.rnc
new file mode 100644
index 0000000..acb7964
--- /dev/null
+++ b/data.rnc
@@ -0,0 +1,94 @@
+datatypes w = "http://whattf.org/datatype-draft";
+
+# #####################################################################
+##  RELAX NG Schema for HTML 5: Static Data Markup                    #
+# #####################################################################
+
+## Time: <time>
+
+       time.elem =
+               element time { time.inner & time.attrs }
+       time.attrs =
+               (       common.attrs
+               &       time.attrs.datetime?
+               &       common.attrs.aria?
+               )
+               time.attrs.datetime =
+                       attribute datetime {
+                               common.data.time-datetime
+                       }
+               time.attrs.datetime.dateonly =
+                       attribute datetime {
+                               common.data.date
+                       }
+               time.attrs.datetime.tz =
+                       attribute datetime {
+                               common.data.datetime
+                       }
+       time.inner =
+               ( common.inner.phrasing ) #Cannot enforce textContent format 
here
+
+       common.elem.phrasing |= time.elem
+
+## Data: <data>
+
+       data.elem =
+               element data { data.inner & data.attrs }
+       data.attrs =
+               (       common.attrs
+               &       data.attrs.value
+               &       common.attrs.aria?
+               )
+               data.attrs.value =
+                       attribute value {
+                               string
+                       }
+       data.inner =
+               ( common.inner.phrasing )
+
+       common.elem.phrasing |= data.elem
+
+## Scalar Gauge: <meter>
+
+       meter.elem =
+               element meter { meter.inner & meter.attrs }
+       meter.attrs =
+               (       common.attrs
+               &       meter.attrs.value
+               &       meter.attrs.min?
+               &       meter.attrs.low?
+               &       meter.attrs.high?
+               &       meter.attrs.max?
+               &       meter.attrs.optimum?
+               &       (       common.attrs.aria.role.presentation
+                       |       common.attrs.aria.role.menuitem
+                       )?
+               )
+               meter.attrs.value =
+                       attribute value {
+                               common.data.float
+                       }
+               meter.attrs.min =
+                       attribute min {
+                               common.data.float
+                       }
+               meter.attrs.low =
+                       attribute low {
+                               common.data.float
+                       }
+               meter.attrs.high =
+                       attribute high {
+                               common.data.float
+                       }
+               meter.attrs.max =
+                       attribute max {
+                               common.data.float
+                       }
+               meter.attrs.optimum =
+                       attribute optimum {
+                               common.data.float
+                       }
+       meter.inner =
+               ( common.inner.phrasing ) #Cannot enforce textContent format 
here
+
+       common.elem.phrasing |= meter.elem
diff --git a/embed.rnc b/embed.rnc
new file mode 100644
index 0000000..1b20ba8
--- /dev/null
+++ b/embed.rnc
@@ -0,0 +1,732 @@
+datatypes w = "http://whattf.org/datatype-draft";
+namespace local = ""
+
+# #####################################################################
+##  RELAX NG Schema for HTML 5: Embedded Content                      #
+# #####################################################################
+
+#######################################################################
+## Replaced Content
+
+## Images: <img>
+
+       img.elem =
+               element img { img.inner & img.attrs }
+       img.attrs =
+               (       common.attrs
+               &       img.attrs.src
+               &       img.attrs.srcset?
+               &       img.attrs.sizes?
+               &       img.attrs.alt? # ARIA: if alt empty, only allowed role 
value is "presentation"; check in assertions
+               &       img.attrs.height?
+               &       img.attrs.width?
+               &       img.attrs.usemap?
+               &       img.attrs.ismap?
+               &       img.attrs.border? # obsolete
+               &       embedded.content.attrs.crossorigin?
+               &       (       common.attrs.aria.implicit.img
+                       |       common.attrs.aria
+                       )?
+               )
+               img.attrs.src =
+                       attribute src {
+                               common.data.uri.non-empty
+                       }
+               img.attrs.srcset =
+                       attribute srcset {
+                               string
+                       } & v5only
+               img.attrs.sizes =
+                       attribute sizes {
+                               common.data.source.size.list
+                       } & v5only
+               img.attrs.alt =
+                       attribute alt {
+                               text
+                       }
+               img.attrs.height =
+                       attribute height {
+                               common.data.integer.non-negative
+                       }
+               img.attrs.width =
+                       attribute width {
+                               common.data.integer.non-negative
+                       }
+               img.attrs.usemap =
+                       attribute usemap {
+                               common.data.hash-name
+                       }
+               img.attrs.ismap =
+                       attribute ismap {
+                               w:string "ismap" | w:string ""
+                       }
+               img.attrs.border =
+                       attribute border {
+                               common.data.zero
+                       }
+       img.inner =
+               empty
+
+       common.elem.phrasing |= img.elem
+
+## Image with multiple sources: <picture>
+
+       picture.elem =
+               element picture { picture.inner & picture.attrs }
+               & v5only
+       picture.attrs =
+               ( common.attrs )
+       picture.inner =
+               (       (       source.picture.elem*
+                       &       common.elem.script-supporting*
+                       ),
+                       (       img.elem
+                       &       common.elem.script-supporting*
+                       )
+               )
+
+       common.elem.phrasing |= picture.elem
+
+## Picture source: <source srcset>
+
+       source.picture.elem =
+               element source { source.picture.inner & source.picture.attrs }
+       source.picture.attrs =
+               (       common.attrs
+               &       source.picture.attrs.media?
+               &       source.picture.attrs.srcset
+               &       source.picture.attrs.sizes?
+               &       source.picture.attrs.type?
+               )
+               source.picture.attrs.media =
+                       attribute media {
+                               common.data.mediaquery
+                       }
+               source.picture.attrs.srcset =
+                       attribute srcset {
+                               string
+                       }
+               source.picture.attrs.sizes =
+                       attribute sizes {
+                               common.data.source.size.list
+                       }
+               source.picture.attrs.type =
+                       attribute type {
+                               common.data.mimetype
+                       }
+       source.picture.inner =
+               ( empty )
+
+## Plug-ins: <embed>
+
+       embed.elem =
+               element embed { embed.inner & embed.attrs }
+       embed.attrs =
+               (       common.attrs
+               &       embed.attrs.src?
+               &       embed.attrs.type?
+               &       embed.attrs.height?
+               &       embed.attrs.width?
+               &       embed.attrs.other*
+               &       (       common.attrs.aria.landmark.application
+                       |       common.attrs.aria.landmark.document
+                       |       common.attrs.aria.role.img
+                       |       common.attrs.aria.role.presentation
+                       )?
+               )
+               embed.attrs.src =
+                       attribute src {
+                               common.data.uri.non-empty
+                       }
+               embed.attrs.type =
+                       attribute type {
+                               common.data.mimetype
+                       }
+               embed.attrs.height =
+                       attribute height {
+                               common.data.integer.non-negative
+                       }
+               embed.attrs.width =
+                       attribute width {
+                               common.data.integer.non-negative
+                       }
+               embed.attrs.other = # REVISIT common.attrs
+                       attribute local:* - ( src 
+                                           | type 
+                                           | height 
+                                           | width 
+                                           | id 
+                                           | class
+                                           | title 
+                                           | dir 
+                                           | lang 
+                                           | translate 
+                                           | style 
+                                           | tabindex 
+                                           | contextmenu 
+                                           | contenteditable 
+                                           | draggable 
+                                           | dropzone
+                                           | hidden
+                                           | onabort
+                                           | onblur
+                                           | oncanplay
+                                           | oncanplaythrough
+                                           | onchange
+                                           | onclick
+                                           | onclose
+                                           | oncontextmenu
+                                           | ondblclick
+                                           | ondrag
+                                           | ondragend
+                                           | ondragenter
+                                           | ondragleave
+                                           | ondragover
+                                           | ondragstart
+                                           | ondrop
+                                           | ondurationchange
+                                           | onemptied
+                                           | onended
+                                           | onerror
+                                           | onfocus
+                                           | oninput
+                                           | oninvalid
+                                           | onkeydown
+                                           | onkeypress
+                                           | onkeyup
+                                           | onload
+                                           | onloadeddata
+                                           | onloadedmetadata
+                                           | onloadstart
+                                           | onmousedown
+                                           | onmousemove
+                                           | onmouseout
+                                           | onmouseover
+                                           | onmouseup
+                                           | onmousewheel
+                                           | onpause
+                                           | onplay
+                                           | onplaying
+                                           | onprogress
+                                           | onratechange
+                                           | onreset
+                                           | onscroll
+                                           | onseeked
+                                           | onseeking
+                                           | onselect
+                                           | onshow
+                                           | onstalled
+                                           | onsubmit
+                                           | onsuspend
+                                           | ontimeupdate
+                                           | onvolumechange
+                                           | onwaiting
+                                           | onafterprint
+                                           | onbeforeprint
+                                           | onbeforeunload
+                                           | onhashchange
+                                           | onmessage
+                                           | onoffline
+                                           | ononline
+                                           | onpopstate
+                                           | onredo
+                                           | onresize
+                                           | onstorage
+                                           | onundo
+                                           | onunload
+                                           | role
+                                           | aria-atomic
+                                           | aria-busy
+                                           | aria-controls
+                                           | aria-describedby
+                                           | aria-disabled
+                                           | aria-dropeffect
+                                           | aria-expanded
+                                           | aria-flowto
+                                           | aria-grabbed
+                                           | aria-haspopup
+                                           | aria-hidden
+                                           | aria-invalid
+                                           | aria-label
+                                           | aria-labelledby
+                                           | aria-live
+                                           | aria-owns
+                                           | aria-relevant
+                                           | aria-required
+                                           | spellcheck
+                                           | accesskey
+                                           | itemref
+                                           | itemprop
+                                           | itemscope
+                                           | itemtype
+                                           | itemid
+                                           | name
+                                           | align
+                                           | about
+                                           | prefix
+                                           | property
+                                           | typeof
+                                           | vocab
+                                           | content
+                                           | datatype
+                                           | href
+                                           | rel
+                                           | resource
+                                           | rev
+                                           | inlist
+                                           | its-loc-note
+                                            | its-loc-note-type
+                                            | its-loc-note-ref
+                                            | its-term-info-ref
+                                            | its-term
+                                            | its-term-confidence
+                                            | its-within-text
+                                            | its-domain-mapping
+                                            | its-ta-confidence
+                                            | its-ta-class-ref
+                                            | its-ta-ident
+                                            | its-ta-ident-ref
+                                            | its-ta-source
+                                            | its-locale-filter-list
+                                            | its-locale-filter-type
+                                            | its-person
+                                            | its-person-ref
+                                            | its-org
+                                            | its-org-ref
+                                            | its-tool
+                                            | its-tool-ref
+                                            | its-rev-person
+                                            | its-rev-person-ref
+                                            | its-rev-org
+                                            | its-rev-org-ref
+                                            | its-rev-tool
+                                            | its-rev-tool-ref
+                                            | its-prov-ref
+                                            | its-provenance-records-ref
+                                            | its-loc-quality-issues-ref
+                                            | its-loc-quality-issue-type
+                                            | its-loc-quality-issue-comment
+                                            | its-loc-quality-issue-severity
+                                            | its-loc-quality-issue-profile-ref
+                                            | its-loc-quality-issue-enabled
+                                            | its-loc-quality-rating-score
+                                            | its-loc-quality-rating-vote
+                                            | 
its-loc-quality-rating-score-threshold
+                                            | 
its-loc-quality-rating-vote-threshold
+                                            | 
its-loc-quality-rating-profile-ref
+                                            | its-mt-confidence
+                                            | its-allowed-characters
+                                            | its-storage-size
+                                            | its-storage-encoding
+                                            | its-line-break-type
+                                            | its-annotators-ref
+                                           ) 
+                       {
+                               string
+                       }
+       embed.inner =
+               empty
+
+       common.elem.phrasing |= embed.elem
+
+## Generic Objects: <object>
+
+       object.elem.flow =
+               element object { object.inner.flow & object.attrs }
+       object.elem.phrasing =
+               element object { object.inner.phrasing & object.attrs }
+       object.attrs =
+               (       common.attrs
+               &       (       (       object.attrs.data
+                               &       object.attrs.type?
+                               )
+                       |       object.attrs.type
+                       )
+               &       object.attrs.typemustmatch?
+#              &       object.attrs.classid?
+#              &       object.attrs.codebase?
+#              &       object.attrs.codetype?
+               &       object.attrs.height?
+               &       object.attrs.width?
+               &       object.attrs.usemap?
+               &       object.attrs.name?
+               &       common-form.attrs.form?
+               &       (       common.attrs.aria.landmark.application
+                       |       common.attrs.aria.landmark.document
+                       |       common.attrs.aria.role.img
+                       |       common.attrs.aria.role.presentation
+                       )?
+               )
+               object.attrs.data =
+                       attribute data {
+                               common.data.uri.non-empty
+                       }
+               object.attrs.type =
+                       attribute type {
+                               common.data.mimetype
+                       }
+               object.attrs.typemustmatch =
+                       attribute typemustmatch {
+                               w:string "typemustmatch" | w:string ""
+                       } & v5only
+               object.attrs.height =
+                       attribute height {
+                               common.data.integer.non-negative
+                       }
+               object.attrs.width =
+                       attribute width {
+                               common.data.integer.non-negative
+                       }
+               object.attrs.usemap =
+                       attribute usemap {
+                               common.data.hash-name
+                       }
+               object.attrs.name =
+                       attribute name {
+                               common.data.browsing-context
+                       }
+       object.inner.flow =
+               (       param.elem*
+               ,       common.inner.transparent.flow
+               )
+       object.inner.phrasing =
+               (       param.elem*
+               ,       common.inner.phrasing
+               )
+
+       common.elem.flow |= object.elem.flow
+       common.elem.phrasing |= object.elem.phrasing
+
+## Initialization Parameters: <param>
+
+       param.elem =
+               element param { param.inner & param.attrs }
+       param.attrs =
+               (       common.attrs
+               &       param.attrs.name
+               &       param.attrs.value
+               &       (       common.attrs.aria.role.presentation
+                       |       common.attrs.aria.role.menuitem
+                       )?
+               )
+               param.attrs.name =
+                       attribute name {
+                               string
+                       }
+               param.attrs.value =
+                       attribute value {
+                               string
+                       }
+       param.inner =
+               ( empty )
+
+## Inline Frame: <iframe>
+
+       iframe.elem =
+               element iframe { iframe.inner & iframe.attrs }
+       iframe.attrs =
+               (       common.attrs
+               &       iframe.attrs.src?
+               &       iframe.attrs.srcdoc?
+               &       iframe.attrs.name?
+               &       iframe.attrs.width?
+               &       iframe.attrs.height?
+               &       iframe.attrs.sandbox?
+               &       iframe.attrs.seamless?
+               &       iframe.attrs.allowfullscreen?
+               &       (       common.attrs.aria.landmark.application
+                       |       common.attrs.aria.landmark.document
+                       |       common.attrs.aria.role.img
+                       |       common.attrs.aria.role.presentation
+                       )?
+               )
+               iframe.attrs.src =
+                       attribute src {
+                               common.data.uri.non-empty
+                       }
+               iframe.attrs.srcdoc =
+                       attribute srcdoc {
+                               string #FIXME
+                       }
+               iframe.attrs.name =
+                       attribute name {
+                               common.data.browsing-context
+                       }
+               iframe.attrs.height =
+                       attribute height {
+                               common.data.integer.non-negative
+                       }
+               iframe.attrs.width =
+                       attribute width {
+                               common.data.integer.non-negative
+                       }
+               iframe.attrs.seamless =
+                       attribute seamless {
+                               w:string "seamless" | w:string ""
+                       } & v5only
+               iframe.attrs.sandbox =
+                       attribute sandbox
+                               {       list 
+                                       {       ( w:string 
"allow-top-navigation" )?
+                                       ,       ( w:string "allow-same-origin" 
)?
+                                       ,       ( w:string "allow-forms" )?
+                                       ,       ( w:string "allow-scripts" )?
+                                       }
+                               |       list 
+                                       {       ( w:string 
"allow-top-navigation" )?
+                                       ,       ( w:string "allow-same-origin" 
)?
+                                       ,       ( w:string "allow-scripts" )?
+                                       ,       ( w:string "allow-forms" )?
+                                       }
+                               |       list 
+                                       {       ( w:string 
"allow-top-navigation" )?
+                                       ,       ( w:string "allow-forms" )?
+                                       ,       ( w:string "allow-same-origin" 
)?
+                                       ,       ( w:string "allow-scripts" )?
+                                       }
+                               |       list 
+                                       {       ( w:string 
"allow-top-navigation" )?
+                                       ,       ( w:string "allow-forms" )?
+                                       ,       ( w:string "allow-scripts" )?
+                                       ,       ( w:string "allow-same-origin" 
)?
+                                       }
+                               |       list 
+                                       {       ( w:string 
"allow-top-navigation" )?
+                                       ,       ( w:string "allow-scripts" )?
+                                       ,       ( w:string "allow-same-origin" 
)?
+                                       ,       ( w:string "allow-forms" )?
+                                       }
+                               |       list 
+                                       {       ( w:string 
"allow-top-navigation" )?
+                                       ,       ( w:string "allow-scripts" )?
+                                       ,       ( w:string "allow-forms" )?
+                                       ,       ( w:string "allow-same-origin" 
)?
+                                       }
+                               |       list 
+                                       {       ( w:string "allow-same-origin" 
)?
+                                       ,       ( w:string 
"allow-top-navigation" )?
+                                       ,       ( w:string "allow-forms" )?
+                                       ,       ( w:string "allow-scripts" )?
+                                       }
+                               |       list 
+                                       {       ( w:string "allow-same-origin" 
)?
+                                       ,       ( w:string 
"allow-top-navigation" )?
+                                       ,       ( w:string "allow-scripts" )?
+                                       ,       ( w:string "allow-forms" )?
+                                       }
+                               |       list 
+                                       {       ( w:string "allow-forms" )?
+                                       ,       ( w:string 
"allow-top-navigation" )?
+                                       ,       ( w:string "allow-same-origin" 
)?
+                                       ,       ( w:string "allow-scripts" )?
+                                       }
+                               |       list 
+                                       {       ( w:string "allow-forms" )?
+                                       ,       ( w:string 
"allow-top-navigation" )?
+                                       ,       ( w:string "allow-scripts" )?
+                                       ,       ( w:string "allow-same-origin" 
)?
+                                       }
+                               |       list 
+                                       {       ( w:string "allow-scripts" )?
+                                       ,       ( w:string 
"allow-top-navigation" )?
+                                       ,       ( w:string "allow-same-origin" 
)?
+                                       ,       ( w:string "allow-forms" )?
+                                       }
+                               |       list 
+                                       {       ( w:string "allow-scripts" )?
+                                       ,       ( w:string 
"allow-top-navigation" )?
+                                       ,       ( w:string "allow-forms" )?
+                                       ,       ( w:string "allow-same-origin" 
)?
+                                       }
+                               |       list 
+                                       {       ( w:string "allow-same-origin" 
)?
+                                       ,       ( w:string "allow-forms" )?
+                                       ,       ( w:string 
"allow-top-navigation" )?
+                                       ,       ( w:string "allow-scripts" )?
+                                       }
+                               |       list 
+                                       {       ( w:string "allow-same-origin" 
)?
+                                       ,       ( w:string "allow-scripts" )?
+                                       ,       ( w:string 
"allow-top-navigation" )?
+                                       ,       ( w:string "allow-forms" )?
+                                       }
+                               |       list 
+                                       {       ( w:string "allow-forms" )?
+                                       ,       ( w:string "allow-same-origin" 
)?
+                                       ,       ( w:string 
"allow-top-navigation" )?
+                                       ,       ( w:string "allow-scripts" )?
+                                       }
+                               |       list 
+                                       {       ( w:string "allow-forms" )?
+                                       ,       ( w:string "allow-scripts" )?
+                                       ,       ( w:string 
"allow-top-navigation" )?
+                                       ,       ( w:string "allow-same-origin" 
)?
+                                       }
+                               |       list 
+                                       {       ( w:string "allow-scripts" )?
+                                       ,       ( w:string "allow-same-origin" 
)?
+                                       ,       ( w:string 
"allow-top-navigation" )?
+                                       ,       ( w:string "allow-forms" )?
+                                       }
+                               |       list 
+                                       {       ( w:string "allow-scripts" )?
+                                       ,       ( w:string "allow-forms" )?
+                                       ,       ( w:string 
"allow-top-navigation" )?
+                                       ,       ( w:string "allow-same-origin" 
)?
+                                       }
+                               |       list 
+                                       {       ( w:string "allow-same-origin" 
)?
+                                       ,       ( w:string "allow-forms" )?
+                                       ,       ( w:string "allow-scripts" )?
+                                       ,       ( w:string 
"allow-top-navigation" )?
+                                       }
+                               |       list 
+                                       {       ( w:string "allow-same-origin" 
)?
+                                       ,       ( w:string "allow-scripts" )?
+                                       ,       ( w:string "allow-forms" )?
+                                       ,       ( w:string 
"allow-top-navigation" )?
+                                       }
+                               |       list 
+                                       {       ( w:string "allow-forms" )?
+                                       ,       ( w:string "allow-same-origin" 
)?
+                                       ,       ( w:string "allow-scripts" )?
+                                       ,       ( w:string 
"allow-top-navigation" )?
+                                       }
+                               |       list 
+                                       {       ( w:string "allow-forms" )?
+                                       ,       ( w:string "allow-scripts" )?
+                                       ,       ( w:string "allow-same-origin" 
)?
+                                       ,       ( w:string 
"allow-top-navigation" )?
+                                       }
+                               |       list 
+                                       {       ( w:string "allow-scripts" )?
+                                       ,       ( w:string "allow-same-origin" 
)?
+                                       ,       ( w:string "allow-forms" )?
+                                       ,       ( w:string 
"allow-top-navigation" )?
+                                       }
+                               |       list 
+                                       {       ( w:string "allow-scripts" )?
+                                       ,       ( w:string "allow-forms" )?
+                                       ,       ( w:string "allow-same-origin" 
)?
+                                       ,       ( w:string 
"allow-top-navigation" )?
+                                       }
+                               } & v5only
+               iframe.attrs.allowfullscreen =
+                       attribute allowfullscreen {
+                               w:string "allowfullscreen" | w:string ""
+                       } & v5only
+       iframe.inner =
+               ( ( text & HTMLonly ) | empty )
+
+       common.elem.phrasing |= iframe.elem
+
+#######################################################################
+## Image Maps
+
+## Map Definition: <map>
+
+       map.elem.flow =
+               element map { map.inner.flow & map.attrs }
+       map.elem.phrasing  =
+               element map { map.inner.phrasing & map.attrs }
+       map.attrs =
+               (       common.attrs
+               &       map.attrs.name
+               &       (       common.attrs.aria.role.presentation
+                       |       common.attrs.aria.role.menuitem
+                       )?
+               ) # REVISIT make id required in Schematron
+               map.attrs.name =
+                       attribute name {
+                               common.data.name
+                       }
+       map.inner.flow =
+               ( common.inner.transparent.flow )
+       map.inner.phrasing =
+               ( common.inner.phrasing )
+
+       common.elem.flow |= map.elem.flow
+       common.elem.phrasing |= map.elem.phrasing
+
+## Map Area Definition: <area>
+
+       area.elem =
+               element area { area.inner & area.attrs }
+       area.attrs =
+               (       common.attrs.basic
+               &       common.attrs.i18n
+               &       common.attrs.present
+               &       common.attrs.other
+               &       shared-hyperlink.attrs.download?
+               &       (       area.attrs.alt
+                       &       shared-hyperlink.attrs.href
+                       )?
+               &       shared-hyperlink.attrs.target?
+               &       shared-hyperlink.attrs.ping?
+               &       shared-hyperlink.attrs.rel?
+               &       shared-hyperlink.attrs.hreflang?
+               &       shared-hyperlink.attrs.type?
+               &       area.attrs.shape?
+               &       (       common.attrs.aria.role.link
+                       |       common.attrs.aria.role.presentation
+                       |       common.attrs.aria.role.menuitem
+                       )?
+               )
+               area.attrs.alt =
+                       attribute alt {
+                               text
+                       }
+               area.attrs.shape =
+                       (       ( area.attrs.shape.rect?  & 
area.attrs.coords.rect   )
+                       |       ( area.attrs.shape.circle & 
area.attrs.coords.circle )
+                       |       ( area.attrs.shape.poly   & 
area.attrs.coords.poly   )
+                       |       ( area.attrs.shape.default )
+                       )
+               area.attrs.shape.rect =
+                       attribute shape {
+                               w:string "rect"
+                       }
+               area.attrs.coords.rect =
+                       attribute coords {
+                               w:rectangle
+#                              xsd:token {
+#                                      pattern = 
"-?[0-9]+,-?[0-9]+,-?[0-9]+,-?[0-9]+"
+#                              }
+                       }
+               area.attrs.shape.circle =
+                       attribute shape {
+                               w:string "circle"
+                       }
+               area.attrs.coords.circle =
+                       attribute coords {
+                               w:circle
+#                              xsd:token {
+#                                      pattern = "-?[0-9]+,-?[0-9]+,[0-9]+"
+#                              }
+                       }
+               area.attrs.shape.poly =
+                       attribute shape {
+                               w:string "poly"
+                       }
+               area.attrs.coords.poly =
+                       attribute coords {
+                               w:polyline
+#                              xsd:token {
+#                                      pattern = 
"-?[0-9]+,-?[0-9]+,-?[0-9]+,-?[0-9]+,-?[0-9]+,-?[0-9]+(,-?[0-9]+,-?[0-9]+)*"
+#                              }
+                       }
+               area.attrs.shape.default =
+                       attribute shape {
+                               w:string "default"
+                       }
+       area.inner =
+               ( empty )
+
+       common.elem.phrasing |= area.elem
+
+## Attributes Common to Embedded Content
+
+               embedded.content.attrs.crossorigin =
+                       attribute crossorigin {
+                               w:string "anonymous" | w:string 
"use-credentials" | w:string ""
+                       } & v5only
diff --git a/form-datatypes.rnc b/form-datatypes.rnc
new file mode 100644
index 0000000..db719f9
--- /dev/null
+++ b/form-datatypes.rnc
@@ -0,0 +1,63 @@
+datatypes w = "http://whattf.org/datatype-draft";
+
+# #####################################################################
+##  RELAX NG Schema for HTML 5: Datatypes related to forms            #
+# #####################################################################
+
+## MIME types
+               
+       form.data.mimetypelist = 
+               w:mime-type-list
+               
+       form.data.charsetlist =
+               string # FIXME should be a "a space- and/or comma-delimited 
+                      # list of charset values"
+
+## ECMAScript Regular Expression
+               
+       form.data.pattern = 
+               w:pattern
+               
+## Temporal
+               
+       form.data.datetime-local =
+               w:datetime-local
+       
+       form.data.date =
+               w:date
+       
+       form.data.month =
+               w:month
+       
+       form.data.week =
+               w:week
+       
+       form.data.time =
+               w:time
+
+## Email
+
+       form.data.emailaddress =
+               w:email-address
+
+       form.data.emailaddresslist =
+               w:email-address-list
+
+## Color
+
+       form.data.color =
+               w:simple-color
+#              xsd:string {
+#                      pattern = "#[a-fA-F0-9]{6}"
+#              }
+
+## Text without line breaks
+
+       form.data.stringwithoutlinebreaks =
+               w:string-without-line-breaks
+
+## Non-empty string
+
+       form.data.nonemptystring =
+               w:non-empty-string
+
diff --git a/html5.rnc b/html5.rnc
new file mode 100644
index 0000000..0d8cef8
--- /dev/null
+++ b/html5.rnc
@@ -0,0 +1,56 @@
+default namespace = "http://www.w3.org/1999/xhtml";
+# #####################################################################
+##  RELAX NG Schema for HTML 5                                       #
+# #####################################################################
+
+  # To validate an HTML 5 document, you must first validate against  #
+  # this schema and then ALSO validate against assertions.sch        #
+
+  ## HTML flavor RELAX NG schemas can only be used after the         #
+  ## document has been transformed to well-formed XML.               #
+  ##   - Insert closing slashes in all empty element tags            #
+  ##   - Insert all optional start and end tags                      #
+  ##   - Add xmlns "http://www.w3.org/1999/xhtml";                    #
+  ##   - Properly escape <script> and <style> CDATA                  #
+  ##   - Parse and transform all HTML-only entities to numeric       #
+  ##     character references                                        #
+  ## Obviously, syntax-checking involving these features cannot be   #
+  ## done by the RELAX NG schema and must be checked, along with the #
+  ## <!DOCTYPE> requirement, by some other application.              #
+
+# #####################################################################
+## Schema Framework & Parameters
+
+include "common.rnc" {
+       # XHTML flavor #
+               XMLonly = notAllowed
+               HTMLonly = empty
+       # HTML 4 compat #
+               v5only = empty
+       # HTML-serializability #
+               nonHTMLizable = notAllowed
+       # HTML-roundtrippability #
+               nonRoundtrippable = notAllowed
+}
+
+# #####################################################################
+## Language Definitions
+
+start = html.elem
+
+include "meta.rnc"
+include "phrase.rnc"
+include "block.rnc"
+include "sectional.rnc"
+include "structural.rnc"
+include "revision.rnc"
+include "embed.rnc"
+include "ruby.rnc"
+include "media.rnc"
+include "core-scripting.rnc"
+include "tables.rnc"
+include "form-datatypes.rnc"
+include "web-forms.rnc"
+include "web-forms2.rnc"
+include "applications.rnc"
+include "data.rnc"
diff --git a/html5exclusions.rnc b/html5exclusions.rnc
new file mode 100644
index 0000000..1fa0915
--- /dev/null
+++ b/html5exclusions.rnc
@@ -0,0 +1,63 @@
+default namespace = "http://www.w3.org/1999/xhtml";
+# #####################################################################
+##  RELAX NG Schema for (X)HTML 5: Exclusions                         #
+# #####################################################################
+
+  ## This file is unmaintained. Please use assertions.sch instead.
+  
+# #####################################################################
+## Schema Framework & Parameters
+
+       start = normal.elem.all-inclusive
+
+# #####################################################################
+##  Normal Element Patterns
+
+## Any attribute from any namespace
+
+       normal.attr.anything =
+               attribute * { text }*
+
+## Any element from any namespace except exceptional elements,
+## but allowing those elements as descendants
+
+       normal.elem.all =
+               element * - (dfn) {
+                       normal.elem.all-inclusive
+               }
+
+## Any element from any namespace including exceptional elements
+
+       normal.elem.all-inclusive =
+               wildcard.elem.exclude-all | dfn.elem.exclude-self
+
+
+# #####################################################################
+##  Exclusion Element Patterns
+
+  # exclude all exceptional elements from the name classes;
+  # list them explicitly in content models instead
+
+normal.elem.exclude-dfn =
+       element * - (dfn) {
+               normal.elem.exclude-dfn
+       }
+
+dfn.elem.exclude-self =
+       element dfn {
+               (       normal.attr.anything
+               &       normal.elem.exclude-dfn
+               )
+       }
+
+# FIXME this part was cut off -- hsivonen
+wildcard.elem.exclude-all = 
+       notAllowed
+
+#FIXME no nested forms in HTML-serializable docs
+
+#FIXME no nested labels
+
+#FIXME no blockquote inside header or footer
+
+#FIXME exactly one hn in header
diff --git a/media.rnc b/media.rnc
new file mode 100644
index 0000000..28cbb63
--- /dev/null
+++ b/media.rnc
@@ -0,0 +1,210 @@
+datatypes w = "http://whattf.org/datatype-draft";
+
+# #####################################################################
+##  RELAX NG Schema for HTML 5: Advanced Embedded Content             #
+# #####################################################################
+
+## Attributes Common to Media Elements
+
+       # src not included
+       media.attrs = 
+               (       media.attrs.autoplay?
+               &       media.attrs.preload?
+               &       media.attrs.controls?
+               &       media.attrs.loop?
+               &       media.attrs.mediagroup?
+               &       media.attrs.muted?
+               &       embedded.content.attrs.crossorigin?
+               )
+               media.attrs.autoplay   =
+                       attribute autoplay   {
+                               w:string "autoplay" | w:string ""
+                       }
+               media.attrs.preload   =
+                       attribute preload   {
+                               w:string "none" | w:string "metadata" | 
w:string "auto" | w:string ""
+                       }
+               media.attrs.controls  =
+                       attribute controls  {
+                               w:string "controls" | w:string ""
+                       }
+               media.attrs.loop =
+                       attribute loop {
+                               w:string "loop" | w:string ""
+                       }
+               media.attrs.mediagroup =
+                       attribute mediagroup {
+                               string
+                       }
+               media.attrs.muted =
+                       attribute muted {
+                               w:string "muted" | w:string ""
+                       }
+               
+## Source: <source>
+
+       source.elem =
+               element source { source.inner & source.attrs }
+       source.attrs =
+               (       common.attrs
+               &       source.attrs.src
+               &       source.attrs.type?
+               &       (       common.attrs.aria.role.presentation
+                       |       common.attrs.aria.role.menuitem
+                       )?
+               )
+               source.attrs.src =
+                       attribute src {
+                               common.data.uri.non-empty
+                       }
+               source.attrs.type =
+                       attribute type {
+                               common.data.mimetype
+                       }
+       source.inner =
+               ( empty )
+
+## Media Source
+
+       media.source = 
+               (       media.attrs.src
+               |       source.elem*
+               )
+
+       media.attrs.src =
+               attribute src {
+                       common.data.uri.non-empty
+               }
+
+## Video: <video>
+
+       video.elem.flow =
+               element video { video.inner.flow & video.attrs }
+       video.elem.phrasing =
+               element video { video.inner.phrasing & video.attrs }
+       video.attrs =
+               (       common.attrs
+               &       media.attrs
+               &       video.attrs.poster?
+               &       video.attrs.height?
+               &       video.attrs.width?
+               &       common.attrs.aria.landmark.application?
+               )
+               video.attrs.poster =
+                       attribute poster {
+                               common.data.uri.non-empty
+                       }
+               video.attrs.height =
+                       attribute height {
+                               common.data.integer.non-negative
+                       }
+               video.attrs.width =
+                       attribute width {
+                               common.data.integer.non-negative
+                       }
+       video.inner.flow =
+               (       media.source
+               ,       track.elem*
+               ,       common.inner.transparent.flow
+               )
+       video.inner.phrasing =
+               (       media.source
+               ,       track.elem*
+               ,       common.inner.phrasing
+               )
+
+       common.elem.flow |= video.elem.flow
+       common.elem.phrasing |= video.elem.phrasing
+
+## Audio: <audio>
+
+       audio.elem.flow =
+               element audio { audio.inner.flow & audio.attrs }
+       audio.elem.phrasing =
+               element audio { audio.inner.phrasing & audio.attrs }
+       audio.attrs =
+               (       common.attrs
+               &       media.attrs
+               &       common.attrs.aria.landmark.application?
+               )
+       audio.inner.flow =
+               (       media.source
+               ,       track.elem*
+               ,       common.inner.transparent.flow
+               )
+       audio.inner.phrasing =
+               (       media.source
+               ,       track.elem*
+               ,       common.inner.phrasing
+               )
+
+       common.elem.flow |= audio.elem.flow
+       common.elem.phrasing |= audio.elem.phrasing
+
+## supplementary media track: <track>
+#
+       track.elem =
+               element track { track.inner & track.attrs }
+
+       track.attrs =
+               (       common.attrs
+               &       track.attrs.kind?
+               &       track.attrs.src
+               &       track.attrs.srclang?
+               &       track.attrs.label?
+               &       track.attrs.default?
+               &       (       common.attrs.aria.role.presentation
+                       |       common.attrs.aria.role.menuitem
+                       )?
+               )
+               track.attrs.kind =
+                       attribute kind {
+                               w:string "subtitles" | w:string "captions" | 
w:string "descriptions" | w:string "chapters" | w:string "metadata"
+                       }
+               track.attrs.src =
+                       attribute src {
+                               common.data.uri.non-empty
+                       }
+               track.attrs.srclang =
+                       attribute srclang {
+                               common.data.langcode
+                       }
+               track.attrs.label =
+                       attribute label {
+                               string # must be non-empty value; check is in 
assertions code
+                       }
+               track.attrs.default =
+                       attribute default {
+                               w:string "default" | w:string ""
+                       }
+
+       track.inner =
+               ( empty )
+
+## Captioned Content: <figure>
+
+       figure.elem =
+               element figure { figure.inner & figure.attrs }
+       figure.attrs =
+               (       common.attrs
+               &       common.attrs.aria?
+               )
+       figure.inner =
+               (       ( figcaption.elem?, common.inner.flow )
+               |       ( common.inner.flow, figcaption.elem? )
+               )
+
+       common.elem.flow |= figure.elem
+
+## Figure caption: <figcaption>
+
+       figcaption.elem =
+               element figcaption { figcaption.inner & figcaption.attrs }
+       figcaption.attrs =
+               (       common.attrs
+               &       (       common.attrs.aria.role.presentation
+                       |       common.attrs.aria.role.menuitem
+                       )?
+               )
+       figcaption.inner =
+               ( common.inner.flow )
diff --git a/meta.rnc b/meta.rnc
new file mode 100644
index 0000000..91d9d1c
--- /dev/null
+++ b/meta.rnc
@@ -0,0 +1,390 @@
+datatypes w = "http://whattf.org/datatype-draft";
+
+# #####################################################################
+##  RELAX NG Schema for HTML 5: Global Structure & Metadata          #
+# #####################################################################
+
+## Root Element: <html>
+
+       html.elem =
+               element html { html.inner & html.attrs }
+       html.attrs =
+               (       common.attrs
+               &       (       common.attrs.aria.role.presentation
+                       |       common.attrs.aria.role.menuitem
+                       )?
+               )
+       html.inner =
+               (       head.elem
+               ,       body.elem
+               )
+
+## Metadata Container: <head>
+
+       head.elem =
+               element head { head.inner & head.attrs }
+       head.attrs =
+               (       common.attrs
+#              &       head.attrs.profile?
+               &       (       common.attrs.aria.role.presentation
+                       |       common.attrs.aria.role.menuitem
+                       )?
+               )
+#              head.attrs.profile =
+#                      attribute profile {
+#                              common.data.uris #REVISIT should these be 
absolute (zero or more)
+#                      }
+       head.inner =
+               (       title.elem
+               &       base.elem? # REVISIT need a non-schema checker or 
Schematron
+               &       common.inner.metadata # Limit encoding decl position in 
Schematron
+               )
+#      head.inner =
+#              (       meta.elem.encoding?
+#              ,       (       title.elem
+#                      &       base.elem? # REVISIT need a non-schema checker 
or Schematron
+#                      &       common.inner.metadata
+#                      )
+#              )
+               
+## Content Container: <body>
+
+       body.elem =
+               element body { body.inner & body.attrs }
+       body.attrs =
+               (       common.attrs
+               &       (       common.attrs.aria.landmark.application
+                       |       common.attrs.aria.landmark.document
+                       |       common.attrs.aria.role.presentation
+                       |       common.attrs.aria.implicit.document
+                       )?
+               &       body.attrs.onafterprint?
+               &       body.attrs.onbeforeprint?
+               &       body.attrs.onbeforeunload?
+               &       body.attrs.onhashchange?
+               &       body.attrs.onmessage?
+               &       body.attrs.onoffline?
+               &       body.attrs.ononline?
+               &       body.attrs.onpagehide?
+               &       body.attrs.onpageshow?
+               &       body.attrs.onpopstate?
+               &       body.attrs.onresize?
+               &       body.attrs.onstorage?
+               &       body.attrs.onunload?
+               )
+       body.inner =
+               ( common.inner.flow )
+
+       body.attrs.onafterprint =
+               attribute onafterprint { common.data.functionbody }
+       body.attrs.onbeforeprint =
+               attribute onbeforeprint { common.data.functionbody }
+       body.attrs.onbeforeunload =
+               attribute onbeforeunload { common.data.functionbody }
+       body.attrs.onhashchange =
+               attribute onhashchange { common.data.functionbody }
+       body.attrs.onmessage =
+               attribute onmessage { common.data.functionbody }
+       body.attrs.onoffline =
+               attribute onoffline { common.data.functionbody }
+       body.attrs.ononline =
+               attribute ononline { common.data.functionbody }
+       body.attrs.onpopstate =
+               attribute onpopstate { common.data.functionbody }
+       body.attrs.onpagehide =
+               attribute onpagehide { common.data.functionbody }
+       body.attrs.onpageshow =
+               attribute onpageshow { common.data.functionbody }
+       body.attrs.onredo =
+               attribute onredo { common.data.functionbody }
+       body.attrs.onresize =
+               attribute onresize { common.data.functionbody }
+       body.attrs.onstorage =
+               attribute onstorage { common.data.functionbody }
+       body.attrs.onundo =
+               attribute onundo { common.data.functionbody }
+       body.attrs.onunload =
+               attribute onunload { common.data.functionbody }
+
+## Document Title: <title>
+
+       title.elem =
+               element title { title.inner & title.attrs }
+       title.attrs =
+               (       common.attrs
+               &       (       common.attrs.aria.role.presentation
+                       |       common.attrs.aria.role.menuitem
+                       )?
+               )
+       title.inner =
+               ( text )
+
+## Base URI: <base>
+
+       base.elem =
+               element base { base.inner & base.attrs }
+       base.attrs =
+               (       common.attrs.basic
+               &       common.attrs.i18n
+               &       common.attrs.present
+               &       common.attrs.other
+               &       (       (       base.attrs.href
+                               &       base.attrs.target?
+                               )
+                       |       base.attrs.target
+                       )
+               &       (       common.attrs.aria.role.presentation
+                       |       common.attrs.aria.role.menuitem
+                       )?
+               )
+       base.attrs.href =
+               attribute href {
+                       common.data.uri
+               }
+       base.attrs.target =
+               attribute target {
+                       common.data.browsing-context-or-keyword
+               }
+       base.inner =
+               ( empty )
+
+## Global Relationships: <link>
+
+       link.elem =
+               element link { link.inner & link.attrs }
+       link.attrs =
+               (       common.attrs.basic
+               &       common.attrs.i18n
+               &       common.attrs.present
+               &       common.attrs.other
+               &       link.attrs.href
+               &       link.attrs.rel
+               &       shared-hyperlink.attrs.hreflang?
+               &       shared-hyperlink.attrs.media?
+               &       shared-hyperlink.attrs.type?
+               &       link.attrs.sizes?
+               #       link.attrs.title included in common.attrs
+               &       embedded.content.attrs.crossorigin?
+               &       (       common.attrs.aria.role.link
+                       |       common.attrs.aria.role.presentation
+                       |       common.attrs.aria.role.menuitem
+                       )?
+               )
+               link.attrs.href =
+                       attribute href {
+                               common.data.uri.non-empty
+                       }
+               link.attrs.rel =
+                       attribute rel {
+                               w:link-rel
+                       }
+               link.attrs.sizes =
+                       attribute sizes {
+                               w:string "any" | common.data.sizes
+                       }
+       link.inner =
+               ( empty )
+               
+       common.elem.metadata |= link.elem
+
+## Global Style: <style>
+
+       style.elem =
+               element style { style.inner & style.attrs }
+       style.attrs =
+               (       common.attrs
+               &       style.attrs.type?
+               &       style.attrs.media?
+               #       style.attrs.title included in common.attrs
+               &       (       common.attrs.aria.role.presentation
+                       |       common.attrs.aria.role.menuitem
+                       )?
+               )
+               style.attrs.type =
+                       attribute type {
+                               common.data.mimetype
+                       }
+               style.attrs.media =
+                       attribute media {
+                               common.data.mediaquery
+                       }
+       style.inner =
+               ( common.inner.anything )
+               
+       common.elem.metadata |= style.elem
+
+## Scoped Style: <style scoped>
+
+       style.elem.scoped =
+               element style { style.inner & style.scoped.attrs }
+       style.scoped.attrs =
+               (       common.attrs
+               &       style.attrs.type?
+               &       style.attrs.media?
+               &       style.attrs.scoped
+               #       style.attrs.title included in common.attrs
+               &       (       common.attrs.aria.role.presentation
+                       |       common.attrs.aria.role.menuitem
+                       )?
+               )
+               style.attrs.scoped =
+                       attribute scoped {
+                               w:string "scoped" | w:string ""
+                       }
+
+## Name-Value Metadata: <meta name>
+
+       meta.name.elem =
+               element meta { meta.inner & meta.name.attrs }
+       meta.name.attrs =
+               (       common.attrs.basic
+               &       common.attrs.i18n
+               &       common.attrs.present
+               &       common.attrs.other
+               &       meta.name.attrs.name
+               &       meta.name.attrs.content
+               &       (       common.attrs.aria.role.presentation
+                       |       common.attrs.aria.role.menuitem
+                       )?
+               )
+               meta.name.attrs.name =
+                       attribute name {
+                               w:meta-name
+                       }
+               meta.name.attrs.content =
+                       attribute content {
+                               string
+                       }
+       meta.inner =
+               ( empty )
+               
+       common.elem.metadata |= meta.name.elem
+
+## "refresh" pragma directive: <meta http-equiv='refresh'>
+
+       meta.http-equiv.refresh.elem =
+               element meta { meta.inner & meta.http-equiv.refresh.attrs }
+       meta.http-equiv.refresh.attrs =
+               (       common.attrs.basic
+               &       common.attrs.i18n
+               &       common.attrs.present
+               &       common.attrs.other
+               &       meta.http-equiv.attrs.http-equiv.refresh
+               &       meta.http-equiv.attrs.content.refresh
+               &       (       common.attrs.aria.role.presentation
+                       |       common.attrs.aria.role.menuitem
+                       )?
+               )
+               meta.http-equiv.attrs.http-equiv.refresh =
+                       attribute http-equiv {
+                               w:string "refresh"
+                       }
+               meta.http-equiv.attrs.content.refresh =
+                       attribute content { 
+                               common.data.refresh
+                       }
+       common.elem.metadata |= meta.http-equiv.refresh.elem # not quite right 
per spec
+                                                       # if the definition is 
+                                                       # reused in another 
language
+
+## "default-style" pragma directive: <meta http-equiv='default-style'>
+
+       meta.http-equiv.default-style.elem =
+               element meta { meta.inner & meta.http-equiv.default-style.attrs 
}
+       meta.http-equiv.default-style.attrs =
+               (       common.attrs.basic
+               &       common.attrs.i18n
+               &       common.attrs.present
+               &       common.attrs.other
+               &       meta.http-equiv.attrs.http-equiv.default-style
+               &       meta.http-equiv.attrs.content.default-style
+               &       (       common.attrs.aria.role.presentation
+                       |       common.attrs.aria.role.menuitem
+                       )?
+               )
+               meta.http-equiv.attrs.http-equiv.default-style =
+                       attribute http-equiv {
+                               w:string "default-style"
+                       }
+               meta.http-equiv.attrs.content.default-style =
+                       attribute content {
+                               common.data.default-style
+                       }
+               
+       common.elem.metadata |= meta.http-equiv.default-style.elem # not quite 
right per spec
+                                                               # if the 
definition is 
+                                                               # reused in 
another language
+
+## "x-ua-compatible" pragma directive: <meta http-equiv='x-ua-compatible'>
+
+       meta.http-equiv.x-ua-compatible.elem =
+               element meta { meta.inner & 
meta.http-equiv.x-ua-compatible.attrs }
+       meta.http-equiv.x-ua-compatible.attrs =
+               (       common.attrs.basic
+               &       common.attrs.i18n
+               &       common.attrs.present
+               &       common.attrs.other
+               &       meta.http-equiv.attrs.http-equiv.x-ua-compatible
+               &       meta.http-equiv.attrs.content.x-ua-compatible
+               &       (       common.attrs.aria.role.presentation
+                       |       common.attrs.aria.role.menuitem
+                       )?
+               )
+               meta.http-equiv.attrs.http-equiv.x-ua-compatible =
+                       attribute http-equiv {
+                               w:string "x-ua-compatible"
+                       }
+               meta.http-equiv.attrs.content.x-ua-compatible =
+                       attribute content {
+                               common.data.x-ua-compatible
+                       }
+       common.elem.metadata |= meta.http-equiv.x-ua-compatible.elem
+
+## Inline Character Encoding Statement for HTML: <meta charset>
+
+       meta.charset.elem =
+               element meta { meta.inner & meta.charset.attrs }
+       meta.charset.attrs =
+               (       common.attrs.basic
+               &       common.attrs.i18n
+               &       common.attrs.present
+               &       common.attrs.other
+               &       meta.charset.attrs.charset
+               &       (       common.attrs.aria.role.presentation
+                       |       common.attrs.aria.role.menuitem
+                       )?
+               )
+               meta.charset.attrs.charset =
+                       attribute charset {
+                               (common.data.charset & HTMLonly)
+                               | (xsd:string {
+                                       pattern = "[uU][tT][fF]-8"
+                               } & XMLonly )
+                       } 
+
+## Inline Character Encoding Statement for HTML: <meta 
http-equiv='content-type'>
+
+       meta.http-equiv.content-type.elem =
+               element meta { meta.inner & meta.http-equiv.content-type.attrs }
+               & HTMLonly
+       meta.http-equiv.content-type.attrs =
+               (       common.attrs.basic
+               &       common.attrs.i18n
+               &       common.attrs.present
+               &       common.attrs.other
+               &       meta.http-equiv.attrs.http-equiv.content-type
+               &       meta.http-equiv.attrs.content.content-type
+               &       (       common.attrs.aria.role.presentation
+                       |       common.attrs.aria.role.menuitem
+                       )?
+               )
+               meta.http-equiv.attrs.http-equiv.content-type =
+                       attribute http-equiv {
+                               w:string "content-type"
+                       }
+               meta.http-equiv.attrs.content.content-type =
+                       attribute content {
+                               common.data.meta-charset
+                       }
+
+       common.elem.metadata |= ( meta.charset.elem | 
meta.http-equiv.content-type.elem )
diff --git a/microdata.rnc b/microdata.rnc
new file mode 100644
index 0000000..91616c8
--- /dev/null
+++ b/microdata.rnc
@@ -0,0 +1,101 @@
+datatypes w = "http://whattf.org/datatype-draft";
+
+# #####################################################################
+##  RELAX NG Schema for HTML 5: Microdata                             #
+# #####################################################################
+
+common.attrs.microdata =
+       (       common.attrs.microdata.itemref?
+       &       common.attrs.microdata.itemprop?
+       &       common.attrs.microdata.itemscope?
+       &       common.attrs.microdata.itemtype?
+       &       common.attrs.microdata.itemid?
+       )
+       common.attrs.microdata.itemref =
+               attribute itemref {
+                       common.data.idrefs
+               }
+       common.attrs.microdata.itemprop =
+               attribute itemprop {
+                       common.data.microdata-properties
+               }
+       common.attrs.microdata.itemscope =
+               attribute itemscope {
+                       w:string "itemscope" | w:string ""
+               }
+       common.attrs.microdata.itemtype =
+               attribute itemtype {
+                       list { common.data.uri.absolute+ }
+               }
+       common.attrs.microdata.itemid =
+               attribute itemid {
+                       common.data.uri
+               }
+
+common.attrs &= common.attrs.microdata
+
+a.attrs &= common.attrs.microdata
+area.attrs &= common.attrs.microdata
+base.attrs &= common.attrs.microdata
+
+## URL-valued Property Metadata: <link itemprop>
+
+       link.elem.phrasing =
+               element link { link.inner & link.phrasing.attrs }
+       link.phrasing.attrs =
+               (       common.attrs.basic
+               &       common.attrs.i18n
+               &       common.attrs.present
+               &       common.attrs.other
+               &       common.attrs.microdata.itemprop
+               &       common.attrs.microdata.itemref?
+               &       common.attrs.microdata.itemscope?
+               &       common.attrs.microdata.itemtype?
+               &       common.attrs.microdata.itemid?
+               &       shared-hyperlink.attrs.href
+               &       shared-hyperlink.attrs.hreflang?
+               &       shared-hyperlink.attrs.media?
+               &       shared-hyperlink.attrs.type?
+               &       link.attrs.sizes?
+               #       link.attrs.title included in common.attrs
+               &       embedded.content.attrs.crossorigin?
+               &       (       common.attrs.aria.role.link
+                       |       common.attrs.aria.role.presentation
+                       |       common.attrs.aria.role.menuitem
+                       )?
+               )
+       common.elem.phrasing |= link.elem.phrasing
+
+## <link> element in head, extensions
+
+link.attrs.rel |= common.attrs.microdata.itemprop
+link.attrs &= common.attrs.microdata.itemref?
+link.attrs &= common.attrs.microdata.itemscope?
+link.attrs &= common.attrs.microdata.itemtype?
+link.attrs &= common.attrs.microdata.itemid?
+
+## Property Metadata: <meta itemprop>
+
+       meta.itemprop.elem =
+               element meta { meta.inner & meta.itemprop.attrs }
+       meta.itemprop.attrs =
+               (       common.attrs.basic
+               &       common.attrs.i18n
+               &       common.attrs.present
+               &       common.attrs.other
+               &       common.attrs.microdata.itemprop
+               &       common.attrs.microdata.itemref?
+               &       common.attrs.microdata.itemscope?
+               &       common.attrs.microdata.itemtype?
+               &       common.attrs.microdata.itemid?
+               &       meta.itemprop.attrs.content
+               &       (       common.attrs.aria.role.presentation
+                       |       common.attrs.aria.role.menuitem
+                       )?
+               )
+               meta.itemprop.attrs.content =
+                       attribute content {
+                               string
+                       }
+       common.elem.metadata |= meta.itemprop.elem
+       common.elem.phrasing |= meta.itemprop.elem
diff --git a/phrase.rnc b/phrase.rnc
new file mode 100644
index 0000000..dc70881
--- /dev/null
+++ b/phrase.rnc
@@ -0,0 +1,399 @@
+datatypes w = "http://whattf.org/datatype-draft";
+
+# #####################################################################
+##  RELAX NG Schema for HTML 5: Phrase Markup                         #
+# #####################################################################
+
+## Contextual Hyperlink: <a>
+
+       a.elem.phrasing =
+               element a { a.inner.phrasing & a.attrs }
+       a.elem.flow =
+               element a { a.inner.flow & a.attrs }
+       a.attrs =
+               (       common.attrs.basic
+               &       common.attrs.i18n
+               &       common.attrs.present
+               &       common.attrs.other
+               &       a.attrs.name?
+               &       shared-hyperlink.attrs.download?
+               &       shared-hyperlink.attrs.href?
+               &       shared-hyperlink.attrs.target?
+               &       shared-hyperlink.attrs.rel?
+               &       shared-hyperlink.attrs.hreflang?
+               &       shared-hyperlink.attrs.type?
+               &       shared-hyperlink.attrs.ping?
+               &       (       common.attrs.aria.implicit.link
+                       |       common.attrs.aria.role.button
+                       |       common.attrs.aria.role.checkbox
+                       |       common.attrs.aria.role.link
+                       |       common.attrs.aria.role.menuitem
+                       |       common.attrs.aria.role.menuitemcheckbox
+                       |       common.attrs.aria.role.menuitemradio
+                       |       common.attrs.aria.role.tab
+                       |       common.attrs.aria.role.treeitem
+                       )?
+               )
+               a.attrs.name =
+                 attribute name {
+                   common.data.id # XXX not what the spec says
+                 }
+       a.inner.phrasing =
+               ( common.inner.phrasing )
+       a.inner.flow =
+               ( common.inner.transparent.flow )
+
+       common.elem.phrasing |= a.elem.phrasing
+       common.elem.flow |= a.elem.flow
+
+## Shared hyperlink attributes
+
+  shared-hyperlink.attrs.download =
+    attribute download {
+      string
+    }
+  shared-hyperlink.attrs.href =
+    attribute href {
+      common.data.uri
+    }
+  shared-hyperlink.attrs.target =
+    attribute target {
+      common.data.browsing-context-or-keyword
+    }
+  shared-hyperlink.attrs.rel =
+    attribute rel {
+      w:a-rel
+    }
+  shared-hyperlink.attrs.hreflang =
+    attribute hreflang {
+      common.data.langcode
+    }
+  shared-hyperlink.attrs.media =
+    attribute media {
+      common.data.mediaquery
+    }
+  shared-hyperlink.attrs.type =
+    attribute type {
+      common.data.mimetype
+    }
+  shared-hyperlink.attrs.ping =
+    attribute ping {
+      common.data.uris
+    } & v5only
+
+## Emphatic Stress: <em>
+
+       em.elem =
+               element em { em.inner & em.attrs }
+       em.attrs =
+               (       common.attrs
+               &       common.attrs.aria?
+               )
+       em.inner =
+               ( common.inner.phrasing )
+
+       common.elem.phrasing |= em.elem
+
+## Strong Importance: <strong>
+
+       strong.elem =
+               element strong { strong.inner & strong.attrs }
+       strong.attrs =
+               (       common.attrs
+               &       common.attrs.aria?
+               )
+       strong.inner =
+               ( common.inner.phrasing )
+
+       common.elem.phrasing |= strong.elem
+
+## Small Print and Side Comments: <small>
+
+       small.elem =
+               element small { small.inner & small.attrs }
+       small.attrs =
+               (       common.attrs
+               &       common.attrs.aria?
+               )
+       small.inner =
+               ( common.inner.phrasing )
+
+       common.elem.phrasing |= small.elem
+
+## Marked (Highlighted) Text: <mark>
+
+       mark.elem =
+               element mark { mark.inner & mark.attrs }
+               & v5only
+       mark.attrs =
+               (       common.attrs
+               &       (       common.attrs.aria.role.presentation
+                       |       common.attrs.aria.role.menuitem
+                       )?
+               )
+       mark.inner =
+               ( common.inner.phrasing )
+
+       common.elem.phrasing |= mark.elem
+
+## Abbreviation: <abbr>
+
+       abbr.elem =
+               element abbr { abbr.inner & abbr.attrs }
+       abbr.attrs =
+               (       common.attrs
+               #       abbr.attrs.title included in common.attrs
+               &       common.attrs.aria?
+               )
+       abbr.inner =
+               ( common.inner.phrasing )
+
+       common.elem.phrasing |= abbr.elem
+
+## Defining Instance: <dfn>
+
+       dfn.elem =
+               element dfn { dfn.inner & dfn.attrs }
+       dfn.attrs =
+               (       common.attrs
+               #       dfn.attrs.title included in common.attrs
+               &       common.attrs.aria?
+               )
+       dfn.inner =
+               ( common.inner.phrasing )
+
+       common.elem.phrasing |= dfn.elem
+
+## Italic: <i>
+
+       i.elem =
+               element i { i.inner & i.attrs }
+       i.attrs =
+               (       common.attrs
+               &       common.attrs.aria?
+               )
+       i.inner =
+               ( common.inner.phrasing )
+
+       common.elem.phrasing |= i.elem
+
+## Bold: <b>
+
+       b.elem =
+               element b { b.inner & b.attrs }
+       b.attrs =
+               (       common.attrs
+               &       common.attrs.aria?
+               )
+       b.inner =
+               ( common.inner.phrasing )
+
+       common.elem.phrasing |= b.elem
+
+## Struck Text: <s>
+
+       s.elem =
+               element s { s.inner & s.attrs }
+       s.attrs =
+               (       common.attrs
+               &       common.attrs.aria?
+               )
+       s.inner =
+               ( common.inner.phrasing )
+
+       common.elem.phrasing |= s.elem
+
+## Underline: <u>
+
+       u.elem =
+               element u { u.inner & u.attrs }
+       u.attrs =
+               (       common.attrs
+               &       common.attrs.aria?
+               )
+       u.inner =
+               ( common.inner.phrasing )
+
+       common.elem.phrasing |= u.elem
+
+## Code Fragment: <code>
+
+       code.elem =
+               element code { code.inner & code.attrs }
+       code.attrs =
+               (       common.attrs
+               &       common.attrs.aria?
+               )
+       code.inner =
+               ( common.inner.phrasing )
+
+       common.elem.phrasing |= code.elem
+
+## Variable or Placeholder: <var>
+
+       var.elem =
+               element var { var.inner & var.attrs }
+       var.attrs =
+               (       common.attrs
+               &       common.attrs.aria?
+               )
+       var.inner =
+               ( common.inner.phrasing )
+
+       common.elem.phrasing |= var.elem
+
+## (Sample) Output: <samp>
+
+       samp.elem =
+               element samp { samp.inner & samp.attrs }
+       samp.attrs =
+               (       common.attrs
+               &       common.attrs.aria?
+               )
+       samp.inner =
+               ( common.inner.phrasing )
+
+       common.elem.phrasing |= samp.elem
+
+## User Input: <kbd>
+
+       kbd.elem =
+               element kbd { kbd.inner & kbd.attrs }
+       kbd.attrs =
+               (       common.attrs
+               &       common.attrs.aria?
+               )
+       kbd.inner =
+               ( common.inner.phrasing )
+
+       common.elem.phrasing |= kbd.elem
+
+## Superscript: <sup>
+
+       sup.elem =
+               element sup { sup.inner & sup.attrs }
+       sup.attrs =
+               (       common.attrs
+               &       common.attrs.aria?
+               )
+       sup.inner =
+               ( common.inner.phrasing )
+
+       common.elem.phrasing |= sup.elem
+
+## Subscript: <sub>
+
+       sub.elem =
+               element sub { sub.inner & sub.attrs }
+       sub.attrs =
+               (       common.attrs
+               &       common.attrs.aria?
+               )
+       sub.inner =
+               ( common.inner.phrasing )
+
+       common.elem.phrasing |= sub.elem
+
+## Quotation: <q>
+
+       q.elem =
+               element q { q.inner & q.attrs }
+       q.attrs =
+               (       common.attrs
+               &       q.attrs.cite?
+               &       common.attrs.aria?
+               )
+               q.attrs.cite =
+                       attribute cite {
+                               common.data.uri
+                       }
+       q.inner =
+               ( common.inner.phrasing )
+
+       common.elem.phrasing |= q.elem
+
+## Title of Work: <cite>
+
+       cite.elem =
+               element cite { cite.inner & cite.attrs }
+       cite.attrs =
+               (       common.attrs
+               &       common.attrs.aria?
+               )
+       cite.inner =
+               ( common.inner.phrasing )
+
+       common.elem.phrasing |= cite.elem
+
+## Generic Span: <span>
+
+       span.elem =
+               element span { span.inner & span.attrs }
+       span.attrs =
+               (       common.attrs
+               &       common.attrs.aria?
+               )
+       span.inner =
+               ( common.inner.phrasing ) # REVISIT allow ol and ul?
+
+       common.elem.phrasing |= span.elem
+
+## Bidirectional Override: <bdo>
+
+       bdo.elem =
+               element bdo { bdo.inner & bdo.attrs }
+       bdo.attrs =
+               (       common.attrs # dir required in Schematron
+               &       (       common.attrs.aria.role.presentation
+                       |       common.attrs.aria.role.menuitem
+                       )?
+               )
+       bdo.inner =
+               ( common.inner.phrasing )
+
+       common.elem.phrasing |= bdo.elem
+
+## Bidirectional Isolate: <bdi>
+
+       bdi.elem =
+               element bdi { bdi.inner & bdi.attrs }
+       bdi.attrs =
+               (       common.attrs
+               &       (       common.attrs.aria.role.presentation
+                       |       common.attrs.aria.role.menuitem
+                       )?
+               )
+       bdi.inner =
+               ( common.inner.phrasing )
+
+       common.elem.phrasing |= bdi.elem
+
+## Line Break: <br>
+
+       br.elem =
+               element br { br.inner & br.attrs }
+       br.attrs =
+               (       common.attrs
+               &       (       common.attrs.aria.role.presentation
+                       |       common.attrs.aria.role.menuitem
+                       )?
+               )
+       br.inner =
+               ( empty )
+
+       common.elem.phrasing |= br.elem
+
+## Line-break opportunity: <wbr>
+
+       wbr.elem =
+               element wbr { wbr.inner & wbr.attrs }
+       wbr.attrs =
+               (       common.attrs
+               &       (       common.attrs.aria.role.presentation
+                       |       common.attrs.aria.role.menuitem
+                       )?
+               )
+       wbr.inner =
+               ( empty )
+
+       common.elem.phrasing |= wbr.elem
diff --git a/rdfa.rnc b/rdfa.rnc
new file mode 100644
index 0000000..3c849d9
--- /dev/null
+++ b/rdfa.rnc
@@ -0,0 +1,285 @@
+nonRDFaLite = empty
+# #####################################################################
+##  RELAX NG Schema for HTML 5: RDFa 1.1 and RDFa Lite 1.1            #
+# #####################################################################
+
+# #####################################################################
+##  RDFa Datatypes                                                    #
+# #####################################################################
+
+common.data.rdfa.safecurie =
+       xsd:string {
+               pattern = "\[(([\i-[:]][\c-[:]]*)?:?)[^\s]*\]"
+               minLength = "2"
+       }
+common.data.rdfa.curie =
+       xsd:string {
+               pattern = "(([\i-[:]][\c-[:]]*)?:)[^\s]*"
+               minLength = "1"
+       }
+common.data.rdfa.term =
+       xsd:string {
+               pattern = "[\i-[:]][/\c-[:]]*"
+       }
+
+# #####################################################################
+##  RDFa Attributes                                                   #
+# #####################################################################
+
+common.attrs.rdfa &=
+       (       common.attrs.rdfa.about?
+       &       common.attrs.rdfa.prefix?
+       &       common.attrs.rdfa.property?
+       &       common.attrs.rdfa.typeof?
+       &       common.attrs.rdfa.vocab?
+       &       common.attrs.rdfa.content?
+       &       common.attrs.rdfa.datatype?
+       &       common.attrs.rdfa.rel?
+       &       common.attrs.rdfa.resource?
+       &       common.attrs.rdfa.rev?
+       &       common.attrs.rdfa.inlist?
+       )
+       common.attrs.rdfa.prefix =
+               attribute prefix {
+                       (
+                               xsd:string {
+                                       pattern = "\s*([\i-[:]][\c-[:]]*: [^ 
]+)(\s+[\i-[:]][\c-[:]]*: [^ ]+)*\s*"
+                               }
+                               |       string ""
+                       )
+               }
+       common.attrs.rdfa.property =
+               attribute property {
+                       (
+                               list {
+                                       (       common.data.rdfa.term
+                                       |       common.data.rdfa.curie
+                                       |       common.data.uri.absolute
+                                       )+
+                               }
+                       |       string ""
+                       )
+               }
+       common.attrs.rdfa.resource =
+               attribute resource {
+                       (       common.data.rdfa.safecurie
+                       |       common.data.rdfa.curie
+                       |       common.data.uri
+                       )
+               }
+       common.attrs.rdfa.typeof =
+               attribute typeof {
+                       (
+                       list {
+                               (       common.data.rdfa.term
+                               |       common.data.rdfa.curie
+                               |       common.data.uri.absolute
+                               )+
+                       }
+                       |       string ""
+                       )
+               }
+       common.attrs.rdfa.vocab =
+               attribute vocab {
+                       (       common.data.uri.absolute
+                       |       string ""
+                       )
+               }
+       common.attrs.rdfa.about =
+               attribute about {
+                       (       common.data.rdfa.safecurie
+                       |       common.data.rdfa.curie
+                       |       common.data.uri
+                       )
+               } & nonRDFaLite
+       common.attrs.rdfa.content =
+               attribute content {
+                       string
+               } & nonRDFaLite
+       common.attrs.rdfa.datatype =
+               attribute datatype {
+                       (       common.data.rdfa.term
+                       |       common.data.rdfa.curie
+                       |       common.data.uri.absolute
+                       |       string ""
+                       )
+               } & nonRDFaLite
+       common.attrs.rdfa.rel =
+               attribute rel {
+                       (
+                               list {
+                                       (       common.data.rdfa.term
+                                       |       common.data.rdfa.curie
+                                       |       common.data.uri.absolute
+                                       )+
+                               }
+                               |       string ""
+                       )
+               } & nonRDFaLite
+       common.attrs.rdfa.rev =
+               attribute rev {
+                       (
+                               list {
+                                       (       common.data.rdfa.term
+                                       |       common.data.rdfa.curie
+                                       |       common.data.uri.absolute
+                                       )+
+                               }
+                               |       string ""
+                       )
+               } & nonRDFaLite
+       common.attrs.rdfa.inlist =
+               attribute inlist {
+                       string
+               } & nonRDFaLite
+
+common.attrs.rdfa.no-rel &=
+       (       common.attrs.rdfa.about?
+       &       common.attrs.rdfa.prefix?
+       &       common.attrs.rdfa.property?
+       &       common.attrs.rdfa.typeof?
+       &       common.attrs.rdfa.vocab?
+       &       common.attrs.rdfa.content?
+       &       common.attrs.rdfa.datatype?
+       &       common.attrs.rdfa.resource?
+       &       common.attrs.rdfa.rev?
+       &       common.attrs.rdfa.inlist?
+       )
+common.attrs.rdfa.no-rel-rev &=
+       (       common.attrs.rdfa.about?
+       &       common.attrs.rdfa.prefix?
+       &       common.attrs.rdfa.property?
+       &       common.attrs.rdfa.typeof?
+       &       common.attrs.rdfa.vocab?
+       &       common.attrs.rdfa.content?
+       &       common.attrs.rdfa.datatype?
+       &       common.attrs.rdfa.resource?
+       &       common.attrs.rdfa.inlist?
+       )
+common.attrs.rdfa.no-content-noproperty &=
+       (       common.attrs.rdfa.about?
+       &       common.attrs.rdfa.prefix?
+       &       common.attrs.rdfa.typeof?
+       &       common.attrs.rdfa.vocab?
+       &       common.attrs.rdfa.datatype?
+       &       common.attrs.rdfa.resource?
+       &       common.attrs.rdfa.inlist?
+       )
+
+common.attrs &= common.attrs.rdfa
+
+a.attrs &= common.attrs.rdfa.no-rel-rev
+area.attrs &= common.attrs.rdfa.no-rel
+base.attrs &= common.attrs.rdfa.no-rel
+
+link.rdfa.elem.metadata =
+       element link { link.inner & link.rdfa.attrs.metadata }
+link.rdfa.elem.phrasing =
+       element link { link.inner & link.rdfa.attrs.phrasing }
+link.rdfa.attrs.metadata =
+       (       common.attrs.basic
+       &       common.attrs.i18n
+       &       common.attrs.present
+       &       common.attrs.other
+       &       (       (       common.attrs.rdfa.property
+                       &       link.attrs.rel?
+                       )
+                       |
+                       (       common.attrs.rdfa.property?
+                       &       link.attrs.rel
+                       )
+               )
+       &       link.attrs.href
+       &       common.attrs.rdfa.about?
+       &       common.attrs.rdfa.prefix?
+       &       common.attrs.rdfa.typeof?
+       &       common.attrs.rdfa.vocab?
+       &       common.attrs.rdfa.content?
+       &       common.attrs.rdfa.datatype?
+       &       common.attrs.rdfa.resource?
+       &       common.attrs.rdfa.rev?
+       &       common.attrs.rdfa.inlist?
+       &       shared-hyperlink.attrs.hreflang?
+       &       shared-hyperlink.attrs.media?
+       &       shared-hyperlink.attrs.type?
+       &       link.attrs.sizes?
+       #       link.attrs.title included in common.attrs
+       &       embedded.content.attrs.crossorigin?
+       &       (       common.attrs.aria.role.link
+               |       common.attrs.aria.role.presentation
+               |       common.attrs.aria.role.menuitem
+               )?
+       )
+link.rdfa.attrs.phrasing =
+       (       common.attrs.basic
+       &       common.attrs.i18n
+       &       common.attrs.present
+       &       common.attrs.other
+       &       common.attrs.rdfa.property
+       &       link.attrs.rel?
+       &       (       (       common.attrs.rdfa.resource
+                       &       link.attrs.href?
+                       )
+                       |
+                       (       common.attrs.rdfa.resource?
+                       &       link.attrs.href
+                       )
+               )
+       &       common.attrs.rdfa.about?
+       &       common.attrs.rdfa.prefix?
+       &       common.attrs.rdfa.typeof?
+       &       common.attrs.rdfa.vocab?
+       &       common.attrs.rdfa.content?
+       &       common.attrs.rdfa.datatype?
+       &       common.attrs.rdfa.rev?
+       &       common.attrs.rdfa.inlist?
+       &       shared-hyperlink.attrs.hreflang?
+       &       shared-hyperlink.attrs.media?
+       &       shared-hyperlink.attrs.type?
+       &       link.attrs.sizes?
+       #       link.attrs.title included in common.attrs
+       &       embedded.content.attrs.crossorigin?
+       &       (       common.attrs.aria.role.link
+               |       common.attrs.aria.role.presentation
+               |       common.attrs.aria.role.menuitem
+               )?
+       )
+       common.elem.metadata |= link.rdfa.elem.metadata
+       common.elem.phrasing |= link.rdfa.elem.phrasing
+
+## <meta property=foo content=bar> in head ("name" attribute optional)
+       meta.property.elem =
+               element meta { meta.inner & meta.property.attrs }
+       meta.property.attrs =
+               (       common.attrs.basic
+               &       common.attrs.i18n
+               &       common.attrs.present
+               &       common.attrs.other
+               &       meta.name.attrs.name?
+               &       common.attrs.rdfa.property
+               &       meta.name.attrs.content
+               &       (       common.attrs.aria.role.presentation
+                       |       common.attrs.aria.role.menuitem
+                       )?
+               )
+       common.elem.metadata |= meta.property.elem
+
+## <meta property=foo content=bar> in body ("name" attribute disallowed)
+       meta.property-no-name.elem =
+               element meta { meta.inner & meta.property-no-name.attrs }
+       meta.property-no-name.attrs =
+               (       common.attrs.basic
+               &       common.attrs.i18n
+               &       common.attrs.present
+               &       common.attrs.other
+               &       common.attrs.rdfa.property
+               &       meta.name.attrs.content
+               &       (       common.attrs.aria.role.presentation
+                       |       common.attrs.aria.role.menuitem
+                       )?
+               )
+       common.elem.phrasing |= meta.property-no-name.elem
+
+meta.property.attrs &= common.attrs.rdfa.no-content-noproperty
+meta.property-no-name.attrs &= common.attrs.rdfa.no-content-noproperty
+meta.name.attrs &= common.attrs.rdfa.no-content-noproperty
diff --git a/revision.rnc b/revision.rnc
new file mode 100644
index 0000000..a357bd4
--- /dev/null
+++ b/revision.rnc
@@ -0,0 +1,54 @@
+# #####################################################################
+##  RELAX NG Schema for HTML 5: Revision Annotations                  #
+# #####################################################################
+
+## Common Attributes
+
+       edit.attrs.cite =
+               attribute cite {
+                       common.data.uri
+               }
+       edit.attrs.datetime =
+               attribute datetime {
+                       common.data.datetime | common.data.date
+               }
+
+## Inserts: <ins>
+
+       ins.elem.flow =
+               element ins { ins.inner.flow & ins.attrs }
+       ins.elem.phrasing =
+               element ins { ins.inner.phrasing & ins.attrs }
+       ins.attrs =
+               (       common.attrs
+               &       edit.attrs.cite?
+               &       edit.attrs.datetime?
+               &       common.attrs.aria?
+               )
+       ins.inner.flow =
+               ( common.inner.transparent.flow )
+       ins.inner.phrasing =
+               ( common.inner.phrasing )
+
+       common.elem.flow |= ins.elem.flow
+       common.elem.phrasing |= ins.elem.phrasing
+
+## Deletions: <del>
+
+       del.elem.flow =
+               element del { del.inner.flow & del.attrs }
+       del.elem.phrasing =
+               element del { del.inner.phrasing & del.attrs }
+       del.attrs =
+               (       common.attrs
+               &       edit.attrs.cite?
+               &       edit.attrs.datetime?
+               &       common.attrs.aria?
+               )
+       del.inner.flow =
+               ( common.inner.transparent.flow )
+       del.inner.phrasing =
+               ( common.inner.phrasing )
+
+       common.elem.flow |= del.elem.flow
+       common.elem.phrasing |= del.elem.phrasing
diff --git a/ruby.rnc b/ruby.rnc
new file mode 100644
index 0000000..cd95ff8
--- /dev/null
+++ b/ruby.rnc
@@ -0,0 +1,51 @@
+datatypes w = "http://whattf.org/datatype-draft";
+namespace local = ""
+
+# #####################################################################
+##  RELAX NG Schema for HTML 5: Ruby                                  #
+# #####################################################################
+
+#######################################################################
+
+## Ruby Annotation: <ruby>
+
+       ruby.elem =
+               element ruby { ruby.inner & ruby.attrs }
+       ruby.attrs =
+               (       common.attrs
+               &       common.attrs.aria?
+               )
+       ruby.inner =
+               (  (  common.inner.phrasing
+                  ,  (  rt.elem
+                     |  (  rp.elem
+                        ,  rt.elem
+                        ,  rp.elem
+                        )
+                     )
+                  )+
+               )
+
+       common.elem.phrasing |= ruby.elem
+
+## Ruby Text: <rt>
+
+       rt.elem =
+               element rt { rt.inner & rt.attrs }
+       rt.attrs =
+               (       common.attrs
+               &       common.attrs.aria?
+               )
+       rt.inner =
+               ( common.inner.phrasing )
+       
+## Ruby Parenthesis: <rp>
+
+       rp.elem =
+               element rp { rp.inner & rp.attrs }
+       rp.attrs =
+               (       common.attrs
+               &       common.attrs.aria?
+               )
+       rp.inner =
+               ( common.inner.phrasing )
diff --git a/sectional.rnc b/sectional.rnc
new file mode 100644
index 0000000..afbac8f
--- /dev/null
+++ b/sectional.rnc
@@ -0,0 +1,172 @@
+# #####################################################################
+##  RELAX NG Schema for HTML 5: Sectioning Markup                     #
+# #####################################################################
+
+# #####################################################################
+## Headings
+
+## Heading (Rank 1): <h1>
+
+       h1.elem =
+               element h1 { h1.inner & h1.attrs }
+       h1.attrs =
+               (       common.attrs
+               &       (       common.attrs.aria.implicit.heading
+                       |       common.attrs.aria.role.heading
+                       |       common.attrs.aria.role.tab
+                       |       common.attrs.aria.role.presentation
+                       )?
+               )
+       h1.inner =
+               ( common.inner.phrasing )
+
+       common.elem.flow |= h1.elem
+
+## Heading (Rank 2): <h2>
+
+       h2.elem =
+               element h2 { h2.inner & h2.attrs }
+       h2.attrs =
+               (       common.attrs
+               &       (       common.attrs.aria.implicit.heading
+                       |       common.attrs.aria.role.heading
+                       |       common.attrs.aria.role.tab
+                       |       common.attrs.aria.role.presentation
+                       )?
+               )
+       h2.inner =
+               ( common.inner.phrasing )
+
+       common.elem.flow |= h2.elem
+
+## Heading (Rank 3): <h3>
+
+       h3.elem =
+               element h3 { h3.inner & h3.attrs }
+       h3.attrs =
+               (       common.attrs
+               &       (       common.attrs.aria.implicit.heading
+                       |       common.attrs.aria.role.heading
+                       |       common.attrs.aria.role.tab
+                       |       common.attrs.aria.role.presentation
+                       )?
+               )
+       h3.inner =
+               ( common.inner.phrasing )
+
+       common.elem.flow |= h3.elem
+
+## Heading (Rank 4): <h4>
+
+       h4.elem =
+               element h4 { h4.inner & h4.attrs }
+       h4.attrs =
+               (       common.attrs
+               &       (       common.attrs.aria.implicit.heading
+                       |       common.attrs.aria.role.heading
+                       |       common.attrs.aria.role.tab
+                       |       common.attrs.aria.role.presentation
+                       )?
+               )
+       h4.inner =
+               ( common.inner.phrasing )
+
+       common.elem.flow |= h4.elem
+
+## Heading (Rank 5): <h5>
+
+       h5.elem =
+               element h5 { h5.inner & h5.attrs }
+       h5.attrs =
+               (       common.attrs
+               &       (       common.attrs.aria.implicit.heading
+                       |       common.attrs.aria.role.heading
+                       |       common.attrs.aria.role.tab
+                       |       common.attrs.aria.role.presentation
+                       )?
+               )
+       h5.inner =
+               ( common.inner.phrasing )
+
+       common.elem.flow |= h5.elem
+
+## Heading (Rank 6): <h6>
+
+       h6.elem =
+               element h6 { h6.inner & h6.attrs }
+       h6.attrs =
+               (       common.attrs
+               &       (       common.attrs.aria.implicit.heading
+                       |       common.attrs.aria.role.heading
+                       |       common.attrs.aria.role.tab
+                       |       common.attrs.aria.role.presentation
+                       )?
+               )
+       h6.inner =
+               ( common.inner.phrasing )
+
+       common.elem.flow |= h6.elem
+
+## Heading Group: <hgroup>
+
+       hgroup.elem =
+               element hgroup { hgroup.inner & hgroup.attrs } & nonW3C
+       hgroup.attrs =
+               (       common.attrs
+               &       (       common.attrs.aria.implicit.heading
+                       |       common.attrs.aria.role.heading
+                       |       common.attrs.aria.role.tab
+                       |       common.attrs.aria.role.presentation
+                       )?
+               )
+       hgroup.inner =
+               (       (       h1.elem
+                       |       h2.elem
+                       |       h3.elem
+                       |       h4.elem
+                       |       h5.elem
+                       |       h6.elem
+                       )
+                       &       common.elem.script-supporting*
+               )+
+
+       common.elem.flow |= hgroup.elem
+
+# #####################################################################
+## Section Meta
+
+## Contact Info: <address>
+
+       address.elem =
+               element address { address.inner & address.attrs }
+       address.attrs =
+               (       common.attrs
+               &       (       common.attrs.aria.role.contentinfo
+                       |       common.attrs.aria.role.presentation
+                       )?
+               )
+       address.inner = 
+               ( common.inner.flow )
+
+       common.elem.flow |= address.elem
+
+# #####################################################################
+## Quotations  
+
+## Block Quotes: <blockquote>
+
+       blockquote.elem =
+               element blockquote { blockquote.inner & blockquote.attrs }
+       blockquote.attrs =
+               (       common.attrs
+               &       blockquote.attrs.cite?
+               &       common.attrs.aria?
+               )
+               blockquote.attrs.cite =
+                       attribute cite {
+                               common.data.uri
+                       }
+       blockquote.inner =
+               ( common.inner.flow )
+
+       common.elem.flow |= blockquote.elem
diff --git a/structural.rnc b/structural.rnc
new file mode 100644
index 0000000..9e72b5f
--- /dev/null
+++ b/structural.rnc
@@ -0,0 +1,135 @@
+# #####################################################################
+##  RELAX NG Schema for HTML 5: Block Markup Added in HTML5           #
+# #####################################################################
+
+## Section: <section>
+
+       section.elem =
+               element section { section.inner & section.attrs }
+       section.attrs =
+               (       common.attrs
+               &       (       common.attrs.aria.implicit.region
+                       |       common.attrs.aria.role.alert
+                       |       common.attrs.aria.role.alertdialog
+                       |       common.attrs.aria.role.contentinfo
+                       |       common.attrs.aria.role.dialog
+                       |       common.attrs.aria.role.log
+                       |       common.attrs.aria.role.marquee
+                       |       common.attrs.aria.role.region
+                       |       common.attrs.aria.role.status
+                       |       common.attrs.aria.role.presentation
+                       |       common.attrs.aria.landmark.application
+                       |       common.attrs.aria.landmark.document
+                       |       common.attrs.aria.landmark.main
+                       |       common.attrs.aria.landmark.search
+                       )?
+               )
+       section.inner =
+               ( common.inner.flow )
+
+       common.elem.flow |= section.elem
+
+## Navigational Links: <nav>
+
+       nav.elem =
+               element nav { nav.inner & nav.attrs }
+       nav.attrs =
+               (       common.attrs
+               &       (       common.attrs.aria.implicit.navigation
+                       |       common.attrs.aria.landmark.navigation
+                       |       common.attrs.aria.role.menuitem
+                       |       common.attrs.aria.role.presentation
+                       )?
+               )
+       nav.inner =
+               ( common.inner.flow )
+
+       common.elem.flow |= nav.elem
+
+## Article: <article>
+
+       article.elem =
+               element article { article.inner & article.attrs }
+       article.attrs =
+               (       common.attrs
+               &       (       common.attrs.aria.implicit.article
+                       |       common.attrs.aria.landmark.article
+                       |       common.attrs.aria.landmark.document
+                       |       common.attrs.aria.landmark.application
+                       |       common.attrs.aria.landmark.main
+                       |       common.attrs.aria.role.presentation
+                       )?
+               )
+       article.inner =
+               (       style.elem*
+               ,       common.inner.flow 
+               )
+               
+       common.elem.flow |= article.elem
+
+## Tangential Aside: <aside>
+
+       aside.elem =
+               element aside { aside.inner & aside.attrs }
+       aside.attrs =
+               (       common.attrs
+               &       (       common.attrs.aria.implicit.complementary
+                       |       common.attrs.aria.landmark.note
+                       |       common.attrs.aria.landmark.complementary
+                       |       common.attrs.aria.landmark.search
+                       |       common.attrs.aria.role.presentation
+                       )?
+               )
+       aside.inner =
+               (       style.elem*
+               ,       common.inner.flow 
+               )
+
+       common.elem.flow |= aside.elem
+
+## Header: <header>
+
+       header.elem =
+               element header { header.inner & header.attrs }
+       header.attrs =
+               (       common.attrs
+               &       (       common.attrs.aria.implicit.banner
+                       |       common.attrs.aria.landmark.banner
+                       |       common.attrs.aria.role.presentation
+                       )?
+               )
+       header.inner =
+               ( common.inner.flow )
+
+       common.elem.flow |= header.elem
+
+## Footer: <footer>
+
+       footer.elem =
+               element footer { footer.inner & footer.attrs }
+       footer.attrs =
+               (       common.attrs
+               &       (       common.attrs.aria.implicit.contentinfo
+                       |       common.attrs.aria.landmark.contentinfo
+                       |       common.attrs.aria.role.presentation
+                       )?
+               )
+       footer.inner =
+               ( common.inner.flow )
+
+       common.elem.flow |= footer.elem
+
+## main content: <main>
+
+       main.elem =
+               element main { main.inner & main.attrs }
+       main.attrs =
+               (       common.attrs
+               &       (       common.attrs.aria.implicit.main
+                       |       common.attrs.aria.landmark.main
+                       )?
+               )
+       main.inner =
+               ( common.inner.flow )
+
+       common.elem.flow |= main.elem
diff --git a/tables.rnc b/tables.rnc
new file mode 100644
index 0000000..b6021da
--- /dev/null
+++ b/tables.rnc
@@ -0,0 +1,244 @@
+datatypes w = "http://whattf.org/datatype-draft";
+
+# #####################################################################
+##  RELAX NG Schema for HTML 5: Tables                                #
+# #####################################################################
+
+# #####################################################################
+## Table Envelope
+
+## Table Datatypes
+
+#      tables.data.multilen =
+#              (       common.data.integer.positive
+#              |       common.data.percent
+#              |       xsd:token { pattern = "[0-9]+\*" } #REVISIT should this 
one be string? 
+#              )
+
+## Table Alignment Attributes
+
+       tables.attrs.alignment =
+               (       tables.attrs.align?
+               &       tables.attrs.char?
+               &       tables.attrs.valign?
+               )
+               tables.attrs.align =
+                       attribute align {
+                               (       w:string "left" 
+                               |       w:string "center"
+                               |       w:string "right"
+                               |       w:string "justify"
+                               |       w:string "char"
+                               )
+                       }
+               tables.attrs.char =
+                       attribute char {
+                               xsd:string { pattern = "." }
+                       }
+               tables.attrs.valign =
+                       attribute valign {
+                               (       w:string "top"
+                               |       w:string "middle"
+                               |       w:string "bottom"
+                               |       w:string "baseline"
+                               )
+                       }
+
+## Data Table: <table>
+
+       table.elem =
+               element table { table.inner & table.attrs }
+       table.attrs =
+               (       common.attrs
+               &       common.attrs.aria?
+               )
+       table.inner =
+               (       caption.elem?
+               ,       common.elem.script-supporting*
+               ,       colgroup.elem*
+               ,       common.elem.script-supporting*
+               ,       thead.elem?
+               ,       common.elem.script-supporting*
+               ,       (       (       tfoot.elem
+                               ,       common.elem.script-supporting*
+                               ,       ( tbody.elem* | tr.elem+ )
+                               ,       common.elem.script-supporting*
+                               )
+                       |       (       ( tbody.elem* | tr.elem+ )
+                               ,       common.elem.script-supporting*
+                               ,       tfoot.elem?
+                               )
+                       )
+               ) 
+
+       common.elem.flow |= table.elem
+
+## Table Caption: <caption>
+
+       caption.elem =
+               element caption { caption.inner & caption.attrs }
+       caption.attrs =
+               (       common.attrs
+               &       common.attrs.aria?
+               )
+       caption.inner =
+               ( common.inner.flow )
+
+# #####################################################################
+## Table Super Structure
+
+## Table Column Group: <colgroup>
+
+       colgroup.elem =
+               element colgroup { colgroup.inner & colgroup.attrs }
+       colgroup.attrs =
+               (       common.attrs
+               &       common.attrs.aria?
+               )
+               colgroup.attrs.span =
+                       attribute span {
+                               common.data.integer.positive
+                       }
+       colgroup.inner =
+               (       (       col.elem*
+                       &       common.elem.script-supporting*
+                       )
+                       |       colgroup.attrs.span?
+               )
+
+## Table Column: <col>
+
+       col.elem =
+               element col { col.inner & col.attrs }
+       col.attrs =
+               (       common.attrs
+               &       col.attrs.span?
+               &       common.attrs.aria?
+               )
+               col.attrs.span =
+                       attribute span {
+                               common.data.integer.positive
+                       }
+       col.inner =
+               ( empty )
+
+## Table Header Row Group
+
+       thead.elem =
+               element thead { thead.inner & thead.attrs }
+       thead.attrs =
+               (       common.attrs
+               &       common.attrs.aria?
+               )
+       thead.inner =
+               (       tr.elem*
+               &       common.elem.script-supporting*
+               )
+
+## Table Footer Row Group
+
+       tfoot.elem =
+               element tfoot { tfoot.inner & tfoot.attrs }
+       tfoot.attrs =
+               (       common.attrs
+               &       common.attrs.aria?
+               )
+       tfoot.inner =
+               (       tr.elem*
+               &       common.elem.script-supporting*
+               )
+
+## Table Row Group
+
+       tbody.elem =
+               element tbody { tbody.inner & tbody.attrs }
+       tbody.attrs =
+               (       common.attrs
+               &       common.attrs.aria?
+               )
+       tbody.inner =
+               (       tr.elem*
+               &       common.elem.script-supporting*
+               )
+
+# #####################################################################
+## Cell Structure
+
+## Table Row
+
+       tr.elem =
+               element tr { tr.inner & tr.attrs }
+       tr.attrs =
+               (       common.attrs
+               &       common.attrs.aria?
+               )
+       tr.inner =
+               ( ( td.elem | th.elem | common.elem.script-supporting )* )
+
+## Common Table Cell Attributes
+
+       tables.attrs.cell-structure =
+               (       tables.attrs.colspan?
+               &       tables.attrs.rowspan?
+               )
+               tables.attrs.colspan =
+                       attribute colspan {
+                               common.data.integer.positive
+                       }
+               tables.attrs.rowspan =
+                       attribute rowspan {
+                               common.data.integer.non-negative
+                       }
+
+       tables.attrs.access-headers =
+               ( tables.attrs.headers? )
+               tables.attrs.headers =
+                       attribute headers {
+                               common.data.idrefs
+                       }
+
+       tables.attrs.define-headers =
+               ( tables.attrs.scope? )
+               tables.attrs.scope =
+                       attribute scope {
+                               (       w:string "row"
+                               |       w:string "col"
+                               |       w:string "rowgroup"
+                               |       w:string "colgroup"
+                               )
+                       }
+               tables.attrs.abbr =
+                       attribute abbr {
+                               text
+                       }
+
+## Table Data Cell: <td>
+
+       td.elem =
+               element td { td.inner & td.attrs }
+       td.attrs =
+               (       common.attrs
+               &       tables.attrs.cell-structure
+               &       tables.attrs.headers?
+#              &       tables.attrs.alignment
+               &       common.attrs.aria?
+               )
+       td.inner =
+               ( common.inner.flow )
+
+## Table Header Cells: <th>
+
+       th.elem =
+               element th { th.inner & th.attrs }
+       th.attrs =
+               (       common.attrs
+               &       tables.attrs.cell-structure
+               &       tables.attrs.scope?
+               &       tables.attrs.headers?
+#              &       tables.attrs.alignment
+               &       (       common.attrs.aria?
+                       |       common.attrs.aria.implicit.column-or-row-header
+                       )
+               )
+       th.inner =
+               ( common.inner.flow )
diff --git a/web-components.rnc b/web-components.rnc
new file mode 100644
index 0000000..bf45715
--- /dev/null
+++ b/web-components.rnc
@@ -0,0 +1,43 @@
+datatypes w = "http://whattf.org/datatype-draft";
+
+# #####################################################################
+##  RELAX NG Schema for HTML 5: Web Components
+# #####################################################################
+
+## Templates: <template>
+
+       template.elem =
+               element template { template.inner & template.attrs }
+       template.attrs =
+               ( common.attrs )
+       template.inner =
+               (       common.inner.metadata
+               |       common.inner.flow
+               |       ol.inner
+               |       ul.inner
+               |       dl.inner
+               |       figure.inner
+               |       ruby.inner
+               |       object.inner.flow
+               |       object.inner.phrasing
+               |       video.inner.flow
+               |       video.inner.phrasing
+               |       audio.inner.flow
+               |       audio.inner.phrasing
+               |       table.inner
+               |       colgroup.inner
+               |       thead.inner
+               |       tbody.inner
+               |       tfoot.inner
+               |       tr.inner
+               |       fieldset.inner
+               |       select.inner
+               |       details.inner
+               |       menu.popup.inner
+               )
+       common.elem.metadata |= template.elem
+       common.elem.phrasing |= template.elem
+       common.elem.script-supporting |= template.elem
+
+# also allow <script> wherever <template> is allowed
+       common.elem.script-supporting |= script.elem
diff --git a/web-forms-scripting.rnc b/web-forms-scripting.rnc
new file mode 100644
index 0000000..63fe1c4
--- /dev/null
+++ b/web-forms-scripting.rnc
@@ -0,0 +1,27 @@
+# #####################################################################
+##  RELAX NG Schema for HTML 5: Web Forms 1.0 Scripting               #
+# #####################################################################
+
+       scripting.attr.form.select =
+               attribute onselect { string }
+       scripting.attr.form.change =
+               attribute onchange { string }
+
+#      input.text.attrs &=
+#              (       scripting.attr.form.select?
+#              )
+
+#      shared-form.attrs &=
+#              (       scripting.attr.form.change?
+#              )
+
+#      form.attrs &=
+#              (       scripting.attr.form.reset?
+#              &       scripting.attr.form.submit?
+#              )
+               scripting.attr.form.submit =
+                       attribute onsubmit { string }
+               scripting.attr.form.reset =
+                       attribute onreset { string } 
+               
+               
diff --git a/web-forms.rnc b/web-forms.rnc
new file mode 100644
index 0000000..f786a1b
--- /dev/null
+++ b/web-forms.rnc
@@ -0,0 +1,604 @@
+datatypes w = "http://whattf.org/datatype-draft";
+
+# #####################################################################
+##  RELAX NG Schema for HTML 5: Web Forms 1.0 markup                  #
+# #####################################################################
+
+## Shared attributes for form controls
+
+       common-form.attrs =
+               (       common-form.attrs.name?
+               &       common-form.attrs.disabled?
+               )
+               
+       common-form.attrs.name = 
+               attribute name {
+                       string #REVISIT should this be restricted somehow? No & 
and = perhaps?
+               }
+
+       common-form.attrs.disabled = 
+               attribute disabled {
+                       w:string "disabled" | w:string ""
+               }
+
+       shared-form.attrs.readonly = 
+               attribute readonly {
+                       w:string "readonly" | w:string ""
+               }
+
+       shared-form.attrs.maxlength = 
+               attribute maxlength {
+                       common.data.integer.non-negative
+               }
+
+       shared-form.attrs.size = 
+               attribute size {
+                       common.data.integer.positive
+               }
+       
+       # REVISIT tabindex goes in common.attrs
+
+## Shared attributes for <input>
+       
+       input.attrs.checked = 
+               attribute checked {
+                       w:string "checked" | w:string ""
+               }
+
+## Text Field: <input type='text'>
+
+       input.text.elem = 
+               element input { input.text.attrs }
+       input.text.attrs = 
+               (       common.attrs
+               &       common-form.attrs
+               &       input.text.attrs.type?
+               &       shared-form.attrs.maxlength? 
+               &       shared-form.attrs.readonly?
+               &       shared-form.attrs.size?
+               &       input.text.attrs.value? 
+               &       (       common.attrs.aria.implicit.textbox
+                       |       common.attrs.aria.implicit.combobox
+                       |       common.attrs.aria.role.textbox
+                       |       common.attrs.aria.role.combobox
+                       )?
+               )
+               input.text.attrs.type = 
+                       attribute type {
+                               w:string "text"
+                       }
+               input.text.attrs.value =
+                       attribute value {
+                               form.data.stringwithoutlinebreaks
+                       }
+               
+       input.elem = input.text.elem
+
+## Password Field: <input type='password'>
+
+       input.password.elem = 
+               element input { input.password.attrs }
+       input.password.attrs = 
+               (       common.attrs
+               &       common-form.attrs
+               &       input.password.attrs.type
+               &       shared-form.attrs.maxlength? 
+               &       shared-form.attrs.readonly? 
+               &       shared-form.attrs.size?
+               &       input.password.attrs.value? 
+               &       (       common.attrs.aria.implicit.textbox
+                       |       common.attrs.aria.role.textbox
+                       )?
+               )
+               input.password.attrs.type = 
+                       attribute type {
+                               w:string "password"
+                       }
+               input.password.attrs.value =
+                       attribute value {
+                               form.data.stringwithoutlinebreaks
+                       }
+               
+       input.elem |= input.password.elem
+               
+## Checkbox: <input type='checkbox'>
+
+       input.checkbox.elem = 
+               element input { input.checkbox.attrs }
+       input.checkbox.attrs = 
+               (       common.attrs
+               &       common-form.attrs
+               &       input.checkbox.attrs.type
+               &       input.attrs.checked? 
+               &       input.checkbox.attrs.value? 
+               &       (       common.attrs.aria.implicit.checkbox
+                       |       common.attrs.aria.role.checkbox
+                       |       common.attrs.aria.role.menuitemcheckbox
+                       )?
+               )
+               input.checkbox.attrs.type = 
+                       attribute type {
+                               w:string "checkbox"
+                       }
+               input.checkbox.attrs.value =
+                       attribute value {
+                               string #REVISIT require non-empty value?
+                       }
+               
+       input.elem |= input.checkbox.elem
+       
+## Radiobutton: <input type='radio'>
+
+       input.radio.elem = 
+               element input { input.radio.attrs }
+       input.radio.attrs = 
+               (       common.attrs
+               &       common-form.attrs
+               &       input.radio.attrs.type
+               &       input.attrs.checked? 
+               &       input.radio.attrs.value? 
+               &       (       common.attrs.aria.implicit.radio
+                       |       common.attrs.aria.role.radio
+                       |       common.attrs.aria.role.menuitemradio
+                       )?
+               )
+               input.radio.attrs.type = 
+                       attribute type {
+                               w:string "radio"
+                       }
+               input.radio.attrs.value =
+                       attribute value {
+                               string #REVISIT require non-empty value?
+                       }
+               
+       input.elem |= input.radio.elem
+       
+## Scripting Hook Button: <input type='button'>
+
+       input.button.elem = 
+               element input { input.button.attrs }
+       input.button.attrs = 
+               (       common.attrs
+               &       common-form.attrs
+               &       input.button.attrs.type
+               &       input.button.attrs.value? 
+               &       (       common.attrs.aria.implicit.button
+                       |       common.attrs.aria.role.button
+                       |       common.attrs.aria.role.link
+                       |       common.attrs.aria.role.menuitem
+                       |       common.attrs.aria.role.menuitemcheckbox
+                       |       common.attrs.aria.role.menuitemradio
+                       |       common.attrs.aria.role.radio
+                       )?
+               )
+               input.button.attrs.type = 
+                       attribute type {
+                               w:string "button"
+                       }
+               input.button.attrs.value =
+                       attribute value {
+                               string #REVISIT require non-empty value?
+                       }
+               
+       input.elem |= input.button.elem
+       #REVISIT should this be enabled by a scripting module only?
+       
+## Submit Button: <input type='submit'>
+
+       input.submit.elem = 
+               element input { input.submit.attrs }
+       input.submit.attrs = 
+               (       common.attrs
+               &       common-form.attrs
+               &       input.submit.attrs.type
+               &       input.submit.attrs.value? 
+               &       (       common.attrs.aria.implicit.button
+                       |       common.attrs.aria.role.button
+                       )?
+               )
+               input.submit.attrs.type = 
+                       attribute type {
+                               w:string "submit"
+                       }
+               input.submit.attrs.value =
+                       attribute value {
+                               string #REVISIT require non-empty value?
+                       }
+               
+       input.elem |= input.submit.elem
+               
+## Reset Button: <input type='reset'>
+
+       input.reset.elem = 
+               element input { input.reset.attrs }
+       input.reset.attrs = 
+               (       common.attrs
+               &       common-form.attrs
+               &       input.reset.attrs.type
+               &       input.reset.attrs.value? 
+               &       (       common.attrs.aria.implicit.button
+                       |       common.attrs.aria.role.button
+                       )?
+               )
+               input.reset.attrs.type = 
+                       attribute type {
+                               w:string "reset"
+                       }
+               input.reset.attrs.value =
+                       attribute value {
+                               string #REVISIT require non-empty value?
+                       }
+               
+       input.elem |= input.reset.elem
+       # REVISIT does reset make sense outside a form?
+               
+## File Upload: <input type='file'>
+
+       input.file.elem = 
+               element input { input.file.attrs }
+       input.file.attrs = 
+               (       common.attrs
+               &       common-form.attrs
+               &       input.file.attrs.type
+               &       input.file.attrs.accept?
+               &       common.attrs.aria?
+               )
+               input.file.attrs.type = 
+                       attribute type {
+                               w:string "file"
+                       }
+               input.file.attrs.accept = 
+                       attribute accept {
+                               form.data.mimetypelist
+                       }
+
+       input.elem |= input.file.elem
+       
+## Hidden String: <input type='hidden'>
+
+       input.hidden.elem = 
+               element input { input.hidden.attrs }
+       input.hidden.attrs = 
+               (       common.attrs
+               &       common-form.attrs
+               &       input.hidden.attrs.type
+               &       input.hidden.attrs.value? 
+               &       common.attrs.aria?
+               )
+               input.hidden.attrs.type = 
+                       attribute type {
+                               w:string "hidden"
+                       }
+               input.hidden.attrs.value =
+                       attribute value {
+                               string
+                       }
+               
+       input.elem |= input.hidden.elem
+               
+## Image Submit Button: <input type='image'>
+
+       input.image.elem = 
+               element input { input.image.attrs }
+       input.image.attrs = 
+               (       common.attrs
+               &       common-form.attrs
+               &       input.image.attrs.type
+               &       input.image.attrs.alt 
+               &       input.image.attrs.src? 
+               &       (       common.attrs.aria.implicit.button
+                       |       common.attrs.aria.role.button
+                       |       common.attrs.aria.role.link
+                       |       common.attrs.aria.role.menuitem
+                       |       common.attrs.aria.role.menuitemcheckbox
+                       |       common.attrs.aria.role.menuitemradio
+                       |       common.attrs.aria.role.radio
+                       )?
+               )       
+               input.image.attrs.type = 
+                       attribute type {
+                               w:string "image"
+                       }
+               input.image.attrs.alt = 
+                       attribute alt {
+                               form.data.nonemptystring
+                       }
+               input.image.attrs.src = 
+                       attribute src {
+                               common.data.uri.non-empty
+                       }
+       
+       input.elem |= input.image.elem
+       
+       common.elem.phrasing |= input.elem
+
+## Text Area: <textarea>
+
+       textarea.elem =
+               element textarea { textarea.inner & textarea.attrs }
+       textarea.attrs =
+               (       common.attrs
+               &       common-form.attrs
+               &       shared-form.attrs.readonly?
+               &       textarea.attrs.rows-and-cols-wf1
+               &       (       common.attrs.aria.implicit.textbox
+                       |       common.attrs.aria.role.presentation
+                       |       common.attrs.aria.role.menuitem
+                       |       common.attrs.aria.role.textbox
+                       )?
+               #FIXME onfocus, onblur, onselect,onchange
+               )
+               # This is ugly. 
+               textarea.attrs.rows-and-cols-wf1 = 
+                       textarea.attrs.rows-and-cols-wf1.inner  
+               textarea.attrs.rows-and-cols-wf1.inner =
+                       (       textarea.attrs.cols
+                       &       textarea.attrs.rows
+                       )
+               textarea.attrs.cols = 
+                       attribute cols {
+                               common.data.integer.positive
+                       }
+               textarea.attrs.rows = 
+                       attribute rows {
+                               common.data.integer.positive
+                       }
+       textarea.inner =
+               ( text )
+
+       common.elem.phrasing |= textarea.elem
+
+# 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.
+
+## Select menu option: <option selected>
+
+       option.elem =
+               element option { option.inner & option.attrs }
+       option.attrs =
+               (       common.attrs
+               &       common-form.attrs.disabled?
+               &       option.attrs.selected?
+               &       option.attrs.label?
+               &       option.attrs.value?
+               &       (       common.attrs.aria.implicit.option
+                       |       common.attrs.aria.role.option
+                       |       common.attrs.aria.role.menuitem
+                       |       common.attrs.aria.role.menuitemradio
+                       |       common.attrs.aria.role.menuitemcheckbox
+                       |       common.attrs.aria.role.presentation
+                       )?
+               )
+               option.attrs.selected =
+                       attribute selected {
+                               w:string "selected" | w:string ""
+                       }
+               option.attrs.label =
+                       attribute label {
+                               form.data.nonemptystring
+                       }               
+               option.attrs.value =
+                       attribute value {
+                               string
+                       }               
+       option.inner =
+               ( text )
+
+## Option Group: <optgroup>
+
+       optgroup.elem =
+               element optgroup { optgroup.inner & optgroup.attrs }
+       optgroup.attrs = 
+               (       common.attrs
+               &       optgroup.attrs.label
+               &       common-form.attrs.disabled?
+               &       (       common.attrs.aria.role.presentation
+                       |       common.attrs.aria.role.menuitem
+                       )?
+               )
+               optgroup.attrs.label =
+                       attribute label {
+                               string
+                       }
+       optgroup.inner =
+               (       option.elem*
+               &       common.elem.script-supporting*
+               )
+
+## Selection Menu: <select>
+
+       select.elem =
+               element select { select.inner & select.attrs }
+       select.attrs =
+               (       common.attrs
+               &       common-form.attrs
+               &       select.attrs.size?
+               &       select.attrs.multiple?
+               # FIXME onfocus, onblur, onchange
+               &       (       common.attrs.aria.implicit.listbox
+                       |       common.attrs.aria.role.listbox # 
aria-multiselectable depends on "multiple" value; check in assertions
+                       |       common.attrs.aria.role.menu
+                       |       common.attrs.aria.role.presentation
+                       |       common.attrs.aria.role.menuitem
+                       )?
+               )
+               select.attrs.size =
+                       attribute size {
+                               common.data.integer.positive
+                       }
+               select.attrs.multiple =
+                       attribute multiple {
+                               w:string "multiple" | w:string ""
+                       }
+       select.inner =
+               (       optgroup.elem*
+               &       option.elem*
+               &       common.elem.script-supporting*
+               )
+
+       common.elem.phrasing |= select.elem
+       
+## Shared Definitions for Complex Button
+       
+       button.attrs.value =
+               attribute value {
+                       string
+               }
+       button.inner = 
+               ( common.inner.phrasing )
+       
+## Complex Submit Button: <button type='submit'>
+
+       button.submit.elem =
+               element button { button.inner & button.submit.attrs }   
+       button.submit.attrs =
+               (       common.attrs
+               &       common-form.attrs
+               &       button.submit.attrs.type?
+               &       button.attrs.value?
+               &       (       common.attrs.aria.implicit.button
+                       |       common.attrs.aria.role.button
+                       |       common.attrs.aria.role.link
+                       |       common.attrs.aria.role.menuitem
+                       |       common.attrs.aria.role.menuitemcheckbox
+                       |       common.attrs.aria.role.menuitemradio
+                       |       common.attrs.aria.role.radio
+                       )?
+               )
+               button.submit.attrs.type =
+                       attribute type {
+                               w:string "submit"
+                       }
+
+       button.elem = button.submit.elem
+       
+## Complex Reset Button: <button type='reset'>
+
+       button.reset.elem =
+               element button { button.inner & button.reset.attrs }    
+       button.reset.attrs =
+               (       common.attrs
+               &       common-form.attrs
+               &       button.reset.attrs.type
+               &       button.attrs.value? #REVISIT I guess this still affects 
the DOM
+               &       (       common.attrs.aria.implicit.button
+                       |       common.attrs.aria.role.button
+                       |       common.attrs.aria.role.link
+                       |       common.attrs.aria.role.menuitem
+                       |       common.attrs.aria.role.menuitemcheckbox
+                       |       common.attrs.aria.role.menuitemradio
+                       |       common.attrs.aria.role.radio
+                       )?
+               )
+               button.reset.attrs.type =
+                       attribute type {
+                               w:string "reset"
+                       }
+
+       button.elem |= button.reset.elem
+       
+## Complex Push Button: <button type='button'>
+
+       button.button.elem =
+               element button { button.inner & button.button.attrs }   
+       button.button.attrs =
+               (       common.attrs
+               &       common-form.attrs
+               &       button.button.attrs.type
+               &       button.attrs.value? #REVISIT I guess this still affects 
the DOM
+               &       (       common.attrs.aria.implicit.button
+                       |       common.attrs.aria.role.button
+                       |       common.attrs.aria.role.link
+                       |       common.attrs.aria.role.menuitem
+                       |       common.attrs.aria.role.menuitemcheckbox
+                       |       common.attrs.aria.role.menuitemradio
+                       |       common.attrs.aria.role.radio
+                       )?
+               )
+               button.button.attrs.type =
+                       attribute type {
+                               w:string "button"
+                       }
+
+       button.elem |= button.button.elem
+
+       common.elem.phrasing |= button.elem
+
+## Form: <form>
+
+       form.elem =
+               element form { form.inner & form.attrs }
+       form.attrs =
+               (       common.attrs
+               &       form.attrs.action? #REVISIT Should this be required 
anyway?
+               &       form.attrs.method?
+               &       form.attrs.enctype?
+               &       common-form.attrs.name?
+               &       form.attrs.accept-charset?
+               &       common.attrs.aria?
+               )
+               form.attrs.action =
+                       attribute action {
+                               common.data.uri.non-empty
+                       }
+               form.attrs.method =
+                       attribute method {
+                               form.attrs.method.data
+                       }
+                       form.attrs.method.data = 
+                               ( w:string "get" | w:string "post" )
+               form.attrs.enctype =
+                       attribute enctype {
+                               form.attrs.enctype.data
+                       }
+                       form.attrs.enctype.data = 
+                               (       w:string 
"application/x-www-form-urlencoded" 
+                               |       w:string "multipart/form-data"
+                               )
+               form.attrs.accept-charset =
+                       attribute accept-charset {
+                               form.data.charsetlist
+                       }       
+       form.inner =
+               ( common.inner.flow )
+
+       common.elem.flow |= form.elem
+
+## Fieldset: <fieldset>
+
+       fieldset.elem =
+               element fieldset { fieldset.inner & fieldset.attrs }
+       fieldset.attrs =
+               (       common.attrs
+               &       (       common.attrs.aria.implicit.group
+                       |       common.attrs.aria
+                       )?
+               )
+       fieldset.inner =
+               (       legend.elem? #REVISIT should this be required?
+               ,       common.inner.flow
+               )
+
+       common.elem.flow |= fieldset.elem
+       
+## Label: <label>
+
+       label.elem =
+               element label { label.inner & label.attrs }
+       label.attrs =
+               (       common.attrs
+               &       label.attrs.for?
+               &       (       common.attrs.aria.role.presentation
+                       |       common.attrs.aria.role.menuitem
+                       )?
+               )
+               label.attrs.for =
+                       attribute for {
+                               common.data.idref
+                       }
+       label.inner =
+               ( common.inner.phrasing ) #REVISIT making obvious guess
+
+       common.elem.phrasing |= label.elem
+
diff --git a/web-forms2-scripting.rnc b/web-forms2-scripting.rnc
new file mode 100644
index 0000000..e0f6a38
--- /dev/null
+++ b/web-forms2-scripting.rnc
@@ -0,0 +1,9 @@
+# #####################################################################
+##  RELAX NG Schema for HTML 5: Web Forms 2.0 Scripting               #
+# #####################################################################
+
+#      output.attrs &=
+#              (       scripting.attr.form.formchange?
+#              &       scripting.attr.form.forminput?
+#              &       scripting.attr.form.change?
+#              )
diff --git a/web-forms2.rnc b/web-forms2.rnc
new file mode 100644
index 0000000..e83c399
--- /dev/null
+++ b/web-forms2.rnc
@@ -0,0 +1,830 @@
+datatypes w = "http://whattf.org/datatype-draft";
+
+# #####################################################################
+##  RELAX NG Schema for HTML 5: Web Forms 2.0 markup                  #
+# #####################################################################
+
+## Shared attributes for form controls
+
+       common-form.attrs &=
+               ( common-form.attrs.form? )
+
+       common-form.attrs.form |= 
+               attribute form {
+                       common.data.idref
+               }
+
+       shared-form.attrs.formaction =
+               attribute formaction {
+                       common.data.uri.non-empty
+               }
+
+       shared-form.attrs.formenctype =
+               attribute formenctype {
+                       shared-form.attrs.formenctype.data
+               }
+               shared-form.attrs.formenctype.data = 
+                       (       w:string "application/x-www-form-urlencoded" 
+                       |       w:string "multipart/form-data"
+                       |       w:string "text/plain"
+                       )
+
+       shared-form.attrs.formmethod =
+               attribute formmethod {
+                       shared-form.attrs.formmethod.data
+               }
+               shared-form.attrs.formmethod.data = 
+                       ( w:string "get"
+                       | w:string "post"
+                       )
+
+       shared-form.attrs.formtarget = 
+               attribute formtarget {
+                       common.data.browsing-context-or-keyword
+               }
+
+       shared-form.attrs.formnovalidate = 
+               attribute formnovalidate {
+                       w:string "formnovalidate" | w:string ""
+               }
+
+       shared-form.attrs.autofocus = 
+               attribute autofocus {
+                       w:string "autofocus" | w:string ""
+               }
+       
+       shared-form.attrs.pattern = 
+               attribute pattern {
+                       form.data.pattern
+               }
+
+       shared-form.attrs.template = 
+               attribute template {
+                       common.data.idref
+               }
+
+       shared-form.attrs.required = 
+               attribute required {
+                       w:string "required" | w:string ""
+               }
+
+       shared-form.attrs.placeholder = 
+               attribute placeholder {
+                       form.data.stringwithoutlinebreaks
+               }
+
+       shared-form.attrs.dirname = 
+               attribute dirname {
+                       form.data.nonemptystring
+               }
+
+## Shared attributes for <input>
+               
+       input.attrs.autocomplete = 
+               attribute autocomplete {
+                       w:string "on" | w:string "off"
+               }
+       
+       input.attrs.list = 
+               attribute list {
+                       common.data.idref
+               }
+       
+       input.attrs.step.float = 
+               attribute step {
+                       w:string "any" | common.data.float.positive
+               }
+       
+       input.attrs.step.integer = 
+               attribute step {
+                       w:string "any" | common.data.integer.positive 
+               }
+       
+       input.attrs.multiple = 
+               attribute multiple {
+                       w:string "multiple" | w:string ""
+               }
+               
+## Text Field: <input type='text'>, Extensions
+
+       input.text.attrs &=
+               (       input.attrs.autocomplete? 
+               &       shared-form.attrs.autofocus? 
+               &       input.attrs.list? 
+               &       shared-form.attrs.pattern? 
+               &       shared-form.attrs.required? 
+               &       shared-form.attrs.placeholder?
+               &       shared-form.attrs.dirname?
+               )
+
+## Password Field: <input type='password'>, Extensions
+
+       input.password.attrs &=
+               (       input.attrs.autocomplete? 
+               &       shared-form.attrs.autofocus? 
+               &       shared-form.attrs.pattern? 
+               &       shared-form.attrs.required? 
+               &       shared-form.attrs.placeholder?
+               )
+
+## Checkbox <input type='checkbox'>, Extensions
+
+       input.checkbox.attrs &=
+               (       shared-form.attrs.autofocus? 
+               &       shared-form.attrs.required? 
+               )
+
+## Radiobutton: <input type='radio'>, Extensions
+
+       input.radio.attrs &=
+               (       shared-form.attrs.autofocus? 
+               &       shared-form.attrs.required? 
+               )
+
+## Scripting Hook Button: <input type='button'>, Extensions
+
+       input.button.attrs &=
+               ( shared-form.attrs.autofocus? )
+
+## Submit Button: <input type='submit'>, Extensions
+
+       input.submit.attrs &=
+               (       shared-form.attrs.formaction? 
+               &       shared-form.attrs.autofocus? 
+               &       shared-form.attrs.formenctype? 
+               &       shared-form.attrs.formmethod? 
+               &       shared-form.attrs.formtarget? 
+               &       shared-form.attrs.formnovalidate? 
+               )
+
+## Reset Button: <input type='reset'>, Extensions
+
+       input.reset.attrs &=
+               ( shared-form.attrs.autofocus? )
+
+## File Upload: <input type='file'>, Extensions
+
+       input.file.attrs &=
+               (       shared-form.attrs.autofocus? 
+               &       shared-form.attrs.required? 
+               &       input.attrs.multiple? 
+               )
+
+## Image Submit Button: <input type='image'>, Extensions
+
+       input.image.attrs &=
+               (       shared-form.attrs.formaction? 
+               &       shared-form.attrs.autofocus? 
+               &       shared-form.attrs.formenctype? 
+               &       shared-form.attrs.formmethod? 
+               &       shared-form.attrs.formtarget? 
+               &       shared-form.attrs.formnovalidate? 
+               &       input.image.attrs.height?
+               &       input.image.attrs.width?
+               )       
+               input.image.attrs.height =
+                       attribute height {
+                               common.data.integer.non-negative
+                       }
+               input.image.attrs.width =
+                       attribute width {
+                               common.data.integer.non-negative
+                       }
+
+## Global Date and Time: <input type='datetime'>
+
+       input.datetime.elem = 
+               element input { input.datetime.attrs }
+       input.datetime.attrs = 
+               (       common.attrs
+               &       common-form.attrs
+               &       input.datetime.attrs.type
+               &       input.attrs.autocomplete? 
+               &       shared-form.attrs.autofocus? 
+               &       input.attrs.list? 
+               &       input.datetime.attrs.min? 
+               &       input.datetime.attrs.max? 
+               &       input.attrs.step.float? 
+               &       shared-form.attrs.readonly? 
+               &       shared-form.attrs.required? 
+               &       input.datetime.attrs.value? 
+               &       common.attrs.aria?
+               )       
+               input.datetime.attrs.type = 
+                       attribute type {
+                               w:string "datetime"
+                       }
+               input.datetime.attrs.min =
+                       attribute min {
+                               common.data.datetime
+                       }
+               input.datetime.attrs.max =
+                       attribute max {
+                               common.data.datetime
+                       }       
+               input.datetime.attrs.value =
+                       attribute value {
+                               w:string "" | common.data.datetime
+                       }
+               
+       input.elem |= input.datetime.elem
+
+## Date and Time with No Time Zone Information: <input type='datetime-local'>
+
+       input.datetime-local.elem = 
+               element input { input.datetime-local.attrs }
+       input.datetime-local.attrs = 
+               (       common.attrs
+               &       common-form.attrs
+               &       input.datetime-local.attrs.type
+               &       input.attrs.autocomplete? 
+               &       shared-form.attrs.autofocus? 
+               &       input.attrs.list? 
+               &       input.datetime-local.attrs.min? 
+               &       input.datetime-local.attrs.max? 
+               &       input.attrs.step.float? 
+               &       shared-form.attrs.readonly? 
+               &       shared-form.attrs.required? 
+               &       input.datetime-local.attrs.value? 
+               &       common.attrs.aria?
+               )       
+               input.datetime-local.attrs.type = 
+                       attribute type {
+                               w:string "datetime-local"
+                       }
+               input.datetime-local.attrs.min =
+                       attribute min {
+                               form.data.datetime-local
+                       }
+               input.datetime-local.attrs.max =
+                       attribute max {
+                               form.data.datetime-local                        
+                       }       
+               input.datetime-local.attrs.value =
+                       attribute value {
+                               w:string "" | form.data.datetime-local
+                       }
+               
+       input.elem |= input.datetime-local.elem
+
+## Date: <input type='date'>
+
+       input.date.elem = 
+               element input { input.date.attrs }
+       input.date.attrs = 
+               (       common.attrs
+               &       common-form.attrs
+               &       input.date.attrs.type
+               &       input.attrs.autocomplete? 
+               &       shared-form.attrs.autofocus? 
+               &       input.attrs.list? 
+               &       input.date.attrs.min? 
+               &       input.date.attrs.max? 
+               &       input.attrs.step.integer? 
+               &       shared-form.attrs.readonly? 
+               &       shared-form.attrs.required? 
+               &       input.date.attrs.value? 
+               &       common.attrs.aria?
+               )       
+               input.date.attrs.type = 
+                       attribute type {
+                               w:string "date"
+                       }
+               input.date.attrs.min =
+                       attribute min {
+                               form.data.date
+                       }
+               input.date.attrs.max =
+                       attribute max {
+                               form.data.date                  
+                       }       
+               input.date.attrs.value =
+                       attribute value {
+                               w:string "" | form.data.date
+                       }
+               
+       input.elem |= input.date.elem
+
+## Year and Month: <input type='month'>
+
+       input.month.elem = 
+               element input { input.month.attrs }
+       input.month.attrs = 
+               (       common.attrs
+               &       common-form.attrs
+               &       input.month.attrs.type
+               &       input.attrs.autocomplete? 
+               &       shared-form.attrs.autofocus? 
+               &       input.attrs.list? 
+               &       input.month.attrs.min? 
+               &       input.month.attrs.max? 
+               &       input.attrs.step.integer? 
+               &       shared-form.attrs.readonly? 
+               &       shared-form.attrs.required? 
+               &       input.month.attrs.value? 
+               &       common.attrs.aria?
+               )       
+               input.month.attrs.type = 
+                       attribute type {
+                               w:string "month"
+                       }
+               input.month.attrs.min =
+                       attribute min {
+                               form.data.month
+                       }
+               input.month.attrs.max =
+                       attribute max {
+                               form.data.month                 
+                       }       
+               input.month.attrs.value =
+                       attribute value {
+                               w:string "" | form.data.month
+                       }
+               
+       input.elem |= input.month.elem
+
+## Time without Time Zone Information: <input type='time'>
+
+       input.time.elem = 
+               element input { input.time.attrs }
+       input.time.attrs = 
+               (       common.attrs
+               &       common-form.attrs
+               &       input.time.attrs.type
+               &       input.attrs.autocomplete? 
+               &       shared-form.attrs.autofocus? 
+               &       input.attrs.list? 
+               &       input.time.attrs.min? 
+               &       input.time.attrs.max? 
+               &       input.attrs.step.float? 
+               &       shared-form.attrs.readonly? 
+               &       shared-form.attrs.required? 
+               &       input.time.attrs.value? 
+               &       common.attrs.aria?
+               )       
+               input.time.attrs.type = 
+                       attribute type {
+                               w:string "time"
+                       }
+               input.time.attrs.min =
+                       attribute min {
+                               form.data.time
+                       }
+               input.time.attrs.max =
+                       attribute max {
+                               form.data.time                  
+                       }       
+               input.time.attrs.value =
+                       attribute value {
+                               w:string "" | form.data.time
+                       }
+               
+       input.elem |= input.time.elem
+
+## Year and Week: <input type='week'>
+
+       input.week.elem = 
+               element input { input.week.attrs }
+       input.week.attrs = 
+               (       common.attrs
+               &       common-form.attrs
+               &       input.week.attrs.type
+               &       input.attrs.autocomplete? 
+               &       shared-form.attrs.autofocus? 
+               &       input.attrs.list? 
+               &       input.week.attrs.min? 
+               &       input.week.attrs.max? 
+               &       input.attrs.step.integer? 
+               &       shared-form.attrs.readonly? 
+               &       shared-form.attrs.required? 
+               &       input.week.attrs.value? 
+               &       common.attrs.aria?
+               )       
+               input.week.attrs.type = 
+                       attribute type {
+                               w:string "week"
+                       }
+               input.week.attrs.min =
+                       attribute min {
+                               form.data.week
+                       }
+               input.week.attrs.max =
+                       attribute max {
+                               form.data.week                  
+                       }       
+               input.week.attrs.value =
+                       attribute value {
+                               w:string "" | form.data.week
+                       }
+               
+       input.elem |= input.week.elem
+
+## Number: <input type='number'>
+
+       input.number.elem = 
+               element input { input.number.attrs }
+       input.number.attrs = 
+               (       common.attrs
+               &       common-form.attrs
+               &       input.number.attrs.type
+               &       input.attrs.autocomplete? 
+               &       shared-form.attrs.autofocus? 
+               &       input.attrs.list? 
+               &       input.number.attrs.min? 
+               &       input.number.attrs.max? 
+               &       input.attrs.step.float? 
+               &       shared-form.attrs.readonly? 
+               &       shared-form.attrs.required? 
+               &       shared-form.attrs.placeholder?
+               &       input.number.attrs.value? 
+               &       (       common.attrs.aria.implicit.spinbutton
+                       |       common.attrs.aria.role.spinbutton
+                       )?
+               )       
+               input.number.attrs.type = 
+                       attribute type {
+                               w:string "number"
+                       }
+               input.number.attrs.min =
+                       attribute min {
+                               common.data.float
+                       }
+               input.number.attrs.max =
+                       attribute max {
+                               common.data.float                       
+                       }       
+               input.number.attrs.value =
+                       attribute value {
+                               w:string "" | common.data.float
+                       }
+               
+       input.elem |= input.number.elem
+
+## Imprecise Number: <input type='range'>
+
+       input.range.elem = 
+               element input { input.range.attrs }
+       input.range.attrs = 
+               (       common.attrs
+               &       common-form.attrs
+               &       input.range.attrs.type
+               &       input.attrs.autocomplete? 
+               &       shared-form.attrs.autofocus? 
+               &       input.attrs.list? 
+               &       input.range.attrs.min? 
+               &       input.range.attrs.max? 
+               &       input.attrs.step.float? 
+               &       input.range.attrs.value? 
+               &       (       common.attrs.aria.implicit.slider
+                       |       common.attrs.aria.role.slider
+                       )?
+               )       
+               input.range.attrs.type = 
+                       attribute type {
+                               w:string "range"
+                       }
+               input.range.attrs.min =
+                       attribute min {
+                               common.data.float
+                       }
+               input.range.attrs.max =
+                       attribute max {
+                               common.data.float                       
+                       }       
+               input.range.attrs.value =
+                       attribute value {
+                               common.data.float
+                       }
+               
+       input.elem |= input.range.elem
+
+## Email Address: <input type='email'>
+
+       input.email.elem = 
+               element input { input.email.attrs }     
+       input.email.attrs = 
+               (       common.attrs
+               &       common-form.attrs
+               &       input.email.attrs.type
+               &       input.attrs.autocomplete? 
+               &       shared-form.attrs.autofocus? 
+               &       input.attrs.list? 
+               &       shared-form.attrs.maxlength? 
+               &       shared-form.attrs.pattern? 
+               &       shared-form.attrs.readonly? 
+               &       shared-form.attrs.required? 
+               &       shared-form.attrs.size?
+               &       shared-form.attrs.placeholder?
+               &       (       (       input.attrs.multiple
+                               &       input.email.attrs.value.multiple?
+                               )
+                       |       input.email.attrs.value.single?
+                       )?
+               &       (       common.attrs.aria.implicit.textbox
+                       |       common.attrs.aria.implicit.combobox
+                       |       common.attrs.aria.role.textbox
+                       |       common.attrs.aria.role.combobox
+                       )?
+               )       
+               input.email.attrs.type = 
+                       attribute type {
+                               w:string "email"
+                       }
+               input.email.attrs.value.single =
+                       attribute value {
+                               form.data.emailaddress
+                       }
+               input.email.attrs.value.multiple =
+                       attribute value {
+                               form.data.emailaddresslist
+                       }
+               
+       input.elem |= input.email.elem
+
+## IRI: <input type='url'>
+
+       input.url.elem = 
+               element input { input.url.attrs }
+       input.url.attrs = 
+               (       common.attrs
+               &       common-form.attrs
+               &       input.url.attrs.type
+               &       input.attrs.autocomplete? 
+               &       shared-form.attrs.autofocus? 
+               &       input.attrs.list? 
+               &       shared-form.attrs.maxlength? 
+               &       shared-form.attrs.pattern? 
+               &       shared-form.attrs.readonly? 
+               &       shared-form.attrs.required? 
+               &       shared-form.attrs.size?
+               &       shared-form.attrs.placeholder?
+               &       input.url.attrs.value? 
+               &       (       common.attrs.aria.implicit.textbox
+                       |       common.attrs.aria.implicit.combobox
+                       |       common.attrs.aria.role.textbox
+                       |       common.attrs.aria.role.combobox
+                       )?
+               )       
+               input.url.attrs.type = 
+                       attribute type {
+                               w:string "url"
+                       }
+               input.url.attrs.value =
+                       attribute value {
+                               w:string "" | common.data.uri.absolute
+                       }
+               
+       input.elem |= input.url.elem
+
+## Search: <input type='search'>
+
+       input.search.elem = 
+               element input { input.search.attrs }
+       input.search.attrs = 
+               (       common.attrs
+               &       common-form.attrs
+               &       input.search.attrs.type
+               &       input.attrs.autocomplete? 
+               &       shared-form.attrs.autofocus? 
+               &       input.attrs.list? 
+               &       shared-form.attrs.maxlength? 
+               &       shared-form.attrs.pattern? 
+               &       shared-form.attrs.readonly? 
+               &       shared-form.attrs.required? 
+               &       shared-form.attrs.size?
+               &       shared-form.attrs.placeholder?
+               &       shared-form.attrs.dirname?
+               &       input.search.attrs.value? 
+               &       (       common.attrs.aria.implicit.textbox
+                       |       common.attrs.aria.implicit.combobox
+                       |       common.attrs.aria.role.textbox
+                       |       common.attrs.aria.role.combobox
+                       )?
+               )       
+               input.search.attrs.type = 
+                       attribute type {
+                               w:string "search"
+                       }
+               input.search.attrs.value =
+                       attribute value {
+                               form.data.stringwithoutlinebreaks
+                       }
+               
+       input.elem |= input.search.elem
+
+## Telephone Number: <input type='tel'>
+
+       input.tel.elem = 
+               element input { input.tel.attrs }       
+       input.tel.attrs = 
+               (       common.attrs
+               &       common-form.attrs
+               &       input.tel.attrs.type
+               &       input.attrs.autocomplete? 
+               &       shared-form.attrs.autofocus? 
+               &       input.attrs.list? 
+               &       shared-form.attrs.maxlength? 
+               &       shared-form.attrs.pattern? 
+               &       shared-form.attrs.readonly? 
+               &       shared-form.attrs.required? 
+               &       shared-form.attrs.size?
+               &       shared-form.attrs.placeholder?
+               &       input.tel.attrs.value? 
+               &       (       common.attrs.aria.implicit.textbox
+                       |       common.attrs.aria.implicit.combobox
+                       |       common.attrs.aria.role.textbox
+                       |       common.attrs.aria.role.combobox
+                       )?
+               )       
+               input.tel.attrs.type = 
+                       attribute type {
+                               w:string "tel"
+                       }
+               input.tel.attrs.value =
+                       attribute value {
+                               form.data.stringwithoutlinebreaks
+                       }
+               
+       input.elem |= input.tel.elem
+
+## Color: <input type='color'>
+
+       input.color.elem = 
+               element input { input.color.attrs }     
+       input.color.attrs = 
+               (       common.attrs
+               &       common-form.attrs
+               &       input.color.attrs.type
+               &       input.attrs.autocomplete? 
+               &       shared-form.attrs.autofocus? 
+               &       input.attrs.list? 
+               &       input.color.attrs.value? 
+               &       common.attrs.aria?
+               )       
+               input.color.attrs.type = 
+                       attribute type {
+                               w:string "color"
+                       }
+               input.color.attrs.value =
+                       attribute value {
+                               w:string "" | form.data.color
+                       }
+               
+       input.elem |= input.color.elem
+
+## Form Output: <output>
+
+       output.elem =
+               element output { output.inner & output.attrs }
+       output.attrs =
+               (       common.attrs
+               &       common-form.attrs.name?
+               &       common-form.attrs.form?
+               &       output.attrs.for?
+               &       (       common.attrs.aria.implicit.status
+                       |       common.attrs.aria
+                       )?
+               )
+               output.attrs.for = 
+                       attribute for {
+                               common.data.idrefs #REVISIT spec says 
space--not whitespace
+                       }
+       output.inner =
+               ( common.inner.phrasing )
+
+       common.elem.phrasing |= output.elem
+
+## Text Area: <textarea>, extensions
+
+       textarea.attrs.rows-and-cols-wf1.inner &=
+               notAllowed
+       textarea.attrs.rows-and-cols-wf1 |= 
+               empty
+       textarea.attrs &=
+               (       shared-form.attrs.maxlength?
+               &       shared-form.attrs.autofocus? 
+               &       shared-form.attrs.required? 
+               &       shared-form.attrs.placeholder?
+               &       shared-form.attrs.dirname?
+               &       textarea.attrs.rows?
+               &       (       (       textarea.attrs.wrap.hard 
+                               &       textarea.attrs.cols
+                               )
+                       |       (       textarea.attrs.wrap.soft?
+                               &       textarea.attrs.cols?
+                               )
+                       )
+               )
+               textarea.attrs.wrap.hard =
+                       attribute wrap {
+                               w:string "hard"
+                       }
+               textarea.attrs.wrap.soft =
+                       attribute wrap {
+                               w:string "soft"
+                       }
+
+## List of Prefill Data: <datalist>
+
+       #REVISIT should the options in datalist be non-selectable?
+
+       datalist.elem =
+               element datalist { datalist.inner & datalist.attrs }
+       datalist.inner =
+               ( option.elem* & common.inner.phrasing )
+       datalist.attrs =
+               (       common.attrs
+               &       (       common.attrs.aria.role.listbox # 
aria-multiselectable must be false; check by assertions
+                       |       common.attrs.aria.role.presentation
+                       |       common.attrs.aria.role.menuitem
+                       )?
+               )
+
+       common.elem.phrasing |= datalist.elem
+
+## Complex Submit Button: <button type='submit'>, extensions
+
+       button.submit.attrs &=
+               (       shared-form.attrs.formaction? 
+               &       shared-form.attrs.autofocus? 
+               &       shared-form.attrs.formenctype? 
+               &       shared-form.attrs.formmethod? 
+               &       shared-form.attrs.formtarget? 
+               &       shared-form.attrs.formnovalidate? 
+               )
+       
+## Complex Reset Button: <button type='reset'>, extensions
+
+       button.reset.attrs &=
+               ( shared-form.attrs.autofocus? )
+       
+## Complex Push Button: <button type='button'>, extensions
+
+       button.button.attrs &=
+               ( shared-form.attrs.autofocus? )
+
+## Form: <form>, extensions
+       form.attrs &= 
+               (       form.attrs.novalidate?
+               &       form.attrs.target?
+               &       form.attrs.autocomplete?
+               )
+               form.attrs.novalidate = 
+                       attribute novalidate {
+                               w:string "novalidate" | w:string ""
+                       }
+               form.attrs.target = 
+                       attribute target {
+                               common.data.browsing-context-or-keyword
+                       }
+               form.attrs.autocomplete = 
+                       attribute autocomplete {
+                               w:string "on" | w:string "off"
+                       }
+               # REVISIT should this be case-insensitive in conforming XHTML 
documents?
+               form.attrs.enctype.data |= 
+                       ( w:string "text/plain" )
+
+## Fieldset: <fieldset>, extensions
+
+       fieldset.attrs &=
+               ( common-form.attrs )
+
+## Label: <label>, extensions
+
+       label.attrs &=
+               ( common-form.attrs.form? )
+
+## Key-pair generator/input control: <keygen>
+
+       keygen.elem =
+               element keygen { keygen.inner & keygen.attrs }
+       keygen.attrs =
+               (       common.attrs
+               &       keygen.attrs.challenge?
+               &       keygen.attrs.keytype?
+               &       shared-form.attrs.autofocus? 
+               &       common-form.attrs?
+               &       (       common.attrs.aria.role.presentation
+                       |       common.attrs.aria.role.menuitem
+                       )?
+               )
+               keygen.attrs.challenge =
+                       attribute challenge {
+                               string
+                       }
+               keygen.attrs.keytype = 
+                       attribute keytype {
+                               w:string "rsa"
+                       }
+       keygen.inner =
+               ( empty )
+
+       common.elem.phrasing |= keygen.elem
+
+## Selection Menu: <select>, Extensions
+
+       select.attrs &=
+               (       shared-form.attrs.autofocus? 
+               &       shared-form.attrs.required? 
+               )
diff --git a/xhtml5.rnc b/xhtml5.rnc
new file mode 100644
index 0000000..1c6c524
--- /dev/null
+++ b/xhtml5.rnc
@@ -0,0 +1,40 @@
+default namespace = "http://www.w3.org/1999/xhtml";
+# #####################################################################
+##  RELAX NG Schema for XHTML 5                                       #
+# #####################################################################
+
+  # To validate an XHTML 5 document, you must first validate against #
+  # this schema and then ALSO validate against assertions.sch        #
+
+# #####################################################################
+## Schema Framework & Parameters
+
+include "common.rnc" {
+       # XHTML flavor #
+               XMLonly = empty
+               HTMLonly = notAllowed
+       # HTML 4 compat #
+               v5only = empty
+}
+
+# #####################################################################
+## Language Definitions
+
+start = html.elem
+
+include "meta.rnc"
+include "phrase.rnc"
+include "block.rnc"
+include "sectional.rnc"
+include "structural.rnc"
+include "revision.rnc"
+include "embed.rnc"
+include "ruby.rnc"
+include "media.rnc"
+include "core-scripting.rnc"
+include "tables.rnc"
+include "form-datatypes.rnc"
+include "web-forms.rnc"
+include "web-forms2.rnc"
+include "applications.rnc"
+include "data.rnc"



reply via email to

[Prev in Thread] Current Thread [Next in Thread]