| # This file is part of TagSoup and is Copyright 2002-2008 by John Cowan. |
| # |
| # TagSoup is licensed under the Apache License, |
| # Version 2.0. You may obtain a copy of this license at |
| # http://www.apache.org/licenses/LICENSE-2.0 . You may also have |
| # additional legal rights not granted by this license. |
| # |
| # TagSoup is distributed in the hope that it will be useful, but |
| # unless required by applicable law or agreed to in writing, TagSoup |
| # is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS |
| # OF ANY KIND, either express or implied; not even the implied warranty |
| # of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
| |
| default namespace = "http://www.ccil.org/~cowan/XML/tagsoup/tssl" |
| |
| start = schema |
| |
| ## A TSSL schema has a namespace, which is applied to the elements by default, |
| ## and a name, which is used solely for documentation. It contains entity |
| ## definitions, a root element, and attributes to be applied to all elements. |
| schema = element schema { |
| attribute ns {xsd:anyURI}, |
| attribute prefix {xsd:NCName}, |
| attribute name {xsd:NCName}, |
| attribute version {"1.0"}, |
| entity*, |
| group+, |
| \element, |
| \attribute* |
| } |
| |
| ## An entity has a name and a Unicode codepoint in hex. |
| entity = element entity { |
| attribute name {xsd:NCName}, |
| attribute codepoint {xsd:string} |
| } |
| |
| ## A group is a named group of elements. Every element belongs to one |
| ## or more groups and has a content model consisting of one or more groups. |
| group = element group { |
| attribute id {xsd:ID} |
| } |
| |
| ## An element has a name and a namespace (currently ignored). |
| ## It can have any of several types of content and can be restartable |
| ## or not. The element is also a member of one or more model groups |
| ## (with arbitrary names), and can contain as children zero or more |
| ## model groups. Elements also have attributes and "natural" children. |
| \element = element element { |
| attribute ns {xsd:anyURI}?, |
| attribute name {xsd:NCName}, |
| attribute type {type}, |
| attribute closeMode { "unclosable" | "restartable" }?, |
| attribute text-parent { "true" | "false" }?, |
| (element memberOf { attribute group {xsd:IDREF}}+ | |
| element isRoot { empty} | |
| element memberOfAny { empty }), |
| element contains { attribute group {xsd:IDREF}}*, |
| \attribute*, |
| \element* |
| } |
| |
| ## Here are the attribute types: |
| |
| type = "element" | "any" | "empty" | "mixed" | "string" | "cdata" |
| |
| ## An attribute has a name and a namespace (currently not supported). |
| ## It also has an optional type and an optional default value. |
| \attribute = element attribute { |
| attribute ns {xsd:anyURI}?, |
| attribute name {xsd:NCName}, |
| attribute type {"ID" | "IDREF" | "IDREFS" | "NMTOKEN" | "BOOLEAN"}?, |
| attribute default {xsd:string}? |
| } |
| |