namespace local = "" default namespace nvdl = "http://purl.oclc.org/dsdl/nvdl/ns/structure/1.0" start = element rules { (schemaType?, trigger*, (rule* | (attribute startMode { xsd:NCName }, mode+))) & foreign } trigger = element trigger { (attribute ns { xsd:string }, attribute nameList { list { xsd:NCName } }) & foreign } mode = element mode { (attribute name { xsd:NCName }, includedMode*, rule*) & foreign } includedMode = element mode { (attribute name {xsd:NCName}?, includedMode*, rule*) & foreign } rule = element namespace { (attribute ns { xsd:string }, attribute wildCard {xsd:string{maxLength = "1"}}?, ruleModel) & foreign }| element anyNamespace { ruleModel & foreign} ruleModel = attribute match { elementsOrAttributes }?, actions elementsOrAttributes = list { ("elements", "attributes") | ("attributes", "elements") | "elements" | "attributes" } actions = cancelAction | (noResultAction*, (noResultAction|resultAction), noResultAction*) cancelAction = element cancelNestedActions {foreign} noResultAction = element validate { (schemaType?, (message | option)*, schema, modeUsage) & foreign }| element allow|reject { (message*, modeUsage) & foreign } schema = attribute schema { xsd:anyURI } | element schema {(text | foreignElement), foreignAttribute*} message = attribute message {text} | element message {(text, xmlAttribute*), nonXMLForeignAttribute*} resultAction = element attach|attachPlaceholder|unwrap { (message*, modeUsage) & foreign } option = element option { (attribute name { xsd:anyURI }, attribute arg { text }?, attribute mustSupport { xsd:boolean }?) & foreign } modeUsage = (attribute useMode { xsd:NCName } | nestedMode)?, element context { (attribute path { path }, (attribute useMode { xsd:NCName } | nestedMode)? ) & foreign }* nestedMode = element mode { (includedMode*, rule*) & foreign } schemaType = attribute schemaType { mediaType } ## 5.1 of RFC 2045 allows , where ## ## tspecials := "(" / ")" / "<" / ">" / "@" / ## "," / ";" / ":" / "\" / <"> ## "/" / "[" / "]" / "?" / "=" ## mediaType = xsd:string { pattern = "\s*" ~ "[0-9A-Za-z!#$%&'\*\+\-\.\^_`\{\|\}~]*" ~ "\\" ~ "[0-9A-Za-z!#$%&'\*\+\-\.\^_`\{\|\}~]*" ~ "\s*"} path = xsd:string { pattern = "\s*(/\s*)?\i\c*(\s*/\s*\i\c*)*\s*" ~ "(\|\s*(/\s*)?\i\c*(\s*/\s*\i\c*)*\s*)*" } foreignElement = element (* - nvdl:*) {attribute * {text}*, mixed{anyElement*}} anyElement = element * {attribute * {text}*, mixed{anyElement*}} foreignAttribute = attribute * - (nvdl:* | local:*) {text} nonXMLForeignAttribute = attribute * - (xml:* | nvdl:* | local:*) {text} xmlAttribute = attribute xml:lang {text} | attribute xml:space {"default" | "preserve"} | attribute xml:base {xsd:anyURI} foreign = foreignAttribute*, foreignElement*