--- /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