Added latest relax NG schema (in sync with current draft of XForms 2.0)
authorNick Van den Bleeken <nick.van.den.bleeken@inventivegroup.com>
Thu, 19 Apr 2012 10:59:26 +0200
changeset 0 2666c93f859d
child 1 fa9feb88f09d
Added latest relax NG schema (in sync with current draft of XForms 2.0)
2.0/core/schema/rng/xforms-nons-20.rnc
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/2.0/core/schema/rng/xforms-nons-20.rnc	Thu Apr 19 10:59:26 2012 +0200
@@ -0,0 +1,718 @@
+# -*- rnc -*-
+# Copyright (C) 2009-2012 W3C (R); (MIT, ERCIM, Keio), All Rights Reserved.
+# 
+# Permission to use, copy, modify and distribute this RELAX NG schema
+# for XForms 2.0 and its accompanying documentation for any purpose and
+# without fee is hereby granted in perpetuity, provided that the above
+# copyright notice and this paragraph appear in all copies. The copyright
+# holders make no representation about the suitability of this RELAX NG
+# schema for any purpose.
+# 
+# It is provided "as is" without expressed or implied warranty.
+# For details, please refer to the W3C software license at:
+# 
+#   http://www.w3.org/Consortium/Legal/copyright-software
+
+namespace xs = "http://www.w3.org/2001/XMLSchema"
+namespace xsd = "http://www.w3.org/2001/XMLSchema-datatypes"
+datatypes xsd = "http://www.w3.org/2001/XMLSchema-datatypes"
+
+xforms.Common.attrib =
+  # host language to add common attributes here
+  attribute id { xsd:ID }?
+xforms.Events.attrib =
+  # host language to add XML Events attributes here
+  empty
+xforms.Linking.attrib =
+  # host language to add src attribute here
+  empty
+xforms.Single.Node.Binding.attrib =
+  attribute model { xsd:IDREF }?,
+  attribute ref { XPathExpression }?,
+  attribute bind { IDREF-avt }?
+xforms.Sequence.Binding.attrib =
+  attribute model { xsd:IDREF }?,
+  attribute ref { XPathExpression }?,
+  attribute nodeset { XPathExpression }?, # nodeset is deprecated; use ref
+  attribute bind { IDREF-avt }?
+
+# To use external xmlschema.rnc such as http://www.jenitennison.com/schema/xmlschema.rng
+# change its start pattern to be a pattern named "xsd.schema" and use the following lines.
+# include "../xmlschema-component.rnc"
+# xforms.schema = xsd.schema
+# Placeholder for XML Schema RNG
+xforms.schema = element xs:schema { attribute * { text }*, xforms.anyXSElement* }
+xforms.model =
+  element model { xforms.model.attrib, xforms.model.content }
+xforms.model.attrib =
+  xforms.Common.attrib,
+  xforms.Events.attrib,
+  attribute functions {
+    list { xsd:QName+ }
+  }?,
+  attribute schema {
+    list { xsd:anyURI+ }
+  }?,
+   attribute version { xforms.versionList }?,
+   attribute xpath-version { "1.0" | "2.0" }
+xforms.model.content =
+  (xforms.instance 
+  | xforms.schema
+  | xforms.submission
+  | xforms.bind
+  | xforms.Actions
+  | xforms.function
+  | xforms.Extension)*
+xforms.instance =
+  element instance { xforms.instance.attrib, xforms.instance.content }
+xforms.instance.attrib =
+  xforms.Common.attrib,
+  xforms.Linking.attrib?,
+  # note: XForms 1.1 Recommendation defines this as a special attribute of instance, 
+  # but XHTML integrations will add it in xforms.Linking.attrib
+  # attribute src { anyURI-avt }?,
+  # note: instance/@resource collides with rdf/a @resource
+  attribute resource { anyURI-avt }?
+xforms.instance.content = xforms.anyElement?
+xforms.submission = element submission { xforms.submission.model }
+xforms.submission.resource.attr = attribute resource { anyURI-avt }
+xforms.submission.resource.element = element resource { xforms.ValueTemplate.anyURI }?
+xforms.submission.action.attr = attribute action { anyURI-avt }
+xforms.submission.model =
+  # There should only be zero or one resource, zero or one method, and zero or more header
+  xforms.Common.attrib
+  & (# either the attribute method or the element method must be specified
+   attribute method {
+     QNameButNotNCName
+     | "post"
+     | "get"
+     | "delete"
+     | "put"
+     | "multipart-post"
+     | "form-data-post"
+     | "urlencoded-post"
+     | expr-avt.datatype
+   }
+   | element method { xforms.ValueTemplate })
+   # note: resource attribute collides with rdf/a resource attribute
+   & ((xforms.submission.action.attr & xforms.submission.resource.attr? & xforms.submission.resource.element) |
+      (xforms.submission.action.attr? & xforms.submission.resource.attr & xforms.submission.resource.element?) |
+      (xforms.submission.action.attr? & xforms.submission.resource.attr? & xforms.submission.resource.element))
+   & element header {
+     attribute nodeset { XPathExpression }?
+     & attribute combine { "combine" | "append" | "prepend" | "replace" | expr-avt.datatype }?
+     & (attribute name { expr-avt.datatype } | element name { xforms.ValueTemplate })
+     & (attribute value { expr-avt.datatype } | element value { xforms.ValueTemplate }+)
+  }*
+  & attribute bind { IDREF-avt }?
+  & attribute ref { XPathExpression }?
+  & attribute includenamespaceprefixes {
+    (list { (xsd:NMTOKEN | "#default")* }) | expr-avt.datatype
+  }?
+  # note: collides with xhtml common encoding attribute
+  & attribute encoding { text-avt }?
+  & attribute mode { "asynchronous" | "synchronous" | expr-avt.datatype }?
+  & attribute omit-xml-declaration { boolean-avt }?
+  & attribute indent { boolean-avt }?
+  & attribute mediatype { text-avt }?
+  & attribute standalone { boolean-avt}?
+  & attribute cdata-section-elements {
+    (list { xsd:QName+ | } | expr-avt.datatype)
+  }?
+  & attribute replace {
+    QNameButNotNCName | "all" | "instance" | "text" | "none" | expr-avt.datatype
+  }?
+  & attribute instance { IDREF-avt }?
+  & attribute relevant { boolean-avt }?
+  & attribute separator { ";" | "&" | expr-avt.datatype}?
+  & attribute serialization {
+    "application/xml"
+    | "application/x-www-form-urlencoded"
+    | "multipart/related"
+    | "multipart/form-data"
+    | "none"
+    | expr-avt.datatype
+  }?
+  & attribute validate { boolean-avt }?
+  & attribute version { xforms.versionList }?
+  & attribute targetref { XPathExpression }?
+  & xforms.Actions
+xforms.bind = element bind { xforms.bind.attrib, xforms.bind.content }
+xforms.bind.attrib =
+  xforms.Common.attrib,
+  attribute nodeset { XPathExpression }?,
+  attribute calculate { XPathExpression }?,
+  attribute type { xsd:QName }?,
+  attribute required { XPathExpression }?,
+  attribute constraint { XPathExpression }?,
+  attribute relevant { XPathExpression }?,
+  attribute readonly { XPathExpression }?,
+  attribute p3ptype { text }? # p3ptype is deprecated
+xforms.bind.content = xforms.bind* & xforms.Extension?
+# Variables
+xforms.var = element var { xforms.var.attrib, xforms.var.content }
+xforms.var.attrib =
+   xforms.Common.attrib,
+   attribute name { xsd:QName },
+   attribute value { XPathExpression },
+   attribute model { IDREF-avt }?
+xforms.var.content = text
+# Functions
+xforms.function = element function { xforms.function.attrib, xforms.function.content }
+xforms.function.attrib =
+   attribute signature { CustomFunctionSignature },
+   attribute override { "yes" | "no" }?
+xforms.function.content =
+   xforms.var*,
+   (xforms.function.sequence* | xforms.function.script*)
+# The signature attribute of the function element has the following syntax.
+# It might be possible to write a regular expression that matches it, but
+# here we just use unrestricted text.
+# CustomFunctionSignature	 ::=	FunctionName "(" ParamList? ")" ("as" SequenceType)?
+# FunctionName	 ::=	QNameButNoNCName
+# ParamList	 ::=	Param ("," Param)*
+# Param	 ::=	"$" QName TypeDeclaration?
+# TypeDeclaration	 ::=	"as" SequenceType
+CustomFunctionSignature = text
+xforms.function.sequence = element sequence { xforms.function.sequence.attrib, xforms.function.sequence.content }
+xforms.function.sequence.attrib = 
+  xforms.Common.attrib,
+   attribute value { XPathExpression }
+xforms.function.script = element script  { xforms.function.script.attrib, xforms.function.script.content }
+xforms.function.script.attrib =
+  xforms.Linking.attrib,
+  attribute type { mediatype.datatype.nocharset },
+  attribute charset { mediatype.charset }?
+xforms.function.script.content = text  
+# Form Controls
+xforms.Core.Form.Controls =
+  xforms.input
+  | xforms.textarea
+  | xforms.secret
+  | xforms.output
+  | xforms.upload
+  | xforms.select1
+  | xforms.select
+  | xforms.range
+  | xforms.submit
+  | xforms.trigger
+xforms.UI.Messages.attrib = empty
+xforms.UI.Common.attrib =
+  # host language to add accesskey and navindex here
+  attribute appearance {
+    xsd:QName { pattern = "[^:]+:[^:]+" }
+    | "minimal"
+    | "compact"
+    | "full"
+    | expr-avt.datatype
+  }?
+xforms.UI.Inline.class = xforms.output
+xforms.UI.Inline.content = xforms.UI.Inline.class?
+xforms.UI.Common.content =
+  (xforms.help | xforms.hint | xforms.alert | xforms.Actions | xforms.Extension)*
+xforms.List.UI.Common.content =
+  (xforms.item | xforms.itemset | xforms.choices)+
+# host language must override xforms.label.Text.content to be empty if xforms.UI.Inline.content also includes text
+xforms.label.Text.content = text
+xforms.label.attrib = xforms.Common.attrib, xforms.UI.Common.attrib, xforms.UI.Messages.attrib?
+xforms.label.content = xforms.label.Text.content & xforms.UI.Inline.content
+xforms.label =
+  element label {
+    xforms.label.attrib &
+    (xforms.Linking.attrib | xforms.Single.Node.Binding.attrib) &
+    xforms.label.content?
+  }
+xforms.help = element help { xforms.help.attrib, xforms.help.content,
+  xforms.UI.Common.attrib, 
+  attribute href { anyURI-avt }? }
+xforms.help.attrib =
+  xforms.Common.attrib,
+  xforms.Linking.attrib?,
+  xforms.Single.Node.Binding.attrib?,
+  xforms.UI.Messages.attrib?
+xforms.help.content = xforms.UI.Inline.content
+xforms.hint = element hint { xforms.hint.attrib, xforms.hint.content }
+xforms.hint.attrib =
+  xforms.Common.attrib,
+  xforms.Linking.attrib?,
+  xforms.Single.Node.Binding.attrib?,
+  xforms.UI.Common.attrib,
+  xforms.UI.Messages.attrib?
+xforms.hint.content = xforms.UI.Inline.content
+xforms.alert =
+  element alert { xforms.alert.attrib, xforms.alert.content }
+xforms.alert.attrib =
+  xforms.Common.attrib,
+  xforms.Linking.attrib?,
+  xforms.Single.Node.Binding.attrib,
+  xforms.UI.Messages.attrib?
+xforms.alert.content = xforms.UI.Inline.content
+xforms.choices =
+  element choices { xforms.choices.attrib, xforms.choices.content }
+xforms.choices.attrib = xforms.Common.attrib
+xforms.choices.content =
+  xforms.label?, (xforms.choices | xforms.item | xforms.itemset)+
+xforms.value =
+  element value { xforms.value.attrib, xforms.value.content }
+xforms.value.attrib =
+  xforms.Common.attrib, xforms.Single.Node.Binding.attrib?
+xforms.value.content = text
+xforms.item = element item { xforms.item.attrib, xforms.item.content }
+xforms.item.attrib = xforms.Common.attrib
+xforms.item.content =
+  xforms.label, xforms.value, xforms.UI.Common.content
+xforms.itemset =
+  element itemset { xforms.itemset.attrib, xforms.itemset.content }
+xforms.itemset.attrib =
+  xforms.Common.attrib, xforms.Sequence.Binding.attrib
+xforms.itemset.content =
+  xforms.label, (xforms.value | xforms.copy), xforms.UI.Common.content
+xforms.copy = element copy { xforms.copy.attrib, xforms.copy.content }
+xforms.copy.attrib =
+  xforms.Common.attrib, xforms.Single.Node.Binding.attrib
+xforms.copy.content = empty
+xforms.filename =
+  element filename { xforms.filename.attrib, xforms.filename.content }
+xforms.filename.attrib =
+  xforms.Common.attrib, xforms.Single.Node.Binding.attrib
+xforms.filename.content = empty
+xforms.upload.mediatype =
+  element mediatype {
+    xforms.upload.mediatype.attrib, xforms.upload.mediatype.content
+  }
+xforms.upload.mediatype.attrib =
+  xforms.Common.attrib, xforms.Single.Node.Binding.attrib
+xforms.upload.mediatype.content = empty
+xforms.output =
+  element output { xforms.output.attrib & xforms.output.content }
+xforms.output.attrib =
+  xforms.Common.attrib,
+  xforms.UI.Common.attrib,
+  xforms.Single.Node.Binding.attrib?,
+  attribute mediatype { text-avt }?,
+  attribute value { XPathExpression }?
+xforms.output.content = xforms.label?, (xforms.output.mediatype? & xforms.UI.Common.content)
+xforms.output.mediatype =
+  element mediatype {
+    xforms.output.mediatype.attrib, xforms.output.mediatype.content
+  }
+xforms.output.mediatype.attrib =
+  xforms.Common.attrib, (attribute value { XPathExpression } | xforms.Single.Node.Binding.attrib)
+xforms.output.mediatype.content = empty # If erratum accepted, change xforms.output.mediatype to use xforms.ValueTemplate
+xforms.UI.Interaction.attrib = 
+  attribute incremental { boolean-avt }?, 
+  attribute delay { nonNegativeInteger-avt }?
+xforms.input =
+  element input { xforms.input.attrib, xforms.input.content }
+xforms.input.attrib =
+  xforms.Common.attrib,
+  xforms.Single.Node.Binding.attrib,
+  attribute inputmode { text-avt }?,
+  xforms.UI.Common.attrib,
+  xforms.UI.interaction.attrib
+xforms.input.content = xforms.label, xforms.UI.Common.content
+xforms.textarea =
+  element textarea { xforms.textarea.attrib, xforms.textarea.content }
+xforms.textarea.attrib =
+  xforms.Common.attrib,
+  xforms.Single.Node.Binding.attrib,
+  attribute inputmode { text-avt }?,
+  xforms.UI.Common.attrib,
+  xforms.UI.interaction.attrib
+xforms.textarea.content = xforms.label, xforms.UI.Common.content
+xforms.secret =
+  element secret { xforms.secret.attrib, xforms.secret.content }
+xforms.secret.attrib =
+  xforms.Common.attrib,
+  xforms.Single.Node.Binding.attrib,
+  attribute inputmode { text-avt }?,
+  xforms.UI.Common.attrib,
+  xforms.UI.interaction.attrib
+xforms.secret.content = xforms.label, xforms.UI.Common.content
+xforms.upload =
+  element upload { xforms.upload.attrib, xforms.upload.content }
+xforms.upload.attrib =
+  xforms.Common.attrib,
+  xforms.Single.Node.Binding.attrib,
+  attribute mediatype { text-avt }?,
+  xforms.UI.Common.attrib,
+  xforms.UI.interaction.attrib
+xforms.upload.content =
+  xforms.label,
+  xforms.filename?,
+  xforms.upload.mediatype?,
+  xforms.UI.Common.content
+xforms.select1 =
+  element select1 { xforms.select1.attrib, xforms.select1.content }
+xforms.select1.attrib =
+  xforms.Common.attrib,
+  xforms.Single.Node.Binding.attrib,
+  xforms.UI.Common.attrib,
+  attribute selection { "open" | "closed" | expr-avt.datatype }?,
+  xforms.UI.interaction.attrib
+xforms.select1.content =
+  xforms.label, xforms.UI.Common.content, xforms.List.UI.Common.content, xforms.UI.Common.content
+xforms.select =
+  element select { xforms.select.attrib, xforms.select.content }
+xforms.select.attrib =
+  xforms.Common.attrib,
+  xforms.Single.Node.Binding.attrib,
+  xforms.UI.Common.attrib,
+  attribute selection { "open" | "closed" | expr-avt.datatype }?,
+  xforms.UI.interaction.attrib
+xforms.select.content =
+  xforms.label, xforms.UI.Common.content, xforms.List.UI.Common.content, xforms.UI.Common.content
+xforms.range =
+  element range { xforms.range.attrib, xforms.range.content }
+xforms.range.attrib =
+  xforms.Common.attrib,
+  xforms.Single.Node.Binding.attrib,
+  xforms.UI.Common.attrib,
+  attribute start { text-avt }?,
+  attribute end { text-avt }?,
+  attribute step { text-avt }?,
+  xforms.UI.interaction.attrib
+xforms.range.content = xforms.label, xforms.UI.Common.content
+xforms.trigger =
+  element trigger { xforms.trigger.attrib, xforms.trigger.content }
+xforms.trigger.attrib =
+  xforms.Common.attrib,
+  xforms.Single.Node.Binding.attrib?,
+  xforms.UI.Common.attrib?
+xforms.trigger.content = xforms.label, xforms.UI.Common.content
+xforms.submit =
+  element submit { xforms.submit.attrib, xforms.submit.content }
+xforms.submit.attrib =
+  xforms.Common.attrib,
+  attribute submission { IDREF-avt },
+  xforms.Single.Node.Binding.attrib?,
+  xforms.UI.Common.attrib?
+xforms.submit.content = xforms.label, xforms.UI.Common.content
+
+# Actions
+xforms.action =
+  element action { xforms.action.attrib, xforms.action.content }
+xforms.action.attrib = xforms.Common.attrib, xforms.actions.attrib
+xforms.action.content = xforms.Actions
+xforms.dispatch =
+  element dispatch { xforms.dispatch.attrib, xforms.dispatch.content }
+xforms.dispatch.attrib =
+  xforms.Common.attrib,
+  xforms.actions.attrib,
+  attribute name { xforms.ActionName | expr-avt.datatype }?,
+  attribute targetid { IDREF-avt }?,
+  attribute target { xsd:IDREF }?,              # target is deprecated; use targetid
+  attribute delay { nonNegativeInteger-avt }?,
+  attribute bubbles { boolean-avt }?,
+  attribute cancelable { boolean-avt }?
+xforms.dispatch.content = element name { xforms.ValueTemplate.IDREF }?
+   & element targetid { xforms.ValueTemplate.IDREF }?
+   & element target { xforms.ValueTemplate.IDREF }?  # target is deprecated; use targetid
+   & element delay { xforms.ValueTemplate }?
+xforms.rebuild =
+  element rebuild { xforms.rebuild.attrib, xforms.rebuild.content }
+xforms.rebuild.attrib =
+  xforms.Common.attrib,
+  attribute model { IDREF-avt }?,
+  xforms.actions.attrib
+xforms.rebuild.content = empty
+xforms.revalidate =
+  element revalidate {
+    xforms.revalidate.attrib, xforms.revalidate.content
+  }
+xforms.revalidate.attrib =
+  xforms.Common.attrib,
+  attribute model { IDREF-avt }?,
+  xforms.actions.attrib
+xforms.revalidate.content = empty
+xforms.recalculate =
+  element recalculate {
+    xforms.recalculate.attrib, xforms.recalculate.content
+  }
+xforms.recalculate.attrib =
+  xforms.Common.attrib,
+  attribute model { IDREF-avt }?,
+  xforms.actions.attrib
+xforms.recalculate.content = empty
+xforms.refresh =
+  element refresh { xforms.refresh.attrib, xforms.refresh.content }
+xforms.refresh.attrib =
+  xforms.Common.attrib,
+  attribute model { IDREF-avt }?,
+  xforms.actions.attrib
+xforms.refresh.content = empty
+xforms.setfocus =
+  element setfocus { xforms.setfocus.attrib, xforms.setfocus.content }
+xforms.setfocus.attrib =
+  xforms.Common.attrib,
+  attribute control { IDREF-avt }?,
+  element control { xforms.ValueTemplate.IDREF }?,
+  xforms.actions.attrib
+xforms.setfocus.content = empty
+xforms.load = element load { xforms.load.attrib, xforms.load.content }
+xforms.load.attrib =
+  xforms.Common.attrib,
+  attribute resource { anyURI-avt }?,    # note: collides with rdf/a resource attribute
+  attribute show { "new" | "replace" | expr-avt.datatype }?,
+  xforms.Single.Node.Binding.attrib,
+  xforms.actions.attrib
+xforms.load.content = element resource { xforms.ValueTemplate.anyURI }? 
+xforms.setvalue =
+  element setvalue { xforms.setvalue.attrib, xforms.ValueTemplate }
+xforms.setvalue.attrib =
+  xforms.Common.attrib,
+  xforms.Single.Node.Binding.attrib?,
+  xforms.actions.attrib
+xforms.send = element send { xforms.send.attrib, xforms.send.content }
+xforms.send.attrib =
+  xforms.Common.attrib,
+  attribute submission { IDREF-avt },
+  xforms.actions.attrib
+xforms.send.content = empty
+xforms.reset =
+  element reset { xforms.reset.attrib, xforms.reset.content }
+xforms.reset.attrib =
+  xforms.Common.attrib,
+  attribute model { IDREF-avt }?,
+  xforms.actions.attrib
+xforms.reset.content = empty
+xforms.insert =
+  element insert { xforms.insert.attrib, xforms.insert.content }
+xforms.insert.attrib =
+  xforms.Common.attrib,
+  attribute context { XPathExpression }?,
+  attribute origin { XPathExpression }?,
+  attribute at { XPathExpression }?,
+  attribute position { "before" | "after" | expr-avt.datatype }?,
+  xforms.Sequence.Binding.attrib?,
+  xforms.actions.attrib
+xforms.insert.content = empty
+xforms.delete =
+  element delete { xforms.delete.attrib, xforms.delete.content }
+xforms.delete.attrib =
+  xforms.Common.attrib,
+  attribute context { XPathExpression }?,
+  attribute at { XPathExpression }?,
+  xforms.Sequence.Binding.attrib?,
+  xforms.actions.attrib
+xforms.delete.content = empty
+xforms.setindex =
+  element setindex { xforms.setindex.attrib, xforms.setindex.content }
+xforms.setindex.attrib =
+  xforms.Common.attrib,
+  attribute repeat { IDREF-avt },
+  attribute index { XPathExpression },
+  xforms.actions.attrib
+xforms.setindex.content = empty
+xforms.toggle =
+  element toggle { xforms.toggle.attrib, xforms.toggle.content }
+xforms.toggle.attrib =
+  xforms.Common.attrib,
+  attribute case { IDREF-avt }?,
+  xforms.actions.attrib
+xforms.toggle.content = element case { xforms.ValueTemplate.IDREF }?
+xforms.script = element script  { xforms.script.attrib, xforms.script.content }
+xforms.script.attrib =
+  xforms.Common.attrib,
+  attribute type { mediatype.datatype.nocharset },
+  attribute charset { mediatype.charset }?,
+  xforms.Linking.attrib,
+  xforms.actions.attrib
+xforms.script.content = text  
+xforms.message =
+  element message { xforms.message.attrib, xforms.message.content }
+xforms.message.attrib =
+  xforms.Common.attrib,
+  attribute level { "ephemeral" | "modeless" | "modal" | expr-avt.datatype },
+  xforms.Linking.attrib?,
+  xforms.Single.Node.Binding.attrib?,
+  xforms.actions.attrib
+
+# host language must override xforms.message.Text.content to be mepty if xforms.UI.Inline.content also includes text
+xforms.message.Text.content = text
+xforms.message.content = xforms.message.Text.content & xforms.UI.Inline.content
+xforms.Actions =
+  (xforms.action
+   | xforms.dispatch
+   | xforms.rebuild
+   | xforms.recalculate
+   | xforms.refresh
+   | xforms.setfocus
+   | xforms.load
+   | xforms.setvalue
+   | xforms.send
+   | xforms.reset
+   | xforms.insert
+   | xforms.delete
+   | xforms.setindex
+   | xforms.toggle
+   | xforms.script
+   | xforms.message)*
+xforms.actions.attrib =
+  xforms.Events.attrib,
+  attribute if { XPathExpression }?,
+  attribute while { XPathExpression }?,
+  attribute iterate { XPathExpression }?
+
+# Container Form Controls
+xforms.Container.Form.Controls =
+  xforms.group | xforms.repeat | xforms.switch
+xforms.repeat =
+  element repeat { xforms.repeat.attrib, xforms.repeat.content }
+xforms.repeat.attrib =
+  xforms.Common.attrib,
+  xforms.Sequence.Binding.attrib,
+  xforms.UI.Common.attrib,
+  attribute indexref { XPathExpression }?,
+  attribute startindex { positiveInteger-avt }?,
+  attribute number { nonNegativeInteger-avt }?
+xforms.repeat.content =
+  (xforms.Core.Form.Controls
+   | xforms.Container.Form.Controls
+   | xforms.UI.Inline.content)*
+xforms.group =
+  element group { xforms.group.attrib, xforms.group.content }
+xforms.group.attrib =
+  xforms.Common.attrib,
+  xforms.Single.Node.Binding.attrib?,
+  xforms.UI.Common.attrib
+xforms.group.content =
+  xforms.label?,
+  (xforms.Core.Form.Controls
+   | xforms.Container.Form.Controls
+   | xforms.UI.Common.content
+   | xforms.UI.Inline.content)*
+xforms.switch =
+  element switch { xforms.switch.attrib, xforms.switch.content }
+xforms.switch.attrib =
+  xforms.Common.attrib,
+  xforms.Single.Node.Binding.attrib?,
+  xforms.UI.Common.attrib,
+  attribute caseref { XPathExpression }?
+xforms.switch.content = xforms.switch.case+
+xforms.switch.case =
+  element case { xforms.switch.case.attrib, xforms.switch.case.content }
+xforms.switch.case.attrib =
+  xforms.Common.attrib,
+  attribute selected { xsd:boolean }?
+xforms.switch.case.content =
+  xforms.label?,
+  (xforms.Core.Form.Controls
+   | xforms.Container.Form.Controls
+   | xforms.action
+   | xforms.UI.Inline.content)*
+xforms.Extension =
+   (xforms.extension.content &
+    element extension { xforms.extension.attrib, xforms.extension.content })
+xforms.extension.attrib =
+  xforms.Common.attrib
+xforms.extension.content =
+  xforms.anyForeignElement*
+
+# Simple Types
+# Actions
+xforms.ActionName =
+  "xforms-model-construct"
+  | "xforms-model-construct-done"
+  | "xforms-ready"
+  | "xforms-model-destruct"
+  | "xforms-rebuild"
+  | "xforms-recalculate"
+  | "xforms-revalidate"
+  | "xforms-refresh"
+  | "xforms-reset"
+  | "xforms-previous"
+  | "xforms-next"
+  | "xforms-focus"
+  | "xforms-help"
+  | "xforms-hint"
+  | "xforms-submit"
+  | "xforms-submit-serialize"
+  | "xforms-insert"
+  | "xforms-delete"
+  | "xforms-value-changed"
+  | "xforms-valid"
+  | "xforms-invalid"
+  | "xforms-readonly"
+  | "xforms-readwrite"
+  | "xforms-required"
+  | "xforms-optional"
+  | "xforms-enabled"
+  | "xforms-disabled"
+  | "xforms-select"
+  | "xforms-deselect"
+  | "xforms-in-range"
+  | "xforms-out-of-range"
+  | "xforms-scroll-first"
+  | "xforms-scroll-last"
+  | "xforms-submit-done"
+  | "xforms-binding-exception"
+  | "xforms-compute-exception"
+  | "xforms-link-error"
+  | "xforms-link-exception"
+  | "xforms-output-error"
+  | "xforms-submit-error"
+  | "xforms-version-exception"
+  | (xsd:NMTOKEN - (xsd:NMTOKEN { pattern = "xforms-.*" }))
+  | expr-avt.datatype
+
+QNameButNotNCName = xsd:QName { pattern = "[^:]+:[^:]+" }
+XPathExpression = xsd:string
+xforms.versionList = list { xforms.versionNumber+ }
+xforms.versionNumber = xsd:string { pattern = "[1-9]\d*\.\d+" }
+
+# Attribute or child element with @value attribute: most uses deprecated in favor of AVT
+xforms.ValueTemplate = attribute value { XPathExpression }? & xsd:string
+xforms.ValueTemplate.IDREF = attribute value { XPathExpression }? | (attribute value { XPathExpression }? & xsd:IDREF)
+xforms.ValueTemplate.anyURI = attribute value { XPathExpression }? | (attribute value { XPathExpression }? & xsd:anyURI)
+
+# mediatype and charset
+mediatype.datatype = xsd:token
+mediatype.datatype.nocharset = xsd:token
+charset.datatype = xsd:token
+
+# AVT Simple Types, Taken from Jeni Tennison's XSLT 1.0 RNC Schema
+# An AVT containing at least one expression.
+expr-avt.datatype =
+  xsd:string {
+    pattern =
+      "([^\{\}]|\{\{|\}\})*\{([^"'\{\}]|"[^"]*"|'[^']*')+\}([^\{\}]|\{\{|\}\}|\{([^"'\{\}]|"[^"]*"|'[^']*')+\})*"
+  }
+# An AVT containing at least one brace; ie where instantiated AVT
+# is not the same as the literal AVT.
+brace-avt.datatype =
+  xsd:string {
+    pattern =
+      "[^\{\}]*(\{\{|\}\}|\{([^"'\{\}]|"[^"]*"|'[^']*')+\})([^\{\}]|\{\{|\}\}|\{([^"'\{\}]|"[^"]*"|'[^']*')+\})*"
+  }
+avt.datatype =
+  xsd:string {
+    pattern =
+      "([^\{\}]|\{\{|\}\}|\{([^"'\{\}]|"[^"]*"|'[^']*')+\})*"
+  }
+
+# TODO: is expr-avt.datatype correct here?
+IDREF-avt = xsd:IDREF | expr-avt.datatype
+anyURI-avt = xsd:anyURI | expr-avt.datatype
+text-avt = text | expr-avt.datatype
+boolean-avt = xsd:boolean | expr-avt.datatype
+nonNegativeInteger-avt = xsd:nonNegativeInteger | expr-avt.datatype
+positiveInteger-avt = xsd:positiveInteger | expr-avt.datatype
+
+xforms.anyElement =
+  element * {
+    (attribute * { text }
+     | text
+     | xforms.anyElement)*
+  }
+xforms.anyXSElement =
+  element xs:* {
+    (attribute * { text }
+     | text
+     | xforms.anyXSElement)*
+  }
+xforms.anyForeignElement = empty
+# Portions Copyright 2004-2005 Brain Attic, L.L.C.
+# Licensed under W3C Software License:
+# http://lists.w3.org/Archives/Public/www-forms/2009Jun/0015.html
+# For changes, see CHANGELOG.txt