# $Id$
start = publiset
publiset = element publiset {
publiset.attributes,
publiset.content
}
publiset.attributes =
version.attribute
version.attribute = attribute version { "1.0" }
publiset.content =
(composition | selection)+
# =============================================================================
# TOP LEVEL
# =============================================================================
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ composition ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
composition = element composition {
composition.attributes,
composition.content
}
composition.attributes =
composition.id.attribute
& base.attribute?
& remap.attributes
composition.id.attribute = attribute xml:id { xsd:ID }
base.attribute = attribute xml:base { xsd:anyURI }
composition.content =
composition.head?,
(composition.file | composition.division)+
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ selection ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
selection = element selection {
selection.attributes,
selection.content
}
selection.attributes =
base.attribute?
selection.id.attribute = attribute xml:id { xsd:ID }
selection.content =
selection.head?,
(selection.file | selection.division)+
# =============================================================================
# HEAD LEVEL
# =============================================================================
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ head ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
composition.head = element head { head.attributes, top.head.content }
selection.head = element head { top.head.content }
division.head = element head { division.head.content }
head.attributes =
remap.attributes
top.head.content =
(title, subtitle?)?
& language?
& author*
& publisher?
& source?
division.head.content =
(title, subtitle?)?
& language?
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ title, subtitle ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
title = element title { title.content }
subtitle = element subtitle { title.content }
title.content = inlines
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ language ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
language = element language { language.attributes }
language.attributes = lang.attribute
lang.attribute = attribute xml:lang { xsd:language }
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ author, publisher ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# ~~~~~~ author
author = element author { author.content }
author.content =
firstname?,
lastname
# ~~~~~~ publisher
publisher = element publisher { publisher.content }
publisher.content = inlines
# ~~~~~~ firstname
firstname = element firstname { firstname.content }
firstname.content = inlines
# ~~~~~~ lastname
lastname = element lastname { lastname.content }
lastname.content = inlines
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ source ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# ~~~~~~ source
source = element source {
source.attributes,
( (attribute type { "book" }, source.content.book)
| (attribute type { "file" }))
}
source.attributes =
source.id.attribute?
& remap.attributes
source.id.attribute = attribute id { xsd:NMTOKEN }
source.content.book =
title?,
pagenumber?
# ~~~~~~ pagenumber
pagenumber = element pagenumber { pagenumber.attributes }
pagenumber.attributes =
pagenumber.value.attribute
pagenumber.value.attribute = attribute value { pagenumber.value.enumeration }
pagenumber.value.enumeration = xsd:positiveInteger
# =============================================================================
# DIVISION LEVEL
# =============================================================================
composition.division = element division {
composition.division.attributes,
composition.division.content
}
selection.division = element division {
selection.division.attributes,
selection.division.content
}
composition.division.attributes =
base.attribute?
& remap.attributes
selection.division.attributes =
base.attribute?
composition.division.content =
composition.head?,
(composition.division | composition.file)+
selection.division.content =
selection.head?,
(selection.division | selection.file)+
# =============================================================================
# FILE LEVEL
# =============================================================================
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ file ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
composition.file = element file { composition.file.attributes, file.content }
selection.file = element file { selection.file.attributes, file.content }
composition.file.attributes =
xpath.attribute?
& transform.attribute?
& remap.attributes
selection.file.attributes =
xpath.attribute?
& transform.attribute?
xpath.attribute = attribute xpath { text }
transform.attribute =
attribute transform {list { (xsd:token {pattern = "(xsl|regex):\S+"})+ }}
file.content = xsd:anyURI
# =============================================================================
# INLINE LEVEL
# =============================================================================
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ inlines ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
inlines = mixed {
sup*
& sub*
}
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ sub, sup ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
sup = element sup { inlines }
sub = element sub { inlines }
# =============================================================================
# REMAP ATTRIBUTES
# =============================================================================
remap.attributes =
as.attribute?
& attributes.attribute?
as.attribute = attribute as { xsd:QName }
attributes.attribute =
attribute attributes {list { (xsd:token {pattern = "\c+=\S+"})+ }}