# Open Document Format for Office Applications (OpenDocument) Version 1.2
# OASIS Standard, 29 September 2011
# Relax-NG Schema
# Source: http://docs.oasis-open.org/office/v1.2/os/
# Copyright (c) OASIS Open 2002-2011, 2013. All Rights Reserved.
# 
# All capitalized terms in the following text have the meanings assigned to them
# in the OASIS Intellectual Property Rights Policy (the "OASIS IPR Policy"). The
# full Policy may be found at the OASIS website.
# 
# This document and translations of it may be copied and furnished to others, and
# derivative works that comment on or otherwise explain it or assist in its
# implementation may be prepared, copied, published, and distributed, in whole or
# in part, without restriction of any kind, provided that the above copyright
# notice and this section are included on all such copies and derivative works.
# However, this document itself may not be modified in any way, including by
# removing the copyright notice or references to OASIS, except as needed for the
# purpose of developing any document or deliverable produced by an OASIS
# Technical Committee (in which case the rules applicable to copyrights, as set
# forth in the OASIS IPR Policy, must be followed) or as required to translate it
# into languages other than English.
# 
# The limited permissions granted above are perpetual and will not be revoked by
# OASIS or its successors or assigns.
# 
# This document and the information contained herein is provided on an "AS IS"
# basis and OASIS DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT
# LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION HEREIN WILL NOT
# INFRINGE ANY OWNERSHIP RIGHTS OR ANY IMPLIED WARRANTIES OF MERCHANTABILITY OR
# FITNESS FOR A PARTICULAR PURPOSE. 

namespace anim = "urn:oasis:names:tc:opendocument:xmlns:animation:1.0"
namespace chart = "urn:oasis:names:tc:opendocument:xmlns:chart:1.0"
namespace config = "urn:oasis:names:tc:opendocument:xmlns:config:1.0"
namespace db = "urn:oasis:names:tc:opendocument:xmlns:database:1.0"
namespace dc = "http://purl.org/dc/elements/1.1/"
namespace dr3d = "urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0"
namespace draw = "urn:oasis:names:tc:opendocument:xmlns:drawing:1.0"
namespace fo =
  "urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0"
namespace form = "urn:oasis:names:tc:opendocument:xmlns:form:1.0"
namespace grddl = "http://www.w3.org/2003/g/data-view#"
namespace math = "http://www.w3.org/1998/Math/MathML"
namespace meta = "urn:oasis:names:tc:opendocument:xmlns:meta:1.0"
namespace number = "urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0"
namespace office = "urn:oasis:names:tc:opendocument:xmlns:office:1.0"
namespace presentation =
  "urn:oasis:names:tc:opendocument:xmlns:presentation:1.0"
namespace script = "urn:oasis:names:tc:opendocument:xmlns:script:1.0"
namespace smil =
  "urn:oasis:names:tc:opendocument:xmlns:smil-compatible:1.0"
namespace style = "urn:oasis:names:tc:opendocument:xmlns:style:1.0"
namespace svg =
  "urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0"
namespace table = "urn:oasis:names:tc:opendocument:xmlns:table:1.0"
namespace text = "urn:oasis:names:tc:opendocument:xmlns:text:1.0"
namespace xforms = "http://www.w3.org/2002/xforms"
namespace xhtml = "http://www.w3.org/1999/xhtml"
namespace xlink = "http://www.w3.org/1999/xlink"

office-process-content = attribute office:process-content { boolean }?
start =
  office-document
  | office-document-content
  | office-document-styles
  | office-document-meta
  | office-document-settings
office-document =
  element office:document {
    office-document-attrs,
    office-document-common-attrs,
    office-meta,
    office-settings,
    office-scripts,
    office-font-face-decls,
    office-styles,
    office-automatic-styles,
    office-master-styles,
    office-body
  }
office-document-content =
  element office:document-content {
    office-document-common-attrs,
    office-scripts,
    office-font-face-decls,
    office-automatic-styles,
    office-body
  }
office-document-styles =
  element office:document-styles {
    office-document-common-attrs,
    office-font-face-decls,
    office-styles,
    office-automatic-styles,
    office-master-styles
  }
office-document-meta =
  element office:document-meta {
    office-document-common-attrs, office-meta
  }
office-document-settings =
  element office:document-settings {
    office-document-common-attrs, office-settings
  }
office-document-common-attrs =
  attribute office:version { "1.2" }
  & attribute grddl:transformation {
      list { anyIRI* }
    }?
office-document-attrs = attribute office:mimetype { \string }
office-meta = element office:meta { office-meta-content-strict }?
office-meta-content-strict = office-meta-data*
office-body = element office:body { office-body-content }
office-body-content =
  element office:text {
    office-text-attlist,
    office-text-content-prelude,
    office-text-content-main,
    office-text-content-epilogue
  }
  | element office:drawing {
      office-drawing-attlist,
      office-drawing-content-prelude,
      office-drawing-content-main,
      office-drawing-content-epilogue
    }
  | element office:presentation {
      office-presentation-attlist,
      office-presentation-content-prelude,
      office-presentation-content-main,
      office-presentation-content-epilogue
    }
  | element office:spreadsheet {
      office-spreadsheet-attlist,
      office-spreadsheet-content-prelude,
      office-spreadsheet-content-main,
      office-spreadsheet-content-epilogue
    }
  | element office:chart {
      office-chart-attlist,
      office-chart-content-prelude,
      office-chart-content-main,
      office-chart-content-epilogue
    }
  | element office:image {
      office-image-attlist,
      office-image-content-prelude,
      office-image-content-main,
      office-image-content-epilogue
    }
  | office-database
office-text-content-prelude =
  office-forms, text-tracked-changes, text-decls, table-decls
office-text-content-main =
  text-content*
  | (text-page-sequence, (shape)*)
text-content =
  text-h
  | text-p
  | text-list
  | text-numbered-paragraph
  | table-table
  | text-section
  | text-soft-page-break
  | text-table-of-content
  | text-illustration-index
  | text-table-index
  | text-object-index
  | text-user-index
  | text-alphabetical-index
  | text-bibliography
  | shape
  | change-marks
office-text-content-epilogue = table-functions
office-text-attlist =
  attribute text:global { boolean }?
  & attribute text:use-soft-page-breaks { boolean }?
office-drawing-attlist = empty
office-drawing-content-prelude = text-decls, table-decls
office-drawing-content-main = draw-page*
office-drawing-content-epilogue = table-functions
office-presentation-attlist = empty
office-presentation-content-prelude =
  text-decls, table-decls, presentation-decls
office-presentation-content-main = draw-page*
office-presentation-content-epilogue =
  presentation-settings, table-functions
office-spreadsheet-content-prelude =
  table-tracked-changes?, text-decls, table-decls
table-decls =
  table-calculation-settings?,
  table-content-validations?,
  table-label-ranges?
office-spreadsheet-content-main = table-table*
office-spreadsheet-content-epilogue = table-functions
table-functions =
  table-named-expressions?,
  table-database-ranges?,
  table-data-pilot-tables?,
  table-consolidation?,
  table-dde-links?
office-chart-attlist = empty
office-chart-content-prelude = text-decls, table-decls
office-chart-content-main = chart-chart
office-chart-content-epilogue = table-functions
office-image-attlist = empty
office-image-content-prelude = empty
office-image-content-main = draw-frame
office-image-content-epilogue = empty
office-settings = element office:settings { config-config-item-set+ }?
config-config-item-set =
  element config:config-item-set {
    config-config-item-set-attlist, config-items
  }
config-items =
  (config-config-item
   | config-config-item-set
   | config-config-item-map-named
   | config-config-item-map-indexed)+
config-config-item-set-attlist = attribute config:name { \string }
config-config-item =
  element config:config-item { config-config-item-attlist, text }
config-config-item-attlist =
  attribute config:name { \string }
  & attribute config:type {
      "boolean"
      | "short"
      | "int"
      | "long"
      | "double"
      | "string"
      | "datetime"
      | "base64Binary"
    }
config-config-item-map-indexed =
  element config:config-item-map-indexed {
    config-config-item-map-indexed-attlist,
    config-config-item-map-entry+
  }
config-config-item-map-indexed-attlist =
  attribute config:name { \string }
config-config-item-map-entry =
  element config:config-item-map-entry {
    config-config-item-map-entry-attlist, config-items
  }
config-config-item-map-entry-attlist =
  attribute config:name { \string }?
config-config-item-map-named =
  element config:config-item-map-named {
    config-config-item-map-named-attlist, config-config-item-map-entry+
  }
config-config-item-map-named-attlist = attribute config:name { \string }
office-scripts =
  element office:scripts { office-script*, office-event-listeners? }?
office-script =
  element office:script {
    office-script-attlist,
    mixed { anyElements }
  }
office-script-attlist = attribute script:language { \string }
office-font-face-decls =
  element office:font-face-decls { style-font-face* }?
office-styles =
  element office:styles {
    styles
    & style-default-style*
    & style-default-page-layout?
    & text-outline-style?
    & text-notes-configuration*
    & text-bibliography-configuration?
    & text-linenumbering-configuration?
    & draw-gradient*
    & svg-linearGradient*
    & svg-radialGradient*
    & draw-hatch*
    & draw-fill-image*
    & draw-marker*
    & draw-stroke-dash*
    & draw-opacity*
    & style-presentation-page-layout*
    & table-table-template*
  }?
office-automatic-styles =
  element office:automatic-styles { styles & style-page-layout* }?
office-master-styles =
  element office:master-styles {
    style-master-page* & style-handout-master? & draw-layer-set?
  }?
styles =
  style-style*
  & text-list-style*
  & number-number-style*
  & number-currency-style*
  & number-percentage-style*
  & number-date-style*
  & number-time-style*
  & number-boolean-style*
  & number-text-style*
office-meta-data =
  element meta:generator { \string }
  | element dc:title { \string }
  | element dc:description { \string }
  | element dc:subject { \string }
  | element meta:keyword { \string }
  | element meta:initial-creator { \string }
  | dc-creator
  | element meta:printed-by { \string }
  | element meta:creation-date { dateTime }
  | dc-date
  | element meta:print-date { dateTime }
  | element meta:template {
      attribute xlink:type { "simple" },
      attribute xlink:href { anyIRI },
      attribute xlink:actuate { "onRequest" }?,
      attribute xlink:title { \string }?,
      attribute meta:date { dateTime }?
    }
  | element meta:auto-reload {
      (attribute xlink:type { "simple" },
       attribute xlink:href { anyIRI },
       attribute xlink:show { "replace" }?,
       attribute xlink:actuate { "onLoad" }?)?,
      attribute meta:delay { duration }?
    }
  | element meta:hyperlink-behaviour {
      attribute office:target-frame-name { targetFrameName }?,
      attribute xlink:show { "new" | "replace" }?
    }
  | element dc:language { language }
  | element meta:editing-cycles { nonNegativeInteger }
  | element meta:editing-duration { duration }
  | element meta:document-statistic {
      attribute meta:page-count { nonNegativeInteger }?,
      attribute meta:table-count { nonNegativeInteger }?,
      attribute meta:draw-count { nonNegativeInteger }?,
      attribute meta:image-count { nonNegativeInteger }?,
      attribute meta:ole-object-count { nonNegativeInteger }?,
      attribute meta:object-count { nonNegativeInteger }?,
      attribute meta:paragraph-count { nonNegativeInteger }?,
      attribute meta:word-count { nonNegativeInteger }?,
      attribute meta:character-count { nonNegativeInteger }?,
      attribute meta:frame-count { nonNegativeInteger }?,
      attribute meta:sentence-count { nonNegativeInteger }?,
      attribute meta:syllable-count { nonNegativeInteger }?,
      attribute meta:non-whitespace-character-count {
        nonNegativeInteger
      }?,
      attribute meta:row-count { nonNegativeInteger }?,
      attribute meta:cell-count { nonNegativeInteger }?
    }
  | element meta:user-defined {
      attribute meta:name { \string },
      ((attribute meta:value-type { "float" },
        double)
       | (attribute meta:value-type { "date" },
          dateOrDateTime)
       | (attribute meta:value-type { "time" },
          duration)
       | (attribute meta:value-type { "boolean" },
          boolean)
       | (attribute meta:value-type { "string" },
          \string)
       | text)
    }
dc-creator = element dc:creator { \string }
dc-date = element dc:date { dateTime }
text-h =
  element text:h {
    heading-attrs,
    paragraph-attrs,
    text-number?,
    paragraph-content-or-hyperlink*
  }
heading-attrs =
  attribute text:outline-level { positiveInteger }
  & attribute text:restart-numbering { boolean }?
  & attribute text:start-value { nonNegativeInteger }?
  & attribute text:is-list-header { boolean }?
text-number = element text:number { \string }
text-p =
  element text:p { paragraph-attrs, paragraph-content-or-hyperlink* }
paragraph-attrs =
  attribute text:style-name { styleNameRef }?
  & attribute text:class-names { styleNameRefs }?
  & attribute text:cond-style-name { styleNameRef }?
  & (xml-id,
     attribute text:id { NCName }?)?
  & common-in-content-meta-attlist?
text-page-sequence = element text:page-sequence { text-page+ }
text-page = element text:page { text-page-attlist, empty }
text-page-attlist = attribute text:master-page-name { styleNameRef }
text-list =
  element text:list {
    text-list-attr, text-list-header?, text-list-item*
  }
text-list-attr =
  attribute text:style-name { styleNameRef }?
  & attribute text:continue-numbering { boolean }?
  & attribute text:continue-list { IDREF }?
  & xml-id?
text-list-item =
  element text:list-item { text-list-item-attr, text-list-item-content }
text-list-item-content =
  text-number?, (text-p | text-h | text-list | text-soft-page-break)*
text-list-item-attr =
  attribute text:start-value { nonNegativeInteger }?
  & attribute text:style-override { styleNameRef }?
  & xml-id?
text-list-header =
  element text:list-header {
    text-list-header-attr, text-list-item-content
  }
text-list-header-attr = xml-id?
text-numbered-paragraph =
  element text:numbered-paragraph {
    text-numbered-paragraph-attr, text-number?, (text-p | text-h)
  }
text-numbered-paragraph-attr =
  attribute text:list-id { NCName }
  & attribute text:level { positiveInteger }?
  & (attribute text:style-name { styleNameRef },
     attribute text:continue-numbering { boolean },
     attribute text:start-value { nonNegativeInteger })?
  & xml-id?
text-section =
  element text:section {
    text-section-attlist,
    (text-section-source | text-section-source-dde | empty),
    text-content*
  }
text-section-attlist =
  common-section-attlist
  & (attribute text:display { "true" | "none" }
     | (attribute text:display { "condition" },
        attribute text:condition { \string })
     | empty)
common-section-attlist =
  attribute text:style-name { styleNameRef }?
  & attribute text:name { \string }
  & attribute text:protected { boolean }?
  & attribute text:protection-key { \string }?
  & attribute text:protection-key-digest-algorithm { anyIRI }?
  & xml-id?
text-section-source =
  element text:section-source { text-section-source-attr }
text-section-source-attr =
  (attribute xlink:type { "simple" },
   attribute xlink:href { anyIRI },
   attribute xlink:show { "embed" }?)?
  & attribute text:section-name { \string }?
  & attribute text:filter-name { \string }?
text-section-source-dde = office-dde-source
text-tracked-changes =
  element text:tracked-changes {
    text-tracked-changes-attr, text-changed-region*
  }?
text-tracked-changes-attr = attribute text:track-changes { boolean }?
text-changed-region =
  element text:changed-region {
    text-changed-region-attr, text-changed-region-content
  }
text-changed-region-attr =
  xml-id,
  attribute text:id { NCName }?
text-changed-region-content =
  element text:insertion { office-change-info }
  | element text:deletion { office-change-info, text-content* }
  | element text:format-change { office-change-info }
change-marks =
  element text:change { change-mark-attr }
  | element text:change-start { change-mark-attr }
  | element text:change-end { change-mark-attr }
change-mark-attr = attribute text:change-id { IDREF }
text-soft-page-break = element text:soft-page-break { empty }
text-decls =
  element text:variable-decls { text-variable-decl* }?,
  element text:sequence-decls { text-sequence-decl* }?,
  element text:user-field-decls { text-user-field-decl* }?,
  element text:dde-connection-decls { text-dde-connection-decl* }?,
  text-alphabetical-index-auto-mark-file?
paragraph-content-or-hyperlink = paragraph-content | text-a
paragraph-content =
  text
  | element text:s {
      attribute text:c { nonNegativeInteger }?
    }
  | element text:tab { text-tab-attr }
  | element text:line-break { empty }
  | text-soft-page-break
  | element text:span {
      attribute text:style-name { styleNameRef }?,
      attribute text:class-names { styleNameRefs }?,
      paragraph-content-or-hyperlink*
    }
  | element text:meta {
      text-meta-attlist, paragraph-content-or-hyperlink*
    }
  | (text-bookmark | text-bookmark-start | text-bookmark-end)
  | element text:reference-mark {
      attribute text:name { \string }
    }
  | (element text:reference-mark-start {
       attribute text:name { \string }
     }
     | element text:reference-mark-end {
         attribute text:name { \string }
       })
  | element text:note {
      text-note-class,
      attribute text:id { \string }?,
      element text:note-citation {
        attribute text:label { \string }?,
        text
      },
      element text:note-body { text-content* }
    }
  | element text:ruby {
      attribute text:style-name { styleNameRef }?,
      element text:ruby-base { paragraph-content-or-hyperlink* },
      element text:ruby-text {
        attribute text:style-name { styleNameRef }?,
        text
      }
    }
  | (office-annotation | office-annotation-end)
  | change-marks
  | shape
  | element text:date { text-date-attlist, text }
  | element text:time { text-time-attlist, text }
  | element text:page-number { text-page-number-attlist, text }
  | element text:page-continuation {
      text-page-continuation-attlist, text
    }
  | element text:sender-firstname { common-field-fixed-attlist, text }
  | element text:sender-lastname { common-field-fixed-attlist, text }
  | element text:sender-initials { common-field-fixed-attlist, text }
  | element text:sender-title { common-field-fixed-attlist, text }
  | element text:sender-position { common-field-fixed-attlist, text }
  | element text:sender-email { common-field-fixed-attlist, text }
  | element text:sender-phone-private {
      common-field-fixed-attlist, text
    }
  | element text:sender-fax { common-field-fixed-attlist, text }
  | element text:sender-company { common-field-fixed-attlist, text }
  | element text:sender-phone-work { common-field-fixed-attlist, text }
  | element text:sender-street { common-field-fixed-attlist, text }
  | element text:sender-city { common-field-fixed-attlist, text }
  | element text:sender-postal-code { common-field-fixed-attlist, text }
  | element text:sender-country { common-field-fixed-attlist, text }
  | element text:sender-state-or-province {
      common-field-fixed-attlist, text
    }
  | element text:author-name { common-field-fixed-attlist, text }
  | element text:author-initials { common-field-fixed-attlist, text }
  | element text:chapter { text-chapter-attlist, text }
  | element text:file-name { text-file-name-attlist, text }
  | element text:template-name { text-template-name-attlist, text }
  | element text:sheet-name { text }
  | element text:variable-set {
      (common-field-name-attlist
       & common-field-formula-attlist
       & common-value-and-type-attlist
       & common-field-display-value-none-attlist
       & common-field-data-style-name-attlist),
      text
    }
  | element text:variable-get {
      (common-field-name-attlist
       & common-field-display-value-formula-attlist
       & common-field-data-style-name-attlist),
      text
    }
  | element text:variable-input {
      (common-field-name-attlist
       & common-field-description-attlist
       & common-value-type-attlist
       & common-field-display-value-none-attlist
       & common-field-data-style-name-attlist),
      text
    }
  | element text:user-field-get {
      (common-field-name-attlist
       & common-field-display-value-formula-none-attlist
       & common-field-data-style-name-attlist),
      text
    }
  | element text:user-field-input {
      (common-field-name-attlist
       & common-field-description-attlist
       & common-field-data-style-name-attlist),
      text
    }
  | element text:sequence {
      (common-field-name-attlist
       & common-field-formula-attlist
       & common-field-num-format-attlist
       & text-sequence-ref-name),
      text
    }
  | element text:expression {
      (common-field-formula-attlist
       & common-value-and-type-attlist?
       & common-field-display-value-formula-attlist
       & common-field-data-style-name-attlist),
      text
    }
  | element text:text-input { common-field-description-attlist, text }
  | element text:initial-creator { common-field-fixed-attlist, text }
  | element text:creation-date {
      (common-field-fixed-attlist
       & common-field-data-style-name-attlist
       & attribute text:date-value { dateOrDateTime }?),
      text
    }
  | element text:creation-time {
      (common-field-fixed-attlist
       & common-field-data-style-name-attlist
       & attribute text:time-value { timeOrDateTime }?),
      text
    }
  | element text:description { common-field-fixed-attlist, text }
  | element text:user-defined {
      (common-field-fixed-attlist
       & attribute text:name { \string }
       & common-field-data-style-name-attlist
       & attribute office:value { double }?
       & attribute office:date-value { dateOrDateTime }?
       & attribute office:time-value { duration }?
       & attribute office:boolean-value { boolean }?
       & attribute office:string-value { \string }?),
      text
    }
  | element text:print-time {
      (common-field-fixed-attlist
       & common-field-data-style-name-attlist
       & attribute text:time-value { time }?),
      text
    }
  | element text:print-date {
      (common-field-fixed-attlist
       & common-field-data-style-name-attlist
       & attribute text:date-value { date }?),
      text
    }
  | element text:printed-by { common-field-fixed-attlist, text }
  | element text:title { common-field-fixed-attlist, text }
  | element text:subject { common-field-fixed-attlist, text }
  | element text:keywords { common-field-fixed-attlist, text }
  | element text:editing-cycles { common-field-fixed-attlist, text }
  | element text:editing-duration {
      (common-field-fixed-attlist
       & common-field-data-style-name-attlist
       & attribute text:duration { duration }?),
      text
    }
  | element text:modification-time {
      (common-field-fixed-attlist
       & common-field-data-style-name-attlist
       & attribute text:time-value { time }?),
      text
    }
  | element text:modification-date {
      (common-field-fixed-attlist
       & common-field-data-style-name-attlist
       & attribute text:date-value { date }?),
      text
    }
  | element text:creator { common-field-fixed-attlist, text }
  | element text:page-count
            | text:paragraph-count
            | text:word-count
            | text:character-count
            | text:table-count
            | text:image-count
            | text:object-count {
      common-field-num-format-attlist, text
    }
  | element text:database-display {
      text-database-display-attlist, text
    }
  | element text:database-next { text-database-next-attlist }
  | element text:database-row-select {
      text-database-row-select-attlist
    }
  | element text:database-row-number {
      (common-field-database-table
       & common-field-num-format-attlist
       & attribute text:value { nonNegativeInteger }?),
      text
    }
  | element text:database-name { common-field-database-table, text }
  | element text:page-variable-set {
      text-set-page-variable-attlist, text
    }
  | element text:page-variable-get {
      text-get-page-variable-attlist, text
    }
  | element text:placeholder { text-placeholder-attlist, text }
  | element text:conditional-text {
      text-conditional-text-attlist, text
    }
  | element text:hidden-text { text-hidden-text-attlist, text }
  | element text:reference-ref | text:bookmark-ref {
      text-common-ref-content & text-bookmark-ref-content
    }
  | element text:note-ref {
      text-common-ref-content & text-note-ref-content
    }
  | element text:sequence-ref {
      text-common-ref-content & text-sequence-ref-content
    }
  | element text:script {
      ((attribute xlink:type { "simple" },
        attribute xlink:href { anyIRI })
       | text)
      & attribute script:language { \string }?
    }
  | element text:execute-macro {
      attribute text:name { \string }?,
      office-event-listeners?,
      text
    }
  | element text:hidden-paragraph {
      text-hidden-paragraph-attlist, text
    }
  | element text:dde-connection {
      attribute text:connection-name { \string },
      text
    }
  | element text:measure {
      attribute text:kind { "value" | "unit" | "gap" },
      text
    }
  | element text:table-formula {
      (common-field-formula-attlist
       & common-field-display-value-formula-attlist
       & common-field-data-style-name-attlist),
      text
    }
  | element text:meta-field {
      text-meta-field-attlist, paragraph-content-or-hyperlink*
    }
  | element text:toc-mark-start { text-toc-mark-start-attrs }
  | element text:toc-mark-end { text-id }
  | element text:toc-mark {
      attribute text:string-value { \string },
      text-outline-level
    }
  | element text:user-index-mark-start {
      text-id, text-outline-level, text-index-name
    }
  | element text:user-index-mark-end { text-id }
  | element text:user-index-mark {
      attribute text:string-value { \string },
      text-outline-level,
      text-index-name
    }
  | element text:alphabetical-index-mark-start {
      text-id, text-alphabetical-index-mark-attrs
    }
  | element text:alphabetical-index-mark-end { text-id }
  | element text:alphabetical-index-mark {
      attribute text:string-value { \string },
      text-alphabetical-index-mark-attrs
    }
  | element text:bibliography-mark {
      attribute text:bibliography-type { text-bibliography-types },
      attribute text:identifier
                | text:address
                | text:annote
                | text:author
                | text:booktitle
                | text:chapter
                | text:edition
                | text:editor
                | text:howpublished
                | text:institution
                | text:journal
                | text:month
                | text:note
                | text:number
                | text:organizations
                | text:pages
                | text:publisher
                | text:school
                | text:series
                | text:title
                | text:report-type
                | text:volume
                | text:year
                | text:url
                | text:custom1
                | text:custom2
                | text:custom3
                | text:custom4
                | text:custom5
                | text:isbn
                | text:issn { \string }*,
      text
    }
  | element presentation:header { empty }
  | element presentation:footer { empty }
  | element presentation:date-time { empty }
text-tab-attr = attribute text:tab-ref { nonNegativeInteger }?
text-a =
  element text:a {
    text-a-attlist, office-event-listeners?, paragraph-content*
  }
text-a-attlist =
  attribute office:name { \string }?
  & attribute office:title { \string }?
  & attribute xlink:type { "simple" }
  & attribute xlink:href { anyIRI }
  & attribute xlink:actuate { "onRequest" }?
  & attribute office:target-frame-name { targetFrameName }?
  & attribute xlink:show { "new" | "replace" }?
  & attribute text:style-name { styleNameRef }?
  & attribute text:visited-style-name { styleNameRef }?
text-meta-attlist = common-in-content-meta-attlist? & xml-id?
text-bookmark = element text:bookmark { text-bookmark-attlist, empty }
text-bookmark-start =
  element text:bookmark-start { text-bookmark-start-attlist, empty }
text-bookmark-end =
  element text:bookmark-end { text-bookmark-end-attlist, empty }
text-bookmark-attlist =
  attribute text:name { \string }
  & xml-id?
text-bookmark-start-attlist =
  attribute text:name { \string }
  & xml-id?
  & common-in-content-meta-attlist?
text-bookmark-end-attlist = attribute text:name { \string }
text-note-class = attribute text:note-class { "footnote" | "endnote" }
text-date-attlist =
  (common-field-fixed-attlist & common-field-data-style-name-attlist)
  & attribute text:date-value { dateOrDateTime }?
  & attribute text:date-adjust { duration }?
text-time-attlist =
  (common-field-fixed-attlist & common-field-data-style-name-attlist)
  & attribute text:time-value { timeOrDateTime }?
  & attribute text:time-adjust { duration }?
text-page-number-attlist =
  (common-field-num-format-attlist & common-field-fixed-attlist)
  & attribute text:page-adjust { integer }?
  & attribute text:select-page { "previous" | "current" | "next" }?
text-page-continuation-attlist =
  attribute text:select-page { "previous" | "next" }
  & attribute text:string-value { \string }?
text-chapter-attlist =
  attribute text:display {
    "name"
    | "number"
    | "number-and-name"
    | "plain-number-and-name"
    | "plain-number"
  }
  & attribute text:outline-level { nonNegativeInteger }
text-file-name-attlist =
  attribute text:display {
    "full" | "path" | "name" | "name-and-extension"
  }?
  & common-field-fixed-attlist
text-template-name-attlist =
  attribute text:display {
    "full" | "path" | "name" | "name-and-extension" | "area" | "title"
  }?
text-variable-decl =
  element text:variable-decl {
    common-field-name-attlist, common-value-type-attlist
  }
text-user-field-decl =
  element text:user-field-decl {
    common-field-name-attlist,
    common-field-formula-attlist?,
    common-value-and-type-attlist
  }
text-sequence-decl =
  element text:sequence-decl { text-sequence-decl-attlist }
text-sequence-decl-attlist =
  common-field-name-attlist
  & attribute text:display-outline-level { nonNegativeInteger }
  & attribute text:separation-character { character }?
text-sequence-ref-name = attribute text:ref-name { \string }?
common-field-database-table =
  common-field-database-table-attlist, common-field-database-name
common-field-database-name =
  attribute text:database-name { \string }?
  | form-connection-resource
common-field-database-table-attlist =
  attribute text:table-name { \string }
  & attribute text:table-type { "table" | "query" | "command" }?
text-database-display-attlist =
  common-field-database-table
  & common-field-data-style-name-attlist
  & attribute text:column-name { \string }
text-database-next-attlist =
  common-field-database-table
  & attribute text:condition { \string }?
text-database-row-select-attlist =
  common-field-database-table
  & attribute text:condition { \string }?
  & attribute text:row-number { nonNegativeInteger }?
text-set-page-variable-attlist =
  attribute text:active { boolean }?
  & attribute text:page-adjust { integer }?
text-get-page-variable-attlist = common-field-num-format-attlist
text-placeholder-attlist =
  attribute text:placeholder-type {
    "text" | "table" | "text-box" | "image" | "object"
  }
  & common-field-description-attlist
text-conditional-text-attlist =
  attribute text:condition { \string }
  & attribute text:string-value-if-true { \string }
  & attribute text:string-value-if-false { \string }
  & attribute text:current-value { boolean }?
text-hidden-text-attlist =
  attribute text:condition { \string }
  & attribute text:string-value { \string }
  & attribute text:is-hidden { boolean }?
text-common-ref-content =
  text
  & attribute text:ref-name { \string }?
text-bookmark-ref-content =
  attribute text:reference-format {
    common-ref-format-values
    | "number-no-superior"
    | "number-all-superior"
    | "number"
  }?
text-note-ref-content =
  attribute text:reference-format { common-ref-format-values }?
  & text-note-class
text-sequence-ref-content =
  attribute text:reference-format {
    common-ref-format-values
    | "category-and-value"
    | "caption"
    | "value"
  }?
common-ref-format-values = "page" | "chapter" | "direction" | "text"
text-hidden-paragraph-attlist =
  attribute text:condition { \string }
  & attribute text:is-hidden { boolean }?
text-meta-field-attlist = xml-id & common-field-data-style-name-attlist
common-value-type-attlist = attribute office:value-type { valueType }
common-value-and-type-attlist =
  (attribute office:value-type { "float" },
   attribute office:value { double })
  | (attribute office:value-type { "percentage" },
     attribute office:value { double })
  | (attribute office:value-type { "currency" },
     attribute office:value { double },
     attribute office:currency { \string }?)
  | (attribute office:value-type { "date" },
     attribute office:date-value { dateOrDateTime })
  | (attribute office:value-type { "time" },
     attribute office:time-value { duration })
  | (attribute office:value-type { "boolean" },
     attribute office:boolean-value { boolean })
  | (attribute office:value-type { "string" },
     attribute office:string-value { \string }?)
common-field-fixed-attlist = attribute text:fixed { boolean }?
common-field-name-attlist = attribute text:name { variableName }
common-field-description-attlist =
  attribute text:description { \string }?
common-field-display-value-none-attlist =
  attribute text:display { "value" | "none" }?
common-field-display-value-formula-none-attlist =
  attribute text:display { "value" | "formula" | "none" }?
common-field-display-value-formula-attlist =
  attribute text:display { "value" | "formula" }?
common-field-formula-attlist = attribute text:formula { \string }?
common-field-data-style-name-attlist =
  attribute style:data-style-name { styleNameRef }?
common-field-num-format-attlist = common-num-format-attlist?
text-toc-mark-start-attrs = text-id, text-outline-level
text-outline-level = attribute text:outline-level { positiveInteger }?
text-id = attribute text:id { \string }
text-index-name = attribute text:index-name { \string }
text-alphabetical-index-mark-attrs =
  attribute text:key1 { \string }?
  & attribute text:key2 { \string }?
  & attribute text:string-value-phonetic { \string }?
  & attribute text:key1-phonetic { \string }?
  & attribute text:key2-phonetic { \string }?
  & attribute text:main-entry { boolean }?
text-bibliography-types =
  "article"
  | "book"
  | "booklet"
  | "conference"
  | "custom1"
  | "custom2"
  | "custom3"
  | "custom4"
  | "custom5"
  | "email"
  | "inbook"
  | "incollection"
  | "inproceedings"
  | "journal"
  | "manual"
  | "mastersthesis"
  | "misc"
  | "phdthesis"
  | "proceedings"
  | "techreport"
  | "unpublished"
  | "www"
text-index-body = element text:index-body { index-content-main* }
index-content-main = text-content | text-index-title
text-index-title =
  element text:index-title {
    common-section-attlist, index-content-main*
  }
text-table-of-content =
  element text:table-of-content {
    common-section-attlist,
    text-table-of-content-source,
    text-index-body
  }
text-table-of-content-source =
  element text:table-of-content-source {
    text-table-of-content-source-attlist,
    text-index-title-template?,
    text-table-of-content-entry-template*,
    text-index-source-styles*
  }
text-table-of-content-source-attlist =
  attribute text:outline-level { positiveInteger }?
  & attribute text:use-outline-level { boolean }?
  & attribute text:use-index-marks { boolean }?
  & attribute text:use-index-source-styles { boolean }?
  & attribute text:index-scope { "document" | "chapter" }?
  & attribute text:relative-tab-stop-position { boolean }?
text-table-of-content-entry-template =
  element text:table-of-content-entry-template {
    text-table-of-content-entry-template-attlist,
    text-table-of-content-children*
  }
text-table-of-content-children =
  text-index-entry-chapter
  | text-index-entry-page-number
  | text-index-entry-text
  | text-index-entry-span
  | text-index-entry-tab-stop
  | text-index-entry-link-start
  | text-index-entry-link-end
text-table-of-content-entry-template-attlist =
  attribute text:outline-level { positiveInteger }
  & attribute text:style-name { styleNameRef }
text-illustration-index =
  element text:illustration-index {
    common-section-attlist,
    text-illustration-index-source,
    text-index-body
  }
text-illustration-index-source =
  element text:illustration-index-source {
    text-illustration-index-source-attrs,
    text-index-title-template?,
    text-illustration-index-entry-template?
  }
text-illustration-index-source-attrs =
  text-index-scope-attr
  & text-relative-tab-stop-position-attr
  & attribute text:use-caption { boolean }?
  & attribute text:caption-sequence-name { \string }?
  & attribute text:caption-sequence-format {
      "text" | "category-and-value" | "caption"
    }?
text-index-scope-attr =
  attribute text:index-scope { "document" | "chapter" }?
text-relative-tab-stop-position-attr =
  attribute text:relative-tab-stop-position { boolean }?
text-illustration-index-entry-template =
  element text:illustration-index-entry-template {
    text-illustration-index-entry-content
  }
text-illustration-index-entry-content =
  text-illustration-index-entry-template-attrs,
  (text-index-entry-chapter
   | text-index-entry-page-number
   | text-index-entry-text
   | text-index-entry-span
   | text-index-entry-tab-stop)*
text-illustration-index-entry-template-attrs =
  attribute text:style-name { styleNameRef }
text-table-index =
  element text:table-index {
    common-section-attlist, text-table-index-source, text-index-body
  }
text-table-index-source =
  element text:table-index-source {
    text-illustration-index-source-attrs,
    text-index-title-template?,
    text-table-index-entry-template?
  }
text-table-index-entry-template =
  element text:table-index-entry-template {
    text-illustration-index-entry-content
  }
text-object-index =
  element text:object-index {
    common-section-attlist, text-object-index-source, text-index-body
  }
text-object-index-source =
  element text:object-index-source {
    text-object-index-source-attrs,
    text-index-title-template?,
    text-object-index-entry-template?
  }
text-object-index-source-attrs =
  text-index-scope-attr
  & text-relative-tab-stop-position-attr
  & attribute text:use-spreadsheet-objects { boolean }?
  & attribute text:use-math-objects { boolean }?
  & attribute text:use-draw-objects { boolean }?
  & attribute text:use-chart-objects { boolean }?
  & attribute text:use-other-objects { boolean }?
text-object-index-entry-template =
  element text:object-index-entry-template {
    text-illustration-index-entry-content
  }
text-user-index =
  element text:user-index {
    common-section-attlist, text-user-index-source, text-index-body
  }
text-user-index-source =
  element text:user-index-source {
    text-user-index-source-attr,
    text-index-title-template?,
    text-user-index-entry-template*,
    text-index-source-styles*
  }
text-user-index-source-attr =
  text-index-scope-attr
  & text-relative-tab-stop-position-attr
  & attribute text:use-index-marks { boolean }?
  & attribute text:use-index-source-styles { boolean }?
  & attribute text:use-graphics { boolean }?
  & attribute text:use-tables { boolean }?
  & attribute text:use-floating-frames { boolean }?
  & attribute text:use-objects { boolean }?
  & attribute text:copy-outline-levels { boolean }?
  & attribute text:index-name { \string }
text-user-index-entry-template =
  element text:user-index-entry-template {
    text-user-index-entry-template-attrs,
    (text-index-entry-chapter
     | text-index-entry-page-number
     | text-index-entry-text
     | text-index-entry-span
     | text-index-entry-tab-stop)*
  }
text-user-index-entry-template-attrs =
  attribute text:outline-level { positiveInteger }
  & attribute text:style-name { styleNameRef }
text-alphabetical-index =
  element text:alphabetical-index {
    common-section-attlist,
    text-alphabetical-index-source,
    text-index-body
  }
text-alphabetical-index-source =
  element text:alphabetical-index-source {
    text-alphabetical-index-source-attrs,
    text-index-title-template?,
    text-alphabetical-index-entry-template*
  }
text-alphabetical-index-source-attrs =
  text-index-scope-attr
  & text-relative-tab-stop-position-attr
  & attribute text:ignore-case { boolean }?
  & attribute text:main-entry-style-name { styleNameRef }?
  & attribute text:alphabetical-separators { boolean }?
  & attribute text:combine-entries { boolean }?
  & attribute text:combine-entries-with-dash { boolean }?
  & attribute text:combine-entries-with-pp { boolean }?
  & attribute text:use-keys-as-entries { boolean }?
  & attribute text:capitalize-entries { boolean }?
  & attribute text:comma-separated { boolean }?
  & attribute fo:language { languageCode }?
  & attribute fo:country { countryCode }?
  & attribute fo:script { scriptCode }?
  & attribute style:rfc-language-tag { language }?
  & attribute text:sort-algorithm { \string }?
text-alphabetical-index-auto-mark-file =
  element text:alphabetical-index-auto-mark-file {
    attribute xlink:type { "simple" },
    attribute xlink:href { anyIRI }
  }
text-alphabetical-index-entry-template =
  element text:alphabetical-index-entry-template {
    text-alphabetical-index-entry-template-attrs,
    (text-index-entry-chapter
     | text-index-entry-page-number
     | text-index-entry-text
     | text-index-entry-span
     | text-index-entry-tab-stop)*
  }
text-alphabetical-index-entry-template-attrs =
  attribute text:outline-level { "1" | "2" | "3" | "separator" }
  & attribute text:style-name { styleNameRef }
text-bibliography =
  element text:bibliography {
    common-section-attlist, text-bibliography-source, text-index-body
  }
text-bibliography-source =
  element text:bibliography-source {
    text-index-title-template?, text-bibliography-entry-template*
  }
text-bibliography-entry-template =
  element text:bibliography-entry-template {
    text-bibliography-entry-template-attrs,
    (text-index-entry-span
     | text-index-entry-tab-stop
     | text-index-entry-bibliography)*
  }
text-bibliography-entry-template-attrs =
  attribute text:bibliography-type { text-bibliography-types }
  & attribute text:style-name { styleNameRef }
text-index-source-styles =
  element text:index-source-styles {
    attribute text:outline-level { positiveInteger },
    text-index-source-style*
  }
text-index-source-style =
  element text:index-source-style {
    attribute text:style-name { styleName },
    empty
  }
text-index-title-template =
  element text:index-title-template {
    attribute text:style-name { styleNameRef }?,
    text
  }
text-index-entry-chapter =
  element text:index-entry-chapter {
    attribute text:style-name { styleNameRef }?,
    text-index-entry-chapter-attrs
  }
text-index-entry-chapter-attrs =
  attribute text:display {
    "name"
    | "number"
    | "number-and-name"
    | "plain-number"
    | "plain-number-and-name"
  }?
  & attribute text:outline-level { positiveInteger }?
text-index-entry-text =
  element text:index-entry-text {
    attribute text:style-name { styleNameRef }?
  }
text-index-entry-page-number =
  element text:index-entry-page-number {
    attribute text:style-name { styleNameRef }?
  }
text-index-entry-span =
  element text:index-entry-span {
    attribute text:style-name { styleNameRef }?,
    text
  }
text-index-entry-bibliography =
  element text:index-entry-bibliography {
    text-index-entry-bibliography-attrs
  }
text-index-entry-bibliography-attrs =
  attribute text:style-name { styleNameRef }?
  & attribute text:bibliography-data-field {
      "address"
      | "annote"
      | "author"
      | "bibliography-type"
      | "booktitle"
      | "chapter"
      | "custom1"
      | "custom2"
      | "custom3"
      | "custom4"
      | "custom5"
      | "edition"
      | "editor"
      | "howpublished"
      | "identifier"
      | "institution"
      | "isbn"
      | "issn"
      | "journal"
      | "month"
      | "note"
      | "number"
      | "organizations"
      | "pages"
      | "publisher"
      | "report-type"
      | "school"
      | "series"
      | "title"
      | "url"
      | "volume"
      | "year"
    }
text-index-entry-tab-stop =
  element text:index-entry-tab-stop {
    attribute text:style-name { styleNameRef }?,
    text-index-entry-tab-stop-attrs
  }
text-index-entry-tab-stop-attrs =
  attribute style:leader-char { character }?
  & (attribute style:type { "right" }
     | (attribute style:type { "left" },
        attribute style:position { length }))
text-index-entry-link-start =
  element text:index-entry-link-start {
    attribute text:style-name { styleNameRef }?
  }
text-index-entry-link-end =
  element text:index-entry-link-end {
    attribute text:style-name { styleNameRef }?
  }
table-table =
  element table:table {
    table-table-attlist,
    table-title?,
    table-desc?,
    table-table-source?,
    office-dde-source?,
    table-scenario?,
    office-forms?,
    table-shapes?,
    table-columns-and-groups,
    table-rows-and-groups,
    table-named-expressions?
  }
table-columns-and-groups =
  (table-table-column-group | table-columns-no-group)+
table-columns-no-group =
  (table-columns, (table-table-header-columns, table-columns?)?)
  | (table-table-header-columns, table-columns?)
table-columns = table-table-columns | table-table-column+
table-rows-and-groups = (table-table-row-group | table-rows-no-group)+
table-rows-no-group =
  (table-rows, (table-table-header-rows, table-rows?)?)
  | (table-table-header-rows, table-rows?)
table-rows =
  table-table-rows | (text-soft-page-break?, table-table-row)+
table-table-attlist =
  attribute table:name { \string }?
  & attribute table:style-name { styleNameRef }?
  & attribute table:template-name { \string }?
  & attribute table:use-first-row-styles { boolean }?
  & attribute table:use-last-row-styles { boolean }?
  & attribute table:use-first-column-styles { boolean }?
  & attribute table:use-last-column-styles { boolean }?
  & attribute table:use-banding-rows-styles { boolean }?
  & attribute table:use-banding-columns-styles { boolean }?
  & attribute table:protected { boolean }?
  & attribute table:protection-key { \string }?
  & attribute table:protection-key-digest-algorithm { anyIRI }?
  & attribute table:print { boolean }?
  & attribute table:print-ranges { cellRangeAddressList }?
  & xml-id?
  & attribute table:is-sub-table { boolean }?
table-title = element table:title { text }
table-desc = element table:desc { text }
table-table-row =
  element table:table-row {
    table-table-row-attlist,
    (table-table-cell | table-covered-table-cell)+
  }
table-table-row-attlist =
  attribute table:number-rows-repeated { positiveInteger }?
  & attribute table:style-name { styleNameRef }?
  & attribute table:default-cell-style-name { styleNameRef }?
  & attribute table:visibility { table-visibility-value }?
  & xml-id?
table-visibility-value = "visible" | "collapse" | "filter"
table-table-cell =
  element table:table-cell {
    table-table-cell-attlist,
    table-table-cell-attlist-extra,
    table-table-cell-content
  }
table-covered-table-cell =
  element table:covered-table-cell {
    table-table-cell-attlist, table-table-cell-content
  }
table-table-cell-content =
  table-cell-range-source?,
  office-annotation?,
  table-detective?,
  text-content*
table-table-cell-attlist =
  attribute table:number-columns-repeated { positiveInteger }?
  & attribute table:style-name { styleNameRef }?
  & attribute table:content-validation-name { \string }?
  & attribute table:formula { \string }?
  & common-value-and-type-attlist?
  & attribute table:protect { boolean }?
  & attribute table:protected { boolean }?
  & xml-id?
  & common-in-content-meta-attlist?
table-table-cell-attlist-extra =
  attribute table:number-columns-spanned { positiveInteger }?
  & attribute table:number-rows-spanned { positiveInteger }?
  & attribute table:number-matrix-columns-spanned { positiveInteger }?
  & attribute table:number-matrix-rows-spanned { positiveInteger }?
table-table-column =
  element table:table-column { table-table-column-attlist, empty }
table-table-column-attlist =
  attribute table:number-columns-repeated { positiveInteger }?
  & attribute table:style-name { styleNameRef }?
  & attribute table:visibility { table-visibility-value }?
  & attribute table:default-cell-style-name { styleNameRef }?
  & xml-id?
table-table-header-columns =
  element table:table-header-columns { table-table-column+ }
table-table-columns =
  element table:table-columns { table-table-column+ }
table-table-column-group =
  element table:table-column-group {
    table-table-column-group-attlist, table-columns-and-groups
  }
table-table-column-group-attlist = attribute table:display { boolean }?
table-table-header-rows =
  element table:table-header-rows {
    (text-soft-page-break?, table-table-row)+
  }
table-table-rows =
  element table:table-rows { (text-soft-page-break?, table-table-row)+ }
table-table-row-group =
  element table:table-row-group {
    table-table-row-group-attlist, table-rows-and-groups
  }
table-table-row-group-attlist = attribute table:display { boolean }?
cellAddress =
  xsd:string {
    pattern = "($?([^\. ']+|'([^']|'')+'))?\.$?[A-Z]+$?[0-9]+"
  }
cellRangeAddress =
  xsd:string {
    pattern =
      "($?([^\. ']+|'([^']|'')+'))?\.$?[A-Z]+$?[0-9]+(:($?([^\. ']+|'([^']|'')+'))?\.$?[A-Z]+$?[0-9]+)?"
  }
  | xsd:string {
      pattern =
        "($?([^\. ']+|'([^']|'')+'))?\.$?[0-9]+:($?([^\. ']+|'([^']|'')+'))?\.$?[0-9]+"
    }
  | xsd:string {
      pattern =
        "($?([^\. ']+|'([^']|'')+'))?\.$?[A-Z]+:($?([^\. ']+|'([^']|'')+'))?\.$?[A-Z]+"
    }
cellRangeAddressList =
  xsd:string
  >> dc:description [
       'Value is a space separated list of "cellRangeAddress" patterns'
     ]
table-table-source =
  element table:table-source {
    table-table-source-attlist, table-linked-source-attlist, empty
  }
table-table-source-attlist =
  attribute table:mode { "copy-all" | "copy-results-only" }?
  & attribute table:table-name { \string }?
table-linked-source-attlist =
  attribute xlink:type { "simple" }
  & attribute xlink:href { anyIRI }
  & attribute xlink:actuate { "onRequest" }?
  & attribute table:filter-name { \string }?
  & attribute table:filter-options { \string }?
  & attribute table:refresh-delay { duration }?
table-scenario =
  element table:scenario { table-scenario-attlist, empty }
table-scenario-attlist =
  attribute table:scenario-ranges { cellRangeAddressList }
  & attribute table:is-active { boolean }
  & attribute table:display-border { boolean }?
  & attribute table:border-color { color }?
  & attribute table:copy-back { boolean }?
  & attribute table:copy-styles { boolean }?
  & attribute table:copy-formulas { boolean }?
  & attribute table:comment { \string }?
  & attribute table:protected { boolean }?
table-shapes = element table:shapes { shape+ }
table-cell-range-source =
  element table:cell-range-source {
    table-table-cell-range-source-attlist,
    table-linked-source-attlist,
    empty
  }
table-table-cell-range-source-attlist =
  attribute table:name { \string }
  & attribute table:last-column-spanned { positiveInteger }
  & attribute table:last-row-spanned { positiveInteger }
table-detective =
  element table:detective { table-highlighted-range*, table-operation* }
table-operation =
  element table:operation { table-operation-attlist, empty }
table-operation-attlist =
  attribute table:name {
    "trace-dependents"
    | "remove-dependents"
    | "trace-precedents"
    | "remove-precedents"
    | "trace-errors"
  }
  & attribute table:index { nonNegativeInteger }
table-highlighted-range =
  element table:highlighted-range {
    (table-highlighted-range-attlist
     | table-highlighted-range-attlist-invalid),
    empty
  }
table-highlighted-range-attlist =
  attribute table:cell-range-address { cellRangeAddress }?
  & attribute table:direction {
      "from-another-table" | "to-another-table" | "from-same-table"
    }
  & attribute table:contains-error { boolean }?
table-highlighted-range-attlist-invalid =
  attribute table:marked-invalid { boolean }
office-spreadsheet-attlist =
  attribute table:structure-protected { boolean }?,
  attribute table:protection-key { \string }?,
  attribute table:protection-key-digest-algorithm { anyIRI }?
table-calculation-settings =
  element table:calculation-settings {
    table-calculation-setting-attlist,
    table-null-date?,
    table-iteration?
  }
table-calculation-setting-attlist =
  attribute table:case-sensitive { boolean }?
  & attribute table:precision-as-shown { boolean }?
  & attribute table:search-criteria-must-apply-to-whole-cell {
      boolean
    }?
  & attribute table:automatic-find-labels { boolean }?
  & attribute table:use-regular-expressions { boolean }?
  & attribute table:use-wildcards { boolean }?
  & attribute table:null-year { positiveInteger }?
table-null-date =
  element table:null-date {
    attribute table:value-type { "date" }?,
    attribute table:date-value { date }?,
    empty
  }
table-iteration =
  element table:iteration {
    attribute table:status { "enable" | "disable" }?,
    attribute table:steps { positiveInteger }?,
    attribute table:maximum-difference { double }?,
    empty
  }
table-content-validations =
  element table:content-validations { table-content-validation+ }
table-content-validation =
  element table:content-validation {
    table-validation-attlist,
    table-help-message?,
    (table-error-message | (table-error-macro, office-event-listeners))?
  }
table-validation-attlist =
  attribute table:name { \string }
  & attribute table:condition { \string }?
  & attribute table:base-cell-address { cellAddress }?
  & attribute table:allow-empty-cell { boolean }?
  & attribute table:display-list {
      "none" | "unsorted" | "sort-ascending"
    }?
table-help-message =
  element table:help-message {
    attribute table:title { \string }?,
    attribute table:display { boolean }?,
    text-p*
  }
table-error-message =
  element table:error-message {
    attribute table:title { \string }?,
    attribute table:display { boolean }?,
    attribute table:message-type {
      "stop" | "warning" | "information"
    }?,
    text-p*
  }
table-error-macro =
  element table:error-macro {
    attribute table:execute { boolean }?
  }
table-label-ranges = element table:label-ranges { table-label-range* }
table-label-range =
  element table:label-range { table-label-range-attlist, empty }
table-label-range-attlist =
  attribute table:label-cell-range-address { cellRangeAddress }
  & attribute table:data-cell-range-address { cellRangeAddress }
  & attribute table:orientation { "column" | "row" }
table-named-expressions =
  element table:named-expressions {
    (table-named-range | table-named-expression)*
  }
table-named-range =
  element table:named-range { table-named-range-attlist, empty }
table-named-range-attlist =
  attribute table:name { \string },
  attribute table:cell-range-address { cellRangeAddress },
  attribute table:base-cell-address { cellAddress }?,
  attribute table:range-usable-as {
    "none"
    | list {
        ("print-range" | "filter" | "repeat-row" | "repeat-column")+
      }
  }?
table-named-expression =
  element table:named-expression {
    table-named-expression-attlist, empty
  }
table-named-expression-attlist =
  attribute table:name { \string },
  attribute table:expression { \string },
  attribute table:base-cell-address { cellAddress }?
table-database-ranges =
  element table:database-ranges { table-database-range* }
table-database-range =
  element table:database-range {
    table-database-range-attlist,
    (table-database-source-sql
     | table-database-source-table
     | table-database-source-query)?,
    table-filter?,
    table-sort?,
    table-subtotal-rules?
  }
table-database-range-attlist =
  attribute table:name { \string }?
  & attribute table:is-selection { boolean }?
  & attribute table:on-update-keep-styles { boolean }?
  & attribute table:on-update-keep-size { boolean }?
  & attribute table:has-persistent-data { boolean }?
  & attribute table:orientation { "column" | "row" }?
  & attribute table:contains-header { boolean }?
  & attribute table:display-filter-buttons { boolean }?
  & attribute table:target-range-address { cellRangeAddress }
  & attribute table:refresh-delay { boolean }?
table-database-source-sql =
  element table:database-source-sql {
    table-database-source-sql-attlist, empty
  }
table-database-source-sql-attlist =
  attribute table:database-name { \string }
  & attribute table:sql-statement { \string }
  & attribute table:parse-sql-statement { boolean }?
table-database-source-query =
  element table:database-source-table {
    table-database-source-table-attlist, empty
  }
table-database-source-table-attlist =
  attribute table:database-name { \string }
  & attribute table:database-table-name { \string }
table-database-source-table =
  element table:database-source-query {
    table-database-source-query-attlist, empty
  }
table-database-source-query-attlist =
  attribute table:database-name { \string }
  & attribute table:query-name { \string }
table-sort = element table:sort { table-sort-attlist, table-sort-by+ }
table-sort-attlist =
  attribute table:bind-styles-to-content { boolean }?
  & attribute table:target-range-address { cellRangeAddress }?
  & attribute table:case-sensitive { boolean }?
  & attribute table:language { languageCode }?
  & attribute table:country { countryCode }?
  & attribute table:script { scriptCode }?
  & attribute table:rfc-language-tag { language }?
  & attribute table:algorithm { \string }?
  & attribute table:embedded-number-behavior {
      "alpha-numeric" | "integer" | "double"
    }?
table-sort-by = element table:sort-by { table-sort-by-attlist, empty }
table-sort-by-attlist =
  attribute table:field-number { nonNegativeInteger }
  & attribute table:data-type {
      "text" | "number" | "automatic" | \string
    }?
  & attribute table:order { "ascending" | "descending" }?
table-subtotal-rules =
  element table:subtotal-rules {
    table-subtotal-rules-attlist,
    table-sort-groups?,
    table-subtotal-rule*
  }
table-subtotal-rules-attlist =
  attribute table:bind-styles-to-content { boolean }?
  & attribute table:case-sensitive { boolean }?
  & attribute table:page-breaks-on-group-change { boolean }?
table-sort-groups =
  element table:sort-groups { table-sort-groups-attlist, empty }
table-sort-groups-attlist =
  attribute table:data-type {
    "text" | "number" | "automatic" | \string
  }?
  & attribute table:order { "ascending" | "descending" }?
table-subtotal-rule =
  element table:subtotal-rule {
    table-subtotal-rule-attlist, table-subtotal-field*
  }
table-subtotal-rule-attlist =
  attribute table:group-by-field-number { nonNegativeInteger }
table-subtotal-field =
  element table:subtotal-field { table-subtotal-field-attlist, empty }
table-subtotal-field-attlist =
  attribute table:field-number { nonNegativeInteger }
  & attribute table:function {
      "average"
      | "count"
      | "countnums"
      | "max"
      | "min"
      | "product"
      | "stdev"
      | "stdevp"
      | "sum"
      | "var"
      | "varp"
      | \string
    }
table-filter =
  element table:filter {
    table-filter-attlist,
    (table-filter-condition | table-filter-and | table-filter-or)
  }
table-filter-attlist =
  attribute table:target-range-address { cellRangeAddress }?
  & attribute table:condition-source { "self" | "cell-range" }?
  & attribute table:condition-source-range-address { cellRangeAddress }?
  & attribute table:display-duplicates { boolean }?
table-filter-and =
  element table:filter-and {
    (table-filter-or | table-filter-condition)+
  }
table-filter-or =
  element table:filter-or {
    (table-filter-and | table-filter-condition)+
  }
table-filter-condition =
  element table:filter-condition {
    table-filter-condition-attlist, table-filter-set-item*
  }
table-filter-condition-attlist =
  attribute table:field-number { nonNegativeInteger }
  & attribute table:value { \string | double }
  & attribute table:operator { \string }
  & attribute table:case-sensitive { \string }?
  & attribute table:data-type { "text" | "number" }?
table-filter-set-item =
  element table:filter-set-item {
    attribute table:value { \string },
    empty
  }
table-data-pilot-tables =
  element table:data-pilot-tables { table-data-pilot-table* }
table-data-pilot-table =
  element table:data-pilot-table {
    table-data-pilot-table-attlist,
    (table-database-source-sql
     | table-database-source-table
     | table-database-source-query
     | table-source-service
     | table-source-cell-range)?,
    table-data-pilot-field+
  }
table-data-pilot-table-attlist =
  attribute table:name { \string }
  & attribute table:application-data { \string }?
  & attribute table:grand-total { "none" | "row" | "column" | "both" }?
  & attribute table:ignore-empty-rows { boolean }?
  & attribute table:identify-categories { boolean }?
  & attribute table:target-range-address { cellRangeAddress }
  & attribute table:buttons { cellRangeAddressList }?
  & attribute table:show-filter-button { boolean }?
  & attribute table:drill-down-on-double-click { boolean }?
table-source-cell-range =
  element table:source-cell-range {
    table-source-cell-range-attlist, table-filter?
  }
table-source-cell-range-attlist =
  attribute table:cell-range-address { cellRangeAddress }
table-source-service =
  element table:source-service { table-source-service-attlist, empty }
table-source-service-attlist =
  attribute table:name { \string }
  & attribute table:source-name { \string }
  & attribute table:object-name { \string }
  & attribute table:user-name { \string }?
  & attribute table:password { \string }?
table-data-pilot-field =
  element table:data-pilot-field {
    table-data-pilot-field-attlist,
    table-data-pilot-level?,
    table-data-pilot-field-reference?,
    table-data-pilot-groups?
  }
table-data-pilot-field-attlist =
  attribute table:source-field-name { \string }
  & (attribute table:orientation {
       "row" | "column" | "data" | "hidden"
     }
     | (attribute table:orientation { "page" },
        attribute table:selected-page { \string }))
  & attribute table:is-data-layout-field { \string }?
  & attribute table:function {
      "auto"
      | "average"
      | "count"
      | "countnums"
      | "max"
      | "min"
      | "product"
      | "stdev"
      | "stdevp"
      | "sum"
      | "var"
      | "varp"
      | \string
    }?
  & attribute table:used-hierarchy { integer }?
table-data-pilot-level =
  element table:data-pilot-level {
    table-data-pilot-level-attlist,
    table-data-pilot-subtotals?,
    table-data-pilot-members?,
    table-data-pilot-display-info?,
    table-data-pilot-sort-info?,
    table-data-pilot-layout-info?
  }
table-data-pilot-level-attlist = attribute table:show-empty { boolean }?
table-data-pilot-subtotals =
  element table:data-pilot-subtotals { table-data-pilot-subtotal* }
table-data-pilot-subtotal =
  element table:data-pilot-subtotal {
    table-data-pilot-subtotal-attlist, empty
  }
table-data-pilot-subtotal-attlist =
  attribute table:function {
    "auto"
    | "average"
    | "count"
    | "countnums"
    | "max"
    | "min"
    | "product"
    | "stdev"
    | "stdevp"
    | "sum"
    | "var"
    | "varp"
    | \string
  }
table-data-pilot-members =
  element table:data-pilot-members { table-data-pilot-member* }
table-data-pilot-member =
  element table:data-pilot-member {
    table-data-pilot-member-attlist, empty
  }
table-data-pilot-member-attlist =
  attribute table:name { \string }
  & attribute table:display { boolean }?
  & attribute table:show-details { boolean }?
table-data-pilot-display-info =
  element table:data-pilot-display-info {
    table-data-pilot-display-info-attlist, empty
  }
table-data-pilot-display-info-attlist =
  attribute table:enabled { boolean }
  & attribute table:data-field { \string }
  & attribute table:member-count { nonNegativeInteger }
  & attribute table:display-member-mode { "from-top" | "from-bottom" }
table-data-pilot-sort-info =
  element table:data-pilot-sort-info {
    table-data-pilot-sort-info-attlist, empty
  }
table-data-pilot-sort-info-attlist =
  ((attribute table:sort-mode { "data" },
    attribute table:data-field { \string })
   | attribute table:sort-mode { "none" | "manual" | "name" })
  & attribute table:order { "ascending" | "descending" }
table-data-pilot-layout-info =
  element table:data-pilot-layout-info {
    table-data-pilot-layout-info-attlist, empty
  }
table-data-pilot-layout-info-attlist =
  attribute table:layout-mode {
    "tabular-layout"
    | "outline-subtotals-top"
    | "outline-subtotals-bottom"
  }
  & attribute table:add-empty-lines { boolean }
table-data-pilot-field-reference =
  element table:data-pilot-field-reference {
    table-data-pilot-field-reference-attlist
  }
table-data-pilot-field-reference-attlist =
  attribute table:field-name { \string }
  & ((attribute table:member-type { "named" },
      attribute table:member-name { \string })
     | attribute table:member-type { "previous" | "next" })
  & attribute table:type {
      "none"
      | "member-difference"
      | "member-percentage"
      | "member-percentage-difference"
      | "running-total"
      | "row-percentage"
      | "column-percentage"
      | "total-percentage"
      | "index"
    }
table-data-pilot-groups =
  element table:data-pilot-groups {
    table-data-pilot-groups-attlist, table-data-pilot-group+
  }
table-data-pilot-groups-attlist =
  attribute table:source-field-name { \string }
  & (attribute table:date-start { dateOrDateTime | "auto" }
     | attribute table:start { double | "auto" })
  & (attribute table:date-end { dateOrDateTime | "auto" }
     | attribute table:end { double | "auto" })
  & attribute table:step { double }
  & attribute table:grouped-by {
      "seconds"
      | "minutes"
      | "hours"
      | "days"
      | "months"
      | "quarters"
      | "years"
    }
table-data-pilot-group =
  element table:data-pilot-group {
    table-data-pilot-group-attlist, table-data-pilot-group-member+
  }
table-data-pilot-group-attlist = attribute table:name { \string }
table-data-pilot-group-member =
  element table:data-pilot-group-member {
    table-data-pilot-group-member-attlist
  }
table-data-pilot-group-member-attlist = attribute table:name { \string }
table-consolidation =
  element table:consolidation { table-consolidation-attlist, empty }
table-consolidation-attlist =
  attribute table:function {
    "average"
    | "count"
    | "countnums"
    | "max"
    | "min"
    | "product"
    | "stdev"
    | "stdevp"
    | "sum"
    | "var"
    | "varp"
    | \string
  }
  & attribute table:source-cell-range-addresses { cellRangeAddressList }
  & attribute table:target-cell-address { cellAddress }
  & attribute table:use-labels { "none" | "row" | "column" | "both" }?
  & attribute table:link-to-source-data { boolean }?
table-dde-links = element table:dde-links { table-dde-link+ }
table-tracked-changes =
  element table:tracked-changes {
    table-tracked-changes-attlist,
    (table-cell-content-change
     | table-insertion
     | table-deletion
     | table-movement)*
  }
table-tracked-changes-attlist =
  attribute table:track-changes { boolean }?
table-insertion =
  element table:insertion {
    table-insertion-attlist,
    common-table-change-attlist,
    office-change-info,
    table-dependencies?,
    table-deletions?
  }
table-insertion-attlist =
  attribute table:type { "row" | "column" | "table" }
  & attribute table:position { integer }
  & attribute table:count { positiveInteger }?
  & attribute table:table { integer }?
table-dependencies = element table:dependencies { table-dependency+ }
table-dependency =
  element table:dependency {
    attribute table:id { \string },
    empty
  }
table-deletions =
  element table:deletions {
    (table-cell-content-deletion | table-change-deletion)+
  }
table-cell-content-deletion =
  element table:cell-content-deletion {
    attribute table:id { \string }?,
    table-cell-address?,
    table-change-track-table-cell?
  }
table-change-deletion =
  element table:change-deletion {
    attribute table:id { \string }?,
    empty
  }
table-deletion =
  element table:deletion {
    table-deletion-attlist,
    common-table-change-attlist,
    office-change-info,
    table-dependencies?,
    table-deletions?,
    table-cut-offs?
  }
table-deletion-attlist =
  attribute table:type { "row" | "column" | "table" }
  & attribute table:position { integer }
  & attribute table:table { integer }?
  & attribute table:multi-deletion-spanned { integer }?
table-cut-offs =
  element table:cut-offs {
    table-movement-cut-off+
    | (table-insertion-cut-off, table-movement-cut-off*)
  }
table-insertion-cut-off =
  element table:insertion-cut-off {
    table-insertion-cut-off-attlist, empty
  }
table-insertion-cut-off-attlist =
  attribute table:id { \string }
  & attribute table:position { integer }
table-movement-cut-off =
  element table:movement-cut-off {
    table-movement-cut-off-attlist, empty
  }
table-movement-cut-off-attlist =
  attribute table:position { integer }
  | (attribute table:start-position { integer },
     attribute table:end-position { integer })
table-movement =
  element table:movement {
    common-table-change-attlist,
    table-source-range-address,
    table-target-range-address,
    office-change-info,
    table-dependencies?,
    table-deletions?
  }
table-source-range-address =
  element table:source-range-address {
    common-table-range-attlist, empty
  }
table-target-range-address =
  element table:target-range-address {
    common-table-range-attlist, empty
  }
common-table-range-attlist =
  common-table-cell-address-attlist
  | common-table-cell-range-address-attlist
common-table-cell-address-attlist =
  attribute table:column { integer },
  attribute table:row { integer },
  attribute table:table { integer }
common-table-cell-range-address-attlist =
  attribute table:start-column { integer },
  attribute table:start-row { integer },
  attribute table:start-table { integer },
  attribute table:end-column { integer },
  attribute table:end-row { integer },
  attribute table:end-table { integer }
table-change-track-table-cell =
  element table:change-track-table-cell {
    table-change-track-table-cell-attlist, text-p*
  }
table-change-track-table-cell-attlist =
  attribute table:cell-address { cellAddress }?
  & attribute table:matrix-covered { boolean }?
  & attribute table:formula { \string }?
  & attribute table:number-matrix-columns-spanned { positiveInteger }?
  & attribute table:number-matrix-rows-spanned { positiveInteger }?
  & common-value-and-type-attlist?
table-cell-content-change =
  element table:cell-content-change {
    common-table-change-attlist,
    table-cell-address,
    office-change-info,
    table-dependencies?,
    table-deletions?,
    table-previous
  }
table-cell-address =
  element table:cell-address {
    common-table-cell-address-attlist, empty
  }
table-previous =
  element table:previous {
    attribute table:id { \string }?,
    table-change-track-table-cell
  }
common-table-change-attlist =
  attribute table:id { \string }
  & attribute table:acceptance-state {
      "accepted" | "rejected" | "pending"
    }?
  & attribute table:rejecting-change-id { \string }?
style-handout-master =
  element style:handout-master {
    common-presentation-header-footer-attlist,
    style-handout-master-attlist,
    shape*
  }
style-handout-master-attlist =
  attribute presentation:presentation-page-layout-name { styleNameRef }?
  & attribute style:page-layout-name { styleNameRef }
  & attribute draw:style-name { styleNameRef }?
draw-layer-set = element draw:layer-set { draw-layer* }
draw-layer =
  element draw:layer { draw-layer-attlist, svg-title?, svg-desc? }
draw-layer-attlist =
  attribute draw:name { \string }
  & attribute draw:protected { boolean }?
  & attribute draw:display { "always" | "screen" | "printer" | "none" }?
draw-page =
  element draw:page {
    common-presentation-header-footer-attlist,
    draw-page-attlist,
    svg-title?,
    svg-desc?,
    draw-layer-set?,
    office-forms?,
    shape*,
    (presentation-animations | animation-element)?,
    presentation-notes?
  }
draw-page-attlist =
  attribute draw:name { \string }?
  & attribute draw:style-name { styleNameRef }?
  & attribute draw:master-page-name { styleNameRef }
  & attribute presentation:presentation-page-layout-name {
      styleNameRef
    }?
  & (xml-id,
     attribute draw:id { NCName }?)?
  & attribute draw:nav-order { IDREFS }?
common-presentation-header-footer-attlist =
  attribute presentation:use-header-name { \string }?
  & attribute presentation:use-footer-name { \string }?
  & attribute presentation:use-date-time-name { \string }?
shape = shape-instance | draw-a
shape-instance =
  draw-rect
  | draw-line
  | draw-polyline
  | draw-polygon
  | draw-regular-polygon
  | draw-path
  | draw-circle
  | draw-ellipse
  | draw-g
  | draw-page-thumbnail
  | draw-frame
  | draw-measure
  | draw-caption
  | draw-connector
  | draw-control
  | dr3d-scene
  | draw-custom-shape
draw-rect =
  element draw:rect {
    draw-rect-attlist,
    common-draw-position-attlist,
    common-draw-size-attlist,
    common-draw-shape-with-text-and-styles-attlist,
    common-draw-caption-id-attlist,
    svg-title?,
    svg-desc?,
    office-event-listeners?,
    draw-glue-point*,
    draw-text
  }
draw-rect-attlist =
  attribute draw:corner-radius { nonNegativeLength }?
  | (attribute svg:rx { nonNegativeLength }?,
     attribute svg:ry { nonNegativeLength }?)
draw-line =
  element draw:line {
    draw-line-attlist,
    common-draw-shape-with-text-and-styles-attlist,
    common-draw-caption-id-attlist,
    svg-title?,
    svg-desc?,
    office-event-listeners?,
    draw-glue-point*,
    draw-text
  }
draw-line-attlist =
  attribute svg:x1 { coordinate }
  & attribute svg:y1 { coordinate }
  & attribute svg:x2 { coordinate }
  & attribute svg:y2 { coordinate }
draw-polyline =
  element draw:polyline {
    common-draw-points-attlist,
    common-draw-position-attlist,
    common-draw-size-attlist,
    common-draw-viewbox-attlist,
    common-draw-shape-with-text-and-styles-attlist,
    common-draw-caption-id-attlist,
    svg-title?,
    svg-desc?,
    office-event-listeners?,
    draw-glue-point*,
    draw-text
  }
common-draw-points-attlist = attribute draw:points { points }
draw-polygon =
  element draw:polygon {
    common-draw-points-attlist,
    common-draw-position-attlist,
    common-draw-size-attlist,
    common-draw-viewbox-attlist,
    common-draw-shape-with-text-and-styles-attlist,
    common-draw-caption-id-attlist,
    svg-title?,
    svg-desc?,
    office-event-listeners?,
    draw-glue-point*,
    draw-text
  }
draw-regular-polygon =
  element draw:regular-polygon {
    draw-regular-polygon-attlist,
    common-draw-position-attlist,
    common-draw-size-attlist,
    common-draw-shape-with-text-and-styles-attlist,
    common-draw-caption-id-attlist,
    svg-title?,
    svg-desc?,
    office-event-listeners?,
    draw-glue-point*,
    draw-text
  }
draw-regular-polygon-attlist =
  (attribute draw:concave { "false" }
   | (attribute draw:concave { "true" },
      draw-regular-polygon-sharpness-attlist))
  & attribute draw:corners { positiveInteger }
draw-regular-polygon-sharpness-attlist =
  attribute draw:sharpness { percent }
draw-path =
  element draw:path {
    common-draw-path-data-attlist,
    common-draw-position-attlist,
    common-draw-size-attlist,
    common-draw-viewbox-attlist,
    common-draw-shape-with-text-and-styles-attlist,
    common-draw-caption-id-attlist,
    svg-title?,
    svg-desc?,
    office-event-listeners?,
    draw-glue-point*,
    draw-text
  }
common-draw-path-data-attlist = attribute svg:d { pathData }
draw-circle =
  element draw:circle {
    ((draw-circle-attlist, common-draw-circle-ellipse-pos-attlist)
     | (common-draw-position-attlist, common-draw-size-attlist)),
    common-draw-circle-ellipse-attlist,
    common-draw-shape-with-text-and-styles-attlist,
    common-draw-caption-id-attlist,
    svg-title?,
    svg-desc?,
    office-event-listeners?,
    draw-glue-point*,
    draw-text
  }
common-draw-circle-ellipse-pos-attlist =
  attribute svg:cx { coordinate },
  attribute svg:cy { coordinate }
draw-circle-attlist = attribute svg:r { length }
common-draw-circle-ellipse-attlist =
  attribute draw:kind { "full" | "section" | "cut" | "arc" }?
  & attribute draw:start-angle { angle }?
  & attribute draw:end-angle { angle }?
draw-ellipse =
  element draw:ellipse {
    ((draw-ellipse-attlist, common-draw-circle-ellipse-pos-attlist)
     | (common-draw-position-attlist, common-draw-size-attlist)),
    common-draw-circle-ellipse-attlist,
    common-draw-shape-with-text-and-styles-attlist,
    common-draw-caption-id-attlist,
    svg-title?,
    svg-desc?,
    office-event-listeners?,
    draw-glue-point*,
    draw-text
  }
draw-ellipse-attlist =
  attribute svg:rx { length },
  attribute svg:ry { length }
draw-connector =
  element draw:connector {
    draw-connector-attlist,
    common-draw-shape-with-text-and-styles-attlist,
    common-draw-caption-id-attlist,
    common-draw-viewbox-attlist,
    svg-title?,
    svg-desc?,
    office-event-listeners?,
    draw-glue-point*,
    draw-text
  }
draw-connector-attlist =
  attribute draw:type { "standard" | "lines" | "line" | "curve" }?
  & (attribute svg:x1 { coordinate },
     attribute svg:y1 { coordinate })?
  & attribute draw:start-shape { IDREF }?
  & attribute draw:start-glue-point { nonNegativeInteger }?
  & (attribute svg:x2 { coordinate },
     attribute svg:y2 { coordinate })?
  & attribute draw:end-shape { IDREF }?
  & attribute draw:end-glue-point { nonNegativeInteger }?
  & attribute draw:line-skew {
      list { length, (length, length?)? }
    }?
  & attribute svg:d { pathData }?
draw-caption =
  element draw:caption {
    draw-caption-attlist,
    common-draw-position-attlist,
    common-draw-size-attlist,
    common-draw-shape-with-text-and-styles-attlist,
    common-draw-caption-id-attlist,
    svg-title?,
    svg-desc?,
    office-event-listeners?,
    draw-glue-point*,
    draw-text
  }
draw-caption-attlist =
  (attribute draw:caption-point-x { coordinate },
   attribute draw:caption-point-y { coordinate })?
  & attribute draw:corner-radius { nonNegativeLength }?
draw-measure =
  element draw:measure {
    draw-measure-attlist,
    common-draw-shape-with-text-and-styles-attlist,
    common-draw-caption-id-attlist,
    svg-title?,
    svg-desc?,
    office-event-listeners?,
    draw-glue-point*,
    draw-text
  }
draw-measure-attlist =
  attribute svg:x1 { coordinate }
  & attribute svg:y1 { coordinate }
  & attribute svg:x2 { coordinate }
  & attribute svg:y2 { coordinate }
draw-control =
  element draw:control {
    draw-control-attlist,
    common-draw-position-attlist,
    common-draw-size-attlist,
    common-draw-shape-with-text-and-styles-attlist,
    common-draw-caption-id-attlist,
    svg-title?,
    svg-desc?,
    draw-glue-point*
  }
draw-control-attlist = attribute draw:control { IDREF }
draw-page-thumbnail =
  element draw:page-thumbnail {
    draw-page-thumbnail-attlist,
    common-draw-position-attlist,
    common-draw-size-attlist,
    presentation-shape-attlist,
    common-draw-shape-with-styles-attlist,
    common-draw-caption-id-attlist,
    svg-title?,
    svg-desc?
  }
draw-page-thumbnail-attlist =
  attribute draw:page-number { positiveInteger }?
draw-g =
  element draw:g {
    draw-g-attlist,
    common-draw-z-index-attlist,
    common-draw-name-attlist,
    common-draw-id-attlist,
    common-draw-style-name-attlist,
    common-text-spreadsheet-shape-attlist,
    common-draw-caption-id-attlist,
    svg-title?,
    svg-desc?,
    office-event-listeners?,
    draw-glue-point*,
    shape*
  }
draw-g-attlist = attribute svg:y { coordinate }?
common-draw-name-attlist = attribute draw:name { \string }?
common-draw-caption-id-attlist = attribute draw:caption-id { IDREF }?
common-draw-position-attlist =
  attribute svg:x { coordinate }?,
  attribute svg:y { coordinate }?
common-draw-size-attlist =
  attribute svg:width { length }?,
  attribute svg:height { length }?
common-draw-transform-attlist = attribute draw:transform { \string }?
common-draw-viewbox-attlist =
  attribute svg:viewBox {
    list { integer, integer, integer, integer }
  }
common-draw-style-name-attlist =
  (attribute draw:style-name { styleNameRef }?,
   attribute draw:class-names { styleNameRefs }?)
  | (attribute presentation:style-name { styleNameRef }?,
     attribute presentation:class-names { styleNameRefs }?)
common-draw-text-style-name-attlist =
  attribute draw:text-style-name { styleNameRef }?
common-draw-layer-name-attlist = attribute draw:layer { \string }?
common-draw-id-attlist =
  (xml-id,
   attribute draw:id { NCName }?)?
common-draw-z-index-attlist =
  attribute draw:z-index { nonNegativeInteger }?
common-text-spreadsheet-shape-attlist =
  attribute table:end-cell-address { cellAddress }?
  & attribute table:end-x { coordinate }?
  & attribute table:end-y { coordinate }?
  & attribute table:table-background { boolean }?
  & common-text-anchor-attlist
common-text-anchor-attlist =
  attribute text:anchor-type {
    "page" | "frame" | "paragraph" | "char" | "as-char"
  }?
  & attribute text:anchor-page-number { positiveInteger }?
draw-text = (text-p | text-list)*
common-draw-shape-with-styles-attlist =
  common-draw-z-index-attlist,
  common-draw-id-attlist,
  common-draw-layer-name-attlist,
  common-draw-style-name-attlist,
  common-draw-transform-attlist,
  common-draw-name-attlist,
  common-text-spreadsheet-shape-attlist
common-draw-shape-with-text-and-styles-attlist =
  common-draw-shape-with-styles-attlist,
  common-draw-text-style-name-attlist
draw-glue-point =
  element draw:glue-point { draw-glue-point-attlist, empty }
draw-glue-point-attlist =
  attribute draw:id { nonNegativeInteger }
  & attribute svg:x { distance | percent }
  & attribute svg:y { distance | percent }
  & attribute draw:align {
      "top-left"
      | "top"
      | "top-right"
      | "left"
      | "center"
      | "right"
      | "bottom-left"
      | "bottom-right"
    }?
  & attribute draw:escape-direction {
      "auto"
      | "left"
      | "right"
      | "up"
      | "down"
      | "horizontal"
      | "vertical"
    }
svg-title = element svg:title { text }
svg-desc = element svg:desc { text }
draw-frame =
  element draw:frame {
    common-draw-shape-with-text-and-styles-attlist,
    common-draw-position-attlist,
    common-draw-rel-size-attlist,
    common-draw-caption-id-attlist,
    presentation-shape-attlist,
    draw-frame-attlist,
    (draw-text-box
     | draw-image
     | draw-object
     | draw-object-ole
     | draw-applet
     | draw-floating-frame
     | draw-plugin
     | table-table)*,
    office-event-listeners?,
    draw-glue-point*,
    draw-image-map?,
    svg-title?,
    svg-desc?,
    (draw-contour-polygon | draw-contour-path)?
  }
common-draw-rel-size-attlist =
  common-draw-size-attlist,
  attribute style:rel-width { percent | "scale" | "scale-min" }?,
  attribute style:rel-height { percent | "scale" | "scale-min" }?
draw-frame-attlist = attribute draw:copy-of { \string }?
draw-text-box =
  element draw:text-box { draw-text-box-attlist, text-content* }
draw-text-box-attlist =
  attribute draw:chain-next-name { \string }?
  & attribute draw:corner-radius { nonNegativeLength }?
  & attribute fo:min-height { length | percent }?
  & attribute fo:min-width { length | percent }?
  & attribute fo:max-height { length | percent }?
  & attribute fo:max-width { length | percent }?
  & (xml-id,
     attribute text:id { NCName }?)?
draw-image =
  element draw:image {
    draw-image-attlist,
    (common-draw-data-attlist | office-binary-data),
    draw-text
  }
common-draw-data-attlist =
  attribute xlink:type { "simple" },
  attribute xlink:href { anyIRI },
  attribute xlink:show { "embed" }?,
  attribute xlink:actuate { "onLoad" }?
office-binary-data = element office:binary-data { base64Binary }
draw-image-attlist =
  attribute draw:filter-name { \string }?
  & xml-id?
draw-object =
  element draw:object {
    draw-object-attlist,
    (common-draw-data-attlist | office-document | math-math)
  }
draw-object-ole =
  element draw:object-ole {
    draw-object-ole-attlist,
    (common-draw-data-attlist | office-binary-data)
  }
draw-object-attlist =
  attribute draw:notify-on-update-of-ranges {
    cellRangeAddressList | \string
  }?
  & xml-id?
draw-object-ole-attlist =
  attribute draw:class-id { \string }?
  & xml-id?
draw-applet =
  element draw:applet {
    draw-applet-attlist, common-draw-data-attlist?, draw-param*
  }
draw-applet-attlist =
  attribute draw:code { \string }?
  & attribute draw:object { \string }?
  & attribute draw:archive { \string }?
  & attribute draw:may-script { boolean }?
  & xml-id?
draw-plugin =
  element draw:plugin {
    draw-plugin-attlist, common-draw-data-attlist, draw-param*
  }
draw-plugin-attlist =
  attribute draw:mime-type { \string }?
  & xml-id?
draw-param = element draw:param { draw-param-attlist, empty }
draw-param-attlist =
  attribute draw:name { \string }?
  & attribute draw:value { \string }?
draw-floating-frame =
  element draw:floating-frame {
    draw-floating-frame-attlist, common-draw-data-attlist
  }
draw-floating-frame-attlist =
  attribute draw:frame-name { \string }?
  & xml-id?
draw-contour-polygon =
  element draw:contour-polygon {
    common-contour-attlist,
    common-draw-size-attlist,
    common-draw-viewbox-attlist,
    common-draw-points-attlist,
    empty
  }
draw-contour-path =
  element draw:contour-path {
    common-contour-attlist,
    common-draw-size-attlist,
    common-draw-viewbox-attlist,
    common-draw-path-data-attlist,
    empty
  }
common-contour-attlist = attribute draw:recreate-on-edit { boolean }
draw-a = element draw:a { draw-a-attlist, shape-instance }
draw-a-attlist =
  attribute xlink:type { "simple" }
  & attribute xlink:href { anyIRI }
  & attribute xlink:actuate { "onRequest" }?
  & attribute office:target-frame-name { targetFrameName }?
  & attribute xlink:show { "new" | "replace" }?
  & attribute office:name { \string }?
  & attribute office:title { \string }?
  & attribute office:server-map { boolean }?
  & xml-id?
draw-image-map =
  element draw:image-map {
    (draw-area-rectangle | draw-area-circle | draw-area-polygon)*
  }
draw-area-rectangle =
  element draw:area-rectangle {
    common-draw-area-attlist,
    attribute svg:x { coordinate },
    attribute svg:y { coordinate },
    attribute svg:width { length },
    attribute svg:height { length },
    svg-title?,
    svg-desc?,
    office-event-listeners?
  }
draw-area-circle =
  element draw:area-circle {
    common-draw-area-attlist,
    attribute svg:cx { coordinate },
    attribute svg:cy { coordinate },
    attribute svg:r { length },
    svg-title?,
    svg-desc?,
    office-event-listeners?
  }
draw-area-polygon =
  element draw:area-polygon {
    common-draw-area-attlist,
    attribute svg:x { coordinate },
    attribute svg:y { coordinate },
    attribute svg:width { length },
    attribute svg:height { length },
    common-draw-viewbox-attlist,
    common-draw-points-attlist,
    svg-title?,
    svg-desc?,
    office-event-listeners?
  }
common-draw-area-attlist =
  (attribute xlink:type { "simple" },
   attribute xlink:href { anyIRI },
   attribute office:target-frame-name { targetFrameName }?,
   attribute xlink:show { "new" | "replace" }?)?
  & attribute office:name { \string }?
  & attribute draw:nohref { "nohref" }?
dr3d-scene =
  element dr3d:scene {
    dr3d-scene-attlist,
    common-draw-position-attlist,
    common-draw-size-attlist,
    common-draw-style-name-attlist,
    common-draw-z-index-attlist,
    common-draw-id-attlist,
    common-draw-layer-name-attlist,
    common-text-spreadsheet-shape-attlist,
    common-dr3d-transform-attlist,
    common-draw-caption-id-attlist,
    svg-title?,
    svg-desc?,
    dr3d-light*,
    shapes3d*,
    draw-glue-point*
  }
shapes3d =
  dr3d-scene | dr3d-extrude | dr3d-sphere | dr3d-rotate | dr3d-cube
dr3d-scene-attlist =
  attribute dr3d:vrp { vector3D }?
  & attribute dr3d:vpn { vector3D }?
  & attribute dr3d:vup { vector3D }?
  & attribute dr3d:projection { "parallel" | "perspective" }?
  & attribute dr3d:distance { length }?
  & attribute dr3d:focal-length { length }?
  & attribute dr3d:shadow-slant { angle }?
  & attribute dr3d:shade-mode {
      "flat" | "phong" | "gouraud" | "draft"
    }?
  & attribute dr3d:ambient-color { color }?
  & attribute dr3d:lighting-mode { boolean }?
common-dr3d-transform-attlist = attribute dr3d:transform { \string }?
dr3d-light = element dr3d:light { dr3d-light-attlist, empty }
dr3d-light-attlist =
  attribute dr3d:diffuse-color { color }?
  & attribute dr3d:direction { vector3D }
  & attribute dr3d:enabled { boolean }?
  & attribute dr3d:specular { boolean }?
dr3d-cube =
  element dr3d:cube {
    dr3d-cube-attlist,
    common-draw-z-index-attlist,
    common-draw-id-attlist,
    common-draw-layer-name-attlist,
    common-draw-style-name-attlist,
    common-dr3d-transform-attlist,
    empty
  }
dr3d-cube-attlist =
  attribute dr3d:min-edge { vector3D }?,
  attribute dr3d:max-edge { vector3D }?
dr3d-sphere =
  element dr3d:sphere {
    dr3d-sphere-attlist,
    common-draw-z-index-attlist,
    common-draw-id-attlist,
    common-draw-layer-name-attlist,
    common-draw-style-name-attlist,
    common-dr3d-transform-attlist,
    empty
  }
dr3d-sphere-attlist =
  attribute dr3d:center { vector3D }?
  & attribute dr3d:size { vector3D }?
dr3d-extrude =
  element dr3d:extrude {
    common-draw-path-data-attlist,
    common-draw-viewbox-attlist,
    common-draw-id-attlist,
    common-draw-z-index-attlist,
    common-draw-layer-name-attlist,
    common-draw-style-name-attlist,
    common-dr3d-transform-attlist,
    empty
  }
dr3d-rotate =
  element dr3d:rotate {
    common-draw-viewbox-attlist,
    common-draw-path-data-attlist,
    common-draw-z-index-attlist,
    common-draw-id-attlist,
    common-draw-layer-name-attlist,
    common-draw-style-name-attlist,
    common-dr3d-transform-attlist,
    empty
  }
draw-custom-shape =
  element draw:custom-shape {
    draw-custom-shape-attlist,
    common-draw-position-attlist,
    common-draw-size-attlist,
    common-draw-shape-with-text-and-styles-attlist,
    common-draw-caption-id-attlist,
    svg-title?,
    svg-desc?,
    office-event-listeners?,
    draw-glue-point*,
    draw-text,
    draw-enhanced-geometry?
  }
draw-custom-shape-attlist =
  attribute draw:engine { namespacedToken }?
  & attribute draw:data { \string }?
draw-enhanced-geometry =
  element draw:enhanced-geometry {
    draw-enhanced-geometry-attlist, draw-equation*, draw-handle*
  }
draw-enhanced-geometry-attlist =
  attribute draw:type { custom-shape-type }?
  & attribute svg:viewBox {
      list { integer, integer, integer, integer }
    }?
  & attribute draw:mirror-vertical { boolean }?
  & attribute draw:mirror-horizontal { boolean }?
  & attribute draw:text-rotate-angle { angle }?
  & attribute draw:extrusion-allowed { boolean }?
  & attribute draw:text-path-allowed { boolean }?
  & attribute draw:concentric-gradient-fill-allowed { boolean }?
  & attribute draw:extrusion { boolean }?
  & attribute draw:extrusion-brightness { zeroToHundredPercent }?
  & attribute draw:extrusion-depth {
      list { length, double }
    }?
  & attribute draw:extrusion-diffusion { percent }?
  & attribute draw:extrusion-number-of-line-segments { integer }?
  & attribute draw:extrusion-light-face { boolean }?
  & attribute draw:extrusion-first-light-harsh { boolean }?
  & attribute draw:extrusion-second-light-harsh { boolean }?
  & attribute draw:extrusion-first-light-level { zeroToHundredPercent }?
  & attribute draw:extrusion-second-light-level {
      zeroToHundredPercent
    }?
  & attribute draw:extrusion-first-light-direction { vector3D }?
  & attribute draw:extrusion-second-light-direction { vector3D }?
  & attribute draw:extrusion-metal { boolean }?
  & attribute dr3d:shade-mode {
      "flat" | "phong" | "gouraud" | "draft"
    }?
  & attribute draw:extrusion-rotation-angle {
      list { angle, angle }
    }?
  & attribute draw:extrusion-rotation-center { vector3D }?
  & attribute draw:extrusion-shininess { zeroToHundredPercent }?
  & attribute draw:extrusion-skew {
      list { double, angle }
    }?
  & attribute draw:extrusion-specularity { zeroToHundredPercent }?
  & attribute dr3d:projection { "parallel" | "perspective" }?
  & attribute draw:extrusion-viewpoint { point3D }?
  & attribute draw:extrusion-origin {
      list { extrusionOrigin, extrusionOrigin }
    }?
  & attribute draw:extrusion-color { boolean }?
  & attribute draw:enhanced-path { \string }?
  & attribute draw:path-stretchpoint-x { double }?
  & attribute draw:path-stretchpoint-y { double }?
  & attribute draw:text-areas { \string }?
  & attribute draw:glue-points { \string }?
  & attribute draw:glue-point-type {
      "none" | "segments" | "rectangle"
    }?
  & attribute draw:glue-point-leaving-directions { \string }?
  & attribute draw:text-path { boolean }?
  & attribute draw:text-path-mode { "normal" | "path" | "shape" }?
  & attribute draw:text-path-scale { "path" | "shape" }?
  & attribute draw:text-path-same-letter-heights { boolean }?
  & attribute draw:modifiers { \string }?
custom-shape-type = "non-primitive" | \string
point3D =
  xsd:string {
    pattern =
      "\([ ]*-?([0-9]+(\.[0-9]*)?|\.[0-9]+)((cm)|(mm)|(in)|(pt)|(pc))([ ]+-?([0-9]+(\.[0-9]*)?|\.[0-9]+)((cm)|(mm)|(in)|(pt)|(pc))){2}[ ]*\)"
  }
extrusionOrigin =
  xsd:double { minInclusive = "-0.5" maxInclusive = "0.5" }
draw-equation = element draw:equation { draw-equation-attlist, empty }
draw-equation-attlist =
  attribute draw:name { \string }?
  & attribute draw:formula { \string }?
draw-handle = element draw:handle { draw-handle-attlist, empty }
draw-handle-attlist =
  attribute draw:handle-mirror-vertical { boolean }?
  & attribute draw:handle-mirror-horizontal { boolean }?
  & attribute draw:handle-switched { boolean }?
  & attribute draw:handle-position { \string }
  & attribute draw:handle-range-x-minimum { \string }?
  & attribute draw:handle-range-x-maximum { \string }?
  & attribute draw:handle-range-y-minimum { \string }?
  & attribute draw:handle-range-y-maximum { \string }?
  & attribute draw:handle-polar { \string }?
  & attribute draw:handle-radius-range-minimum { \string }?
  & attribute draw:handle-radius-range-maximum { \string }?
presentation-shape-attlist =
  attribute presentation:class { presentation-classes }?
  & attribute presentation:placeholder { boolean }?
  & attribute presentation:user-transformed { boolean }?
presentation-classes =
  "title"
  | "outline"
  | "subtitle"
  | "text"
  | "graphic"
  | "object"
  | "chart"
  | "table"
  | "orgchart"
  | "page"
  | "notes"
  | "handout"
  | "header"
  | "footer"
  | "date-time"
  | "page-number"
presentation-animations =
  element presentation:animations {
    (presentation-animation-elements | presentation-animation-group)*
  }
presentation-animation-elements =
  presentation-show-shape
  | presentation-show-text
  | presentation-hide-shape
  | presentation-hide-text
  | presentation-dim
  | presentation-play
presentation-sound =
  element presentation:sound {
    presentation-sound-attlist,
    attribute xlink:type { "simple" },
    attribute xlink:href { anyIRI },
    attribute xlink:actuate { "onRequest" }?,
    attribute xlink:show { "new" | "replace" }?,
    empty
  }
presentation-sound-attlist =
  attribute presentation:play-full { boolean }?
  & xml-id?
presentation-show-shape =
  element presentation:show-shape {
    common-presentation-effect-attlist, presentation-sound?
  }
common-presentation-effect-attlist =
  attribute draw:shape-id { IDREF }
  & attribute presentation:effect { presentationEffects }?
  & attribute presentation:direction { presentationEffectDirections }?
  & attribute presentation:speed { presentationSpeeds }?
  & attribute presentation:delay { duration }?
  & attribute presentation:start-scale { percent }?
  & attribute presentation:path-id { \string }?
presentationEffects =
  "none"
  | "fade"
  | "move"
  | "stripes"
  | "open"
  | "close"
  | "dissolve"
  | "wavyline"
  | "random"
  | "lines"
  | "laser"
  | "appear"
  | "hide"
  | "move-short"
  | "checkerboard"
  | "rotate"
  | "stretch"
presentationEffectDirections =
  "none"
  | "from-left"
  | "from-top"
  | "from-right"
  | "from-bottom"
  | "from-center"
  | "from-upper-left"
  | "from-upper-right"
  | "from-lower-left"
  | "from-lower-right"
  | "to-left"
  | "to-top"
  | "to-right"
  | "to-bottom"
  | "to-upper-left"
  | "to-upper-right"
  | "to-lower-right"
  | "to-lower-left"
  | "path"
  | "spiral-inward-left"
  | "spiral-inward-right"
  | "spiral-outward-left"
  | "spiral-outward-right"
  | "vertical"
  | "horizontal"
  | "to-center"
  | "clockwise"
  | "counter-clockwise"
presentationSpeeds = "slow" | "medium" | "fast"
presentation-show-text =
  element presentation:show-text {
    common-presentation-effect-attlist, presentation-sound?
  }
presentation-hide-shape =
  element presentation:hide-shape {
    common-presentation-effect-attlist, presentation-sound?
  }
presentation-hide-text =
  element presentation:hide-text {
    common-presentation-effect-attlist, presentation-sound?
  }
presentation-dim =
  element presentation:dim {
    presentation-dim-attlist, presentation-sound?
  }
presentation-dim-attlist =
  attribute draw:shape-id { IDREF }
  & attribute draw:color { color }
presentation-play =
  element presentation:play { presentation-play-attlist, empty }
presentation-play-attlist =
  attribute draw:shape-id { IDREF },
  attribute presentation:speed { presentationSpeeds }?
presentation-animation-group =
  element presentation:animation-group {
    presentation-animation-elements*
  }
common-anim-attlist =
  attribute presentation:node-type {
    "default"
    | "on-click"
    | "with-previous"
    | "after-previous"
    | "timing-root"
    | "main-sequence"
    | "interactive-sequence"
  }?
  & attribute presentation:preset-id { \string }?
  & attribute presentation:preset-sub-type { \string }?
  & attribute presentation:preset-class {
      "custom"
      | "entrance"
      | "exit"
      | "emphasis"
      | "motion-path"
      | "ole-action"
      | "media-call"
    }?
  & attribute presentation:master-element { IDREF }?
  & attribute presentation:group-id { \string }?
  & (xml-id,
     attribute anim:id { NCName }?)?
presentation-event-listener =
  element presentation:event-listener {
    presentation-event-listener-attlist, presentation-sound?
  }
presentation-event-listener-attlist =
  attribute script:event-name { \string }
  & attribute presentation:action {
      "none"
      | "previous-page"
      | "next-page"
      | "first-page"
      | "last-page"
      | "hide"
      | "stop"
      | "execute"
      | "show"
      | "verb"
      | "fade-out"
      | "sound"
      | "last-visited-page"
    }
  & attribute presentation:effect { presentationEffects }?
  & attribute presentation:direction { presentationEffectDirections }?
  & attribute presentation:speed { presentationSpeeds }?
  & attribute presentation:start-scale { percent }?
  & (attribute xlink:type { "simple" },
     attribute xlink:href { anyIRI },
     attribute xlink:show { "embed" }?,
     attribute xlink:actuate { "onRequest" }?)?
  & attribute presentation:verb { nonNegativeInteger }?
presentation-decls = presentation-decl*
presentation-decl =
  element presentation:header-decl {
    presentation-header-decl-attlist, text
  }
  | element presentation:footer-decl {
      presentation-footer-decl-attlist, text
    }
  | element presentation:date-time-decl {
      presentation-date-time-decl-attlist, text
    }
presentation-header-decl-attlist =
  attribute presentation:name { \string }
presentation-footer-decl-attlist =
  attribute presentation:name { \string }
presentation-date-time-decl-attlist =
  attribute presentation:name { \string }
  & attribute presentation:source { "fixed" | "current-date" }
  & attribute style:data-style-name { styleNameRef }?
presentation-settings =
  element presentation:settings {
    presentation-settings-attlist, presentation-show*
  }?
presentation-settings-attlist =
  attribute presentation:start-page { \string }?
  & attribute presentation:show { \string }?
  & attribute presentation:full-screen { boolean }?
  & attribute presentation:endless { boolean }?
  & attribute presentation:pause { duration }?
  & attribute presentation:show-logo { boolean }?
  & attribute presentation:force-manual { boolean }?
  & attribute presentation:mouse-visible { boolean }?
  & attribute presentation:mouse-as-pen { boolean }?
  & attribute presentation:start-with-navigator { boolean }?
  & attribute presentation:animations { "enabled" | "disabled" }?
  & attribute presentation:transition-on-click {
      "enabled" | "disabled"
    }?
  & attribute presentation:stay-on-top { boolean }?
  & attribute presentation:show-end-of-presentation-slide { boolean }?
presentation-show =
  element presentation:show { presentation-show-attlist, empty }
presentation-show-attlist =
  attribute presentation:name { \string }
  & attribute presentation:pages { \string }
chart-chart =
  element chart:chart {
    chart-chart-attlist,
    chart-title?,
    chart-subtitle?,
    chart-footer?,
    chart-legend?,
    chart-plot-area,
    table-table?
  }
chart-chart-attlist =
  attribute chart:class { namespacedToken }
  & common-draw-size-attlist
  & attribute chart:column-mapping { \string }?
  & attribute chart:row-mapping { \string }?
  & attribute chart:style-name { styleNameRef }?
  & (attribute xlink:type { "simple" },
     attribute xlink:href { anyIRI })?
  & xml-id?
chart-title = element chart:title { chart-title-attlist, text-p? }
chart-title-attlist =
  attribute table:cell-range { cellRangeAddressList }?
  & common-draw-position-attlist
  & attribute chart:style-name { styleNameRef }?
chart-subtitle = element chart:subtitle { chart-title-attlist, text-p? }
chart-footer = element chart:footer { chart-title-attlist, text-p? }
chart-legend = element chart:legend { chart-legend-attlist, text-p? }
chart-legend-attlist =
  ((attribute chart:legend-position {
      "start" | "end" | "top" | "bottom"
    },
    attribute chart:legend-align { "start" | "center" | "end" }?)
   | attribute chart:legend-position {
       "top-start" | "bottom-start" | "top-end" | "bottom-end"
     }
   | empty)
  & common-draw-position-attlist
  & (attribute style:legend-expansion { "wide" | "high" | "balanced" }
     | (attribute style:legend-expansion { "custom" },
        attribute style:legend-expansion-aspect-ratio { double })
     | empty)
  & attribute chart:style-name { styleNameRef }?
chart-plot-area =
  element chart:plot-area {
    chart-plot-area-attlist,
    dr3d-light*,
    chart-axis*,
    chart-series*,
    chart-stock-gain-marker?,
    chart-stock-loss-marker?,
    chart-stock-range-line?,
    chart-wall?,
    chart-floor?
  }
chart-plot-area-attlist =
  common-draw-position-attlist
  & common-draw-size-attlist
  & attribute chart:style-name { styleNameRef }?
  & attribute table:cell-range-address { cellRangeAddressList }?
  & attribute chart:data-source-has-labels {
      "none" | "row" | "column" | "both"
    }?
  & dr3d-scene-attlist
  & common-dr3d-transform-attlist
  & xml-id?
chart-wall = element chart:wall { chart-wall-attlist, empty }
chart-wall-attlist =
  attribute svg:width { length }?
  & attribute chart:style-name { styleNameRef }?
chart-floor = element chart:floor { chart-floor-attlist, empty }
chart-floor-attlist =
  attribute svg:width { length }?
  & attribute chart:style-name { styleNameRef }?
chart-axis =
  element chart:axis {
    chart-axis-attlist, chart-title?, chart-categories?, chart-grid*
  }
chart-axis-attlist =
  attribute chart:dimension { chart-dimension }
  & attribute chart:name { \string }?
  & attribute chart:style-name { styleNameRef }?
chart-dimension = "x" | "y" | "z"
chart-categories =
  element chart:categories {
    attribute table:cell-range-address { cellRangeAddressList }?
  }
chart-grid = element chart:grid { chart-grid-attlist }
chart-grid-attlist =
  attribute chart:class { "major" | "minor" }?
  & attribute chart:style-name { styleNameRef }?
chart-series =
  element chart:series {
    chart-series-attlist,
    chart-domain*,
    chart-mean-value?,
    chart-regression-curve*,
    chart-error-indicator*,
    chart-data-point*,
    chart-data-label?
  }
chart-series-attlist =
  attribute chart:values-cell-range-address { cellRangeAddressList }?
  & attribute chart:label-cell-address { cellRangeAddressList }?
  & attribute chart:class { namespacedToken }?
  & attribute chart:attached-axis { \string }?
  & attribute chart:style-name { styleNameRef }?
  & xml-id?
chart-domain =
  element chart:domain {
    attribute table:cell-range-address { cellRangeAddressList }?
  }
chart-data-point =
  element chart:data-point {
    chart-data-point-attlist, chart-data-label?
  }
chart-data-point-attlist =
  attribute chart:repeated { positiveInteger }?
  & attribute chart:style-name { styleNameRef }?
  & xml-id?
chart-data-label =
  element chart:data-label { chart-data-label-attlist, text-p? }
chart-data-label-attlist =
  common-draw-position-attlist
  & attribute chart:style-name { styleNameRef }?
chart-mean-value =
  element chart:mean-value { chart-mean-value-attlist, empty }
chart-mean-value-attlist = attribute chart:style-name { styleNameRef }?
chart-error-indicator =
  element chart:error-indicator { chart-error-indicator-attlist, empty }
chart-error-indicator-attlist =
  attribute chart:style-name { styleNameRef }?
  & attribute chart:dimension { chart-dimension }
chart-regression-curve =
  element chart:regression-curve {
    chart-regression-curve-attlist, chart-equation?
  }
chart-regression-curve-attlist =
  attribute chart:style-name { styleNameRef }?
chart-equation =
  element chart:equation { chart-equation-attlist, text-p? }
chart-equation-attlist =
  attribute chart:automatic-content { boolean }?
  & attribute chart:display-r-square { boolean }?
  & attribute chart:display-equation { boolean }?
  & common-draw-position-attlist
  & attribute chart:style-name { styleNameRef }?
chart-stock-gain-marker =
  element chart:stock-gain-marker { common-stock-marker-attlist }
chart-stock-loss-marker =
  element chart:stock-loss-marker { common-stock-marker-attlist }
chart-stock-range-line =
  element chart:stock-range-line { common-stock-marker-attlist }
common-stock-marker-attlist =
  attribute chart:style-name { styleNameRef }?
office-database =
  element office:database {
    db-data-source,
    db-forms?,
    db-reports?,
    db-queries?,
    db-table-presentations?,
    db-schema-definition?
  }
db-data-source =
  element db:data-source {
    db-data-source-attlist,
    db-connection-data,
    db-driver-settings?,
    db-application-connection-settings?
  }
db-data-source-attlist = empty
db-connection-data =
  element db:connection-data {
    db-connection-data-attlist,
    (db-database-description | db-connection-resource),
    db-login?
  }
db-connection-data-attlist = empty
db-database-description =
  element db:database-description {
    db-database-description-attlist,
    (db-file-based-database | db-server-database)
  }
db-database-description-attlist = empty
db-file-based-database =
  element db:file-based-database { db-file-based-database-attlist }
db-file-based-database-attlist =
  attribute xlink:type { "simple" }
  & attribute xlink:href { anyIRI }
  & attribute db:media-type { \string }
  & attribute db:extension { \string }?
db-server-database =
  element db:server-database { db-server-database-attlist, empty }
db-server-database-attlist =
  attribute db:type { namespacedToken }
  & (db-host-and-port | db-local-socket-name)
  & attribute db:database-name { \string }?
db-host-and-port =
  attribute db:hostname { \string },
  attribute db:port { positiveInteger }?
db-local-socket-name = attribute db:local-socket { \string }?
db-connection-resource =
  element db:connection-resource {
    db-connection-resource-attlist, empty
  }
db-connection-resource-attlist =
  attribute xlink:type { "simple" },
  attribute xlink:href { anyIRI },
  attribute xlink:show { "none" }?,
  attribute xlink:actuate { "onRequest" }?
db-login = element db:login { db-login-attlist, empty }
db-login-attlist =
  (attribute db:user-name { \string }
   | attribute db:use-system-user { boolean })?
  & attribute db:is-password-required { boolean }?
  & attribute db:login-timeout { positiveInteger }?
db-driver-settings =
  element db:driver-settings {
    db-driver-settings-attlist,
    db-auto-increment?,
    db-delimiter?,
    db-character-set?,
    db-table-settings?
  }
db-driver-settings-attlist =
  db-show-deleted
  & attribute db:system-driver-settings { \string }?
  & attribute db:base-dn { \string }?
  & db-is-first-row-header-line
  & attribute db:parameter-name-substitution { boolean }?
db-show-deleted = attribute db:show-deleted { boolean }?
db-is-first-row-header-line =
  attribute db:is-first-row-header-line { boolean }?
db-auto-increment =
  element db:auto-increment { db-auto-increment-attlist, empty }
db-auto-increment-attlist =
  attribute db:additional-column-statement { \string }?
  & attribute db:row-retrieving-statement { \string }?
db-delimiter = element db:delimiter { db-delimiter-attlist, empty }
db-delimiter-attlist =
  attribute db:field { \string }?
  & attribute db:string { \string }?
  & attribute db:decimal { \string }?
  & attribute db:thousand { \string }?
db-character-set =
  element db:character-set { db-character-set-attlist, empty }
db-character-set-attlist = attribute db:encoding { textEncoding }?
db-table-settings = element db:table-settings { db-table-setting* }
db-table-setting =
  element db:table-setting {
    db-table-setting-attlist, db-delimiter?, db-character-set?, empty
  }
db-table-setting-attlist = db-is-first-row-header-line, db-show-deleted
db-application-connection-settings =
  element db:application-connection-settings {
    db-application-connection-settings-attlist,
    db-table-filter?,
    db-table-type-filter?,
    db-data-source-settings?
  }
db-application-connection-settings-attlist =
  attribute db:is-table-name-length-limited { boolean }?
  & attribute db:enable-sql92-check { boolean }?
  & attribute db:append-table-alias-name { boolean }?
  & attribute db:ignore-driver-privileges { boolean }?
  & attribute db:boolean-comparison-mode {
      "equal-integer"
      | "is-boolean"
      | "equal-boolean"
      | "equal-use-only-zero"
    }?
  & attribute db:use-catalog { boolean }?
  & attribute db:max-row-count { integer }?
  & attribute db:suppress-version-columns { boolean }?
db-table-filter =
  element db:table-filter {
    db-table-filter-attlist,
    db-table-include-filter?,
    db-table-exclude-filter?
  }
db-table-filter-attlist = empty
db-table-include-filter =
  element db:table-include-filter {
    db-table-include-filter-attlist, db-table-filter-pattern+
  }
db-table-include-filter-attlist = empty
db-table-exclude-filter =
  element db:table-exclude-filter {
    db-table-exclude-filter-attlist, db-table-filter-pattern+
  }
db-table-exclude-filter-attlist = empty
db-table-filter-pattern =
  element db:table-filter-pattern {
    db-table-filter-pattern-attlist, \string
  }
db-table-filter-pattern-attlist = empty
db-table-type-filter =
  element db:table-type-filter {
    db-table-type-filter-attlist, db-table-type*
  }
db-table-type-filter-attlist = empty
db-table-type = element db:table-type { db-table-type-attlist, \string }
db-table-type-attlist = empty
db-data-source-settings =
  element db:data-source-settings {
    db-data-source-settings-attlist, db-data-source-setting+
  }
db-data-source-settings-attlist = empty
db-data-source-setting =
  element db:data-source-setting {
    db-data-source-setting-attlist, db-data-source-setting-value+
  }
db-data-source-setting-attlist =
  attribute db:data-source-setting-is-list { boolean }?
  & attribute db:data-source-setting-name { \string }
  & attribute db:data-source-setting-type {
      db-data-source-setting-types
    }
db-data-source-setting-types =
  "boolean" | "short" | "int" | "long" | "double" | "string"
db-data-source-setting-value =
  element db:data-source-setting-value {
    db-data-source-setting-value-attlist, \string
  }
db-data-source-setting-value-attlist = empty
db-forms =
  element db:forms {
    db-forms-attlist, (db-component | db-component-collection)*
  }
db-forms-attlist = empty
db-reports =
  element db:reports {
    db-reports-attlist, (db-component | db-component-collection)*
  }
db-reports-attlist = empty
db-component-collection =
  element db:component-collection {
    db-component-collection-attlist,
    common-db-object-name,
    common-db-object-title,
    common-db-object-description,
    (db-component | db-component-collection)*
  }
db-component-collection-attlist = empty
db-component =
  element db:component {
    db-component-attlist,
    common-db-object-name,
    common-db-object-title,
    common-db-object-description,
    (office-document | math-math)?
  }
db-component-attlist =
  (attribute xlink:type { "simple" },
   attribute xlink:href { anyIRI },
   attribute xlink:show { "none" }?,
   attribute xlink:actuate { "onRequest" }?)?
  & attribute db:as-template { boolean }?
db-queries =
  element db:queries {
    db-queries-attlist, (db-query | db-query-collection)*
  }
db-queries-attlist = empty
db-query-collection =
  element db:query-collection {
    db-query-collection-attlist,
    common-db-object-name,
    common-db-object-title,
    common-db-object-description,
    (db-query | db-query-collection)*
  }
db-query-collection-attlist = empty
db-query =
  element db:query {
    db-query-attlist,
    common-db-object-name,
    common-db-object-title,
    common-db-object-description,
    common-db-table-style-name,
    db-order-statement?,
    db-filter-statement?,
    db-columns?,
    db-update-table?
  }
db-query-attlist =
  attribute db:command { \string }
  & attribute db:escape-processing { boolean }?
db-order-statement =
  element db:order-statement { db-command, db-apply-command, empty }
db-filter-statement =
  element db:filter-statement { db-command, db-apply-command, empty }
db-update-table =
  element db:update-table { common-db-table-name-attlist }
db-table-presentations =
  element db:table-representations {
    db-table-presentations-attlist, db-table-presentation*
  }
db-table-presentations-attlist = empty
db-table-presentation =
  element db:table-representation {
    db-table-presentation-attlist,
    common-db-table-name-attlist,
    common-db-object-title,
    common-db-object-description,
    common-db-table-style-name,
    db-order-statement?,
    db-filter-statement?,
    db-columns?
  }
db-table-presentation-attlist = empty
db-columns = element db:columns { db-columns-attlist, db-column+ }
db-columns-attlist = empty
db-column =
  element db:column {
    db-column-attlist,
    common-db-object-name,
    common-db-object-title,
    common-db-object-description,
    common-db-default-value
  }
db-column-attlist =
  attribute db:visible { boolean }?
  & attribute db:style-name { styleNameRef }?
  & attribute db:default-cell-style-name { styleNameRef }?
db-command = attribute db:command { \string }
db-apply-command = attribute db:apply-command { boolean }?
common-db-table-name-attlist =
  attribute db:name { \string }
  & attribute db:catalog-name { \string }?
  & attribute db:schema-name { \string }?
common-db-object-name = attribute db:name { \string }
common-db-object-title = attribute db:title { \string }?
common-db-object-description = attribute db:description { \string }?
common-db-table-style-name =
  attribute db:style-name { styleNameRef }?
  & attribute db:default-row-style-name { styleNameRef }?
common-db-default-value = common-value-and-type-attlist?
db-schema-definition =
  element db:schema-definition {
    db-schema-definition-attlist, db-table-definitions
  }
db-schema-definition-attlist = empty
db-table-definitions =
  element db:table-definitions {
    db-table-definitions-attlist, db-table-definition*
  }
db-table-definitions-attlist = empty
db-table-definition =
  element db:table-definition {
    common-db-table-name-attlist,
    db-table-definition-attlist,
    db-column-definitions,
    db-keys?,
    db-indices?
  }
db-table-definition-attlist = attribute db:type { \string }?
db-column-definitions =
  element db:column-definitions {
    db-column-definitions-attlist, db-column-definition+
  }
db-column-definitions-attlist = empty
db-column-definition =
  element db:column-definition {
    db-column-definition-attlist, common-db-default-value
  }
db-column-definition-attlist =
  attribute db:name { \string }
  & attribute db:data-type { db-data-types }?
  & attribute db:type-name { \string }?
  & attribute db:precision { positiveInteger }?
  & attribute db:scale { positiveInteger }?
  & attribute db:is-nullable { "no-nulls" | "nullable" }?
  & attribute db:is-empty-allowed { boolean }?
  & attribute db:is-autoincrement { boolean }?
db-data-types =
  "bit"
  | "boolean"
  | "tinyint"
  | "smallint"
  | "integer"
  | "bigint"
  | "float"
  | "real"
  | "double"
  | "numeric"
  | "decimal"
  | "char"
  | "varchar"
  | "longvarchar"
  | "date"
  | "time"
  | "timestmp"
  | "binary"
  | "varbinary"
  | "longvarbinary"
  | "sqlnull"
  | "other"
  | "object"
  | "distinct"
  | "struct"
  | "array"
  | "blob"
  | "clob"
  | "ref"
db-keys = element db:keys { db-keys-attlist, db-key+ }
db-keys-attlist = empty
db-key = element db:key { db-key-attlist, db-key-columns+ }
db-key-attlist =
  attribute db:name { \string }?
  & attribute db:type { "primary" | "unique" | "foreign" }
  & attribute db:referenced-table-name { \string }?
  & attribute db:update-rule {
      "cascade" | "restrict" | "set-null" | "no-action" | "set-default"
    }?
  & attribute db:delete-rule {
      "cascade" | "restrict" | "set-null" | "no-action" | "set-default"
    }?
db-key-columns =
  element db:key-columns { db-key-columns-attlist, db-key-column+ }
db-key-columns-attlist = empty
db-key-column = element db:key-column { db-key-column-attlist, empty }
db-key-column-attlist =
  attribute db:name { \string }?
  & attribute db:related-column-name { \string }?
db-indices = element db:indices { db-indices-attlist, db-index+ }
db-indices-attlist = empty
db-index = element db:index { db-index-attlist, db-index-columns+ }
db-index-attlist =
  attribute db:name { \string }
  & attribute db:catalog-name { \string }?
  & attribute db:is-unique { boolean }?
  & attribute db:is-clustered { boolean }?
db-index-columns = element db:index-columns { db-index-column+ }
db-index-column =
  element db:index-column { db-index-column-attlist, empty }
db-index-column-attlist =
  attribute db:name { \string }
  & attribute db:is-ascending { boolean }?
office-forms =
  element office:forms {
    office-forms-attlist, (form-form | xforms-model)*
  }?
office-forms-attlist =
  attribute form:automatic-focus { boolean }?
  & attribute form:apply-design-mode { boolean }?
form-form =
  element form:form {
    common-form-control-attlist,
    form-form-attlist,
    form-properties?,
    office-event-listeners?,
    (controls | form-form)*,
    form-connection-resource?
  }
form-form-attlist =
  (attribute xlink:type { "simple" },
   attribute xlink:href { anyIRI },
   attribute xlink:actuate { "onRequest" }?)?
  & attribute office:target-frame { targetFrameName }?
  & attribute form:method { "get" | "post" | \string }?
  & attribute form:enctype { \string }?
  & attribute form:allow-deletes { boolean }?
  & attribute form:allow-inserts { boolean }?
  & attribute form:allow-updates { boolean }?
  & attribute form:apply-filter { boolean }?
  & attribute form:command-type { "table" | "query" | "command" }?
  & attribute form:command { \string }?
  & attribute form:datasource { anyIRI | \string }?
  & attribute form:master-fields { \string }?
  & attribute form:detail-fields { \string }?
  & attribute form:escape-processing { boolean }?
  & attribute form:filter { \string }?
  & attribute form:ignore-result { boolean }?
  & attribute form:navigation-mode { navigation }?
  & attribute form:order { \string }?
  & attribute form:tab-cycle { tab-cycles }?
navigation = "none" | "current" | "parent"
tab-cycles = "records" | "current" | "page"
form-connection-resource =
  element form:connection-resource {
    attribute xlink:href { anyIRI },
    empty
  }
xforms-model = element xforms:model { anyAttListOrElements }
column-controls =
  element form:text { form-text-attlist, common-form-control-content }
  | element form:textarea {
      form-textarea-attlist, common-form-control-content, text-p*
    }
  | element form:formatted-text {
      form-formatted-text-attlist, common-form-control-content
    }
  | element form:number {
      form-number-attlist,
      common-numeric-control-attlist,
      common-form-control-content,
      common-linked-cell,
      common-spin-button,
      common-repeat,
      common-delay-for-repeat
    }
  | element form:date {
      form-date-attlist,
      common-numeric-control-attlist,
      common-form-control-content,
      common-linked-cell,
      common-spin-button,
      common-repeat,
      common-delay-for-repeat
    }
  | element form:time {
      form-time-attlist,
      common-numeric-control-attlist,
      common-form-control-content,
      common-linked-cell,
      common-spin-button,
      common-repeat,
      common-delay-for-repeat
    }
  | element form:combobox {
      form-combobox-attlist, common-form-control-content, form-item*
    }
  | element form:listbox {
      form-listbox-attlist, common-form-control-content, form-option*
    }
  | element form:checkbox {
      form-checkbox-attlist, common-form-control-content
    }
controls =
  column-controls
  | element form:password {
      form-password-attlist, common-form-control-content
    }
  | element form:file { form-file-attlist, common-form-control-content }
  | element form:fixed-text {
      form-fixed-text-attlist, common-form-control-content
    }
  | element form:button {
      form-button-attlist, common-form-control-content
    }
  | element form:image {
      form-image-attlist, common-form-control-content
    }
  | element form:radio {
      form-radio-attlist, common-form-control-content
    }
  | element form:frame {
      form-frame-attlist, common-form-control-content
    }
  | element form:image-frame {
      form-image-frame-attlist, common-form-control-content
    }
  | element form:hidden {
      form-hidden-attlist, common-form-control-content
    }
  | element form:grid {
      form-grid-attlist, common-form-control-content, form-column*
    }
  | element form:value-range {
      form-value-range-attlist, common-form-control-content
    }
  | element form:generic-control {
      form-generic-control-attlist, common-form-control-content
    }
form-text-attlist =
  form-control-attlist,
  common-current-value-attlist,
  common-disabled-attlist,
  common-maxlength-attlist,
  common-printable-attlist,
  common-readonly-attlist,
  common-tab-attlist,
  common-title-attlist,
  common-value-attlist,
  common-convert-empty-attlist,
  common-data-field-attlist,
  common-linked-cell
form-control-attlist =
  common-form-control-attlist,
  common-control-id-attlist,
  xforms-bind-attlist
common-form-control-content = form-properties?, office-event-listeners?
form-textarea-attlist =
  form-control-attlist,
  common-current-value-attlist,
  common-disabled-attlist,
  common-maxlength-attlist,
  common-printable-attlist,
  common-readonly-attlist,
  common-tab-attlist,
  common-title-attlist,
  common-value-attlist,
  common-convert-empty-attlist,
  common-data-field-attlist,
  common-linked-cell
form-password-attlist =
  form-control-attlist
  & common-disabled-attlist
  & common-maxlength-attlist
  & common-printable-attlist
  & common-tab-attlist
  & common-title-attlist
  & common-value-attlist
  & common-convert-empty-attlist
  & common-linked-cell
  & attribute form:echo-char { character }?
form-file-attlist =
  form-control-attlist,
  common-current-value-attlist,
  common-disabled-attlist,
  common-maxlength-attlist,
  common-printable-attlist,
  common-readonly-attlist,
  common-tab-attlist,
  common-title-attlist,
  common-value-attlist,
  common-linked-cell
form-formatted-text-attlist =
  form-control-attlist
  & common-current-value-attlist
  & common-disabled-attlist
  & common-maxlength-attlist
  & common-printable-attlist
  & common-readonly-attlist
  & common-tab-attlist
  & common-title-attlist
  & common-value-attlist
  & common-convert-empty-attlist
  & common-data-field-attlist
  & common-linked-cell
  & common-spin-button
  & common-repeat
  & common-delay-for-repeat
  & attribute form:max-value { \string }?
  & attribute form:min-value { \string }?
  & attribute form:validation { boolean }?
common-numeric-control-attlist =
  form-control-attlist,
  common-disabled-attlist,
  common-maxlength-attlist,
  common-printable-attlist,
  common-readonly-attlist,
  common-tab-attlist,
  common-title-attlist,
  common-convert-empty-attlist,
  common-data-field-attlist
form-number-attlist =
  attribute form:value { double }?
  & attribute form:current-value { double }?
  & attribute form:min-value { double }?
  & attribute form:max-value { double }?
form-date-attlist =
  attribute form:value { date }?
  & attribute form:current-value { date }?
  & attribute form:min-value { date }?
  & attribute form:max-value { date }?
form-time-attlist =
  attribute form:value { time }?
  & attribute form:current-value { time }?
  & attribute form:min-value { time }?
  & attribute form:max-value { time }?
form-fixed-text-attlist =
  form-control-attlist
  & for
  & common-disabled-attlist
  & label
  & common-printable-attlist
  & common-title-attlist
  & attribute form:multi-line { boolean }?
form-combobox-attlist =
  form-control-attlist
  & common-current-value-attlist
  & common-disabled-attlist
  & dropdown
  & common-maxlength-attlist
  & common-printable-attlist
  & common-readonly-attlist
  & size
  & common-tab-attlist
  & common-title-attlist
  & common-value-attlist
  & common-convert-empty-attlist
  & common-data-field-attlist
  & list-source
  & list-source-type
  & common-linked-cell
  & common-source-cell-range
  & attribute form:auto-complete { boolean }?
form-item = element form:item { form-item-attlist, text }
form-item-attlist = label
form-listbox-attlist =
  form-control-attlist
  & common-disabled-attlist
  & dropdown
  & common-printable-attlist
  & size
  & common-tab-attlist
  & common-title-attlist
  & bound-column
  & common-data-field-attlist
  & list-source
  & list-source-type
  & common-linked-cell
  & list-linkage-type
  & common-source-cell-range
  & attribute form:multiple { boolean }?
  & attribute form:xforms-list-source { \string }?
list-linkage-type =
  attribute form:list-linkage-type {
    "selection" | "selection-indices"
  }?
form-option = element form:option { form-option-attlist, text }
form-option-attlist =
  current-selected, selected, label, common-value-attlist
form-button-attlist =
  form-control-attlist
  & button-type
  & common-disabled-attlist
  & label
  & image-data
  & common-printable-attlist
  & common-tab-attlist
  & target-frame
  & target-location
  & common-title-attlist
  & common-value-attlist
  & common-form-relative-image-position-attlist
  & common-repeat
  & common-delay-for-repeat
  & attribute form:default-button { boolean }?
  & attribute form:toggle { boolean }?
  & attribute form:focus-on-click { boolean }?
  & attribute form:xforms-submission { \string }?
form-image-attlist =
  form-control-attlist,
  button-type,
  common-disabled-attlist,
  image-data,
  common-printable-attlist,
  common-tab-attlist,
  target-frame,
  target-location,
  common-title-attlist,
  common-value-attlist
form-checkbox-attlist =
  form-control-attlist
  & common-disabled-attlist
  & label
  & common-printable-attlist
  & common-tab-attlist
  & common-title-attlist
  & common-value-attlist
  & common-data-field-attlist
  & common-form-visual-effect-attlist
  & common-form-relative-image-position-attlist
  & common-linked-cell
  & attribute form:current-state { states }?
  & attribute form:is-tristate { boolean }?
  & attribute form:state { states }?
states = "unchecked" | "checked" | "unknown"
form-radio-attlist =
  form-control-attlist,
  current-selected,
  common-disabled-attlist,
  label,
  common-printable-attlist,
  selected,
  common-tab-attlist,
  common-title-attlist,
  common-value-attlist,
  common-data-field-attlist,
  common-form-visual-effect-attlist,
  common-form-relative-image-position-attlist,
  common-linked-cell
form-frame-attlist =
  form-control-attlist,
  common-disabled-attlist,
  for,
  label,
  common-printable-attlist,
  common-title-attlist
form-image-frame-attlist =
  form-control-attlist,
  common-disabled-attlist,
  image-data,
  common-printable-attlist,
  common-readonly-attlist,
  common-title-attlist,
  common-data-field-attlist
form-hidden-attlist = form-control-attlist, common-value-attlist
form-grid-attlist =
  form-control-attlist,
  common-disabled-attlist,
  common-printable-attlist,
  common-tab-attlist,
  common-title-attlist
form-column =
  element form:column { form-column-attlist, column-controls+ }
form-column-attlist =
  common-form-control-attlist, label, text-style-name
text-style-name = attribute form:text-style-name { styleNameRef }?
form-value-range-attlist =
  form-control-attlist
  & common-disabled-attlist
  & common-printable-attlist
  & common-tab-attlist
  & common-title-attlist
  & common-value-attlist
  & common-linked-cell
  & common-repeat
  & common-delay-for-repeat
  & attribute form:max-value { integer }?
  & attribute form:min-value { integer }?
  & attribute form:step-size { positiveInteger }?
  & attribute form:page-step-size { positiveInteger }?
  & attribute form:orientation { "horizontal" | "vertical" }?
form-generic-control-attlist = form-control-attlist
common-form-control-attlist =
  attribute form:name { \string }?
  & attribute form:control-implementation { namespacedToken }?
xforms-bind-attlist = attribute xforms:bind { \string }?
types = "submit" | "reset" | "push" | "url"
button-type = attribute form:button-type { types }?
common-control-id-attlist =
  xml-id,
  attribute form:id { NCName }?
current-selected = attribute form:current-selected { boolean }?
common-value-attlist = attribute form:value { \string }?
common-current-value-attlist = attribute form:current-value { \string }?
common-disabled-attlist = attribute form:disabled { boolean }?
dropdown = attribute form:dropdown { boolean }?
for = attribute form:for { \string }?
image-data = attribute form:image-data { anyIRI }?
label = attribute form:label { \string }?
common-maxlength-attlist =
  attribute form:max-length { nonNegativeInteger }?
common-printable-attlist = attribute form:printable { boolean }?
common-readonly-attlist = attribute form:readonly { boolean }?
selected = attribute form:selected { boolean }?
size = attribute form:size { nonNegativeInteger }?
common-tab-attlist =
  attribute form:tab-index { nonNegativeInteger }?
  & attribute form:tab-stop { boolean }?
target-frame = attribute office:target-frame { targetFrameName }?
target-location = attribute xlink:href { anyIRI }?
common-title-attlist = attribute form:title { \string }?
common-form-visual-effect-attlist =
  attribute form:visual-effect { "flat" | "3d" }?
common-form-relative-image-position-attlist =
  attribute form:image-position { "center" }?
  | (attribute form:image-position {
       "start" | "end" | "top" | "bottom"
     },
     attribute form:image-align { "start" | "center" | "end" }?)
bound-column = attribute form:bound-column { \string }?
common-convert-empty-attlist =
  attribute form:convert-empty-to-null { boolean }?
common-data-field-attlist = attribute form:data-field { \string }?
list-source = attribute form:list-source { \string }?
list-source-type =
  attribute form:list-source-type {
    "table"
    | "query"
    | "sql"
    | "sql-pass-through"
    | "value-list"
    | "table-fields"
  }?
common-linked-cell =
  attribute form:linked-cell { cellAddress | \string }?
common-source-cell-range =
  attribute form:source-cell-range { cellRangeAddress | \string }?
common-spin-button = attribute form:spin-button { boolean }?
common-repeat = attribute form:repeat { boolean }?
common-delay-for-repeat = attribute form:delay-for-repeat { duration }?
form-properties = element form:properties { form-property+ }
form-property =
  element form:property {
    form-property-name, form-property-value-and-type-attlist
  }
  | element form:list-property {
      form-property-name, form-property-type-and-value-list
    }
form-property-name = attribute form:property-name { \string }
form-property-value-and-type-attlist =
  common-value-and-type-attlist
  | attribute office:value-type { "void" }
form-property-type-and-value-list =
  (attribute office:value-type { "float" },
   element form:list-value {
     attribute office:value { double }
   }*)
  | (attribute office:value-type { "percentage" },
     element form:list-value {
       attribute office:value { double }
     }*)
  | (attribute office:value-type { "currency" },
     element form:list-value {
       attribute office:value { double },
       attribute office:currency { \string }?
     }*)
  | (attribute office:value-type { "date" },
     element form:list-value {
       attribute office:date-value { dateOrDateTime }
     }*)
  | (attribute office:value-type { "time" },
     element form:list-value {
       attribute office:time-value { duration }
     }*)
  | (attribute office:value-type { "boolean" },
     element form:list-value {
       attribute office:boolean-value { boolean }
     }*)
  | (attribute office:value-type { "string" },
     element form:list-value {
       attribute office:string-value { \string }
     }*)
  | attribute office:value-type { "void" }
office-annotation =
  element office:annotation {
    office-annotation-attlist,
    draw-caption-attlist,
    common-draw-position-attlist,
    common-draw-size-attlist,
    common-draw-shape-with-text-and-styles-attlist,
    dc-creator?,
    dc-date?,
    meta-date-string?,
    (text-p | text-list)*
  }
office-annotation-end =
  element office:annotation-end { office-annotation-end-attlist }
office-annotation-attlist =
  attribute office:display { boolean }?
  & common-office-annotation-name-attlist?
office-annotation-end-attlist = common-office-annotation-name-attlist
common-office-annotation-name-attlist =
  attribute office:name { \string }
meta-date-string = element meta:date-string { \string }
common-num-format-prefix-suffix-attlist =
  attribute style:num-prefix { \string }?,
  attribute style:num-suffix { \string }?
common-num-format-attlist =
  attribute style:num-format { "1" | "i" | "I" | \string | empty }
  | (attribute style:num-format { "a" | "A" },
     style-num-letter-sync-attlist)
  | empty
style-num-letter-sync-attlist =
  attribute style:num-letter-sync { boolean }?
office-change-info =
  element office:change-info { dc-creator, dc-date, text-p* }
office-event-listeners =
  element office:event-listeners {
    (script-event-listener | presentation-event-listener)*
  }
script-event-listener =
  element script:event-listener { script-event-listener-attlist, empty }
script-event-listener-attlist =
  attribute script:event-name { \string }
  & attribute script:language { \string }
  & (attribute script:macro-name { \string }
     | (attribute xlink:type { "simple" },
        attribute xlink:href { anyIRI },
        attribute xlink:actuate { "onRequest" }?))
math-math = element math:math { mathMarkup }
[
  dc:description [
    "To avoid inclusion of the complete MathML schema, anything is allowed within a math:math top-level element"
  ]
]
mathMarkup =
  (attribute * { text }
   | text
   | element * { mathMarkup })*
text-dde-connection-decl =
  element text:dde-connection-decl {
    text-dde-connection-decl-attlist, common-dde-connection-decl-attlist
  }
text-dde-connection-decl-attlist = attribute office:name { \string }
common-dde-connection-decl-attlist =
  attribute office:dde-application { \string }
  & attribute office:dde-topic { \string }
  & attribute office:dde-item { \string }
  & attribute office:automatic-update { boolean }?
table-dde-link =
  element table:dde-link { office-dde-source, table-table }
office-dde-source =
  element office:dde-source {
    office-dde-source-attlist, common-dde-connection-decl-attlist
  }
office-dde-source-attlist =
  attribute office:name { \string }?
  & attribute office:conversion-mode {
      "into-default-style-data-style"
      | "into-english-number"
      | "keep-text"
    }?
animation-element =
  element anim:animate {
    common-anim-target-attlist,
    common-anim-named-target-attlist,
    common-anim-values-attlist,
    common-anim-spline-mode-attlist,
    common-spline-anim-value-attlist,
    common-timing-attlist,
    common-anim-add-accum-attlist
  }
  | element anim:set {
      common-anim-target-attlist,
      common-anim-named-target-attlist,
      common-anim-set-values-attlist,
      common-timing-attlist,
      common-anim-add-accum-attlist
    }
  | element anim:animateMotion {
      anim-animate-motion-attlist,
      common-anim-target-attlist,
      common-anim-named-target-attlist,
      common-anim-add-accum-attlist,
      common-anim-values-attlist,
      common-timing-attlist,
      common-spline-anim-value-attlist
    }
  | element anim:animateColor {
      common-anim-target-attlist,
      common-anim-named-target-attlist,
      common-anim-add-accum-attlist,
      common-anim-values-attlist,
      common-anim-spline-mode-attlist,
      common-spline-anim-value-attlist,
      anim-animate-color-attlist,
      common-timing-attlist
    }
  | element anim:animateTransform {
      common-anim-target-attlist,
      common-anim-named-target-attlist,
      common-anim-add-accum-attlist,
      common-anim-values-attlist,
      anim-animate-transform-attlist,
      common-timing-attlist
    }
  | element anim:transitionFilter {
      common-anim-target-attlist,
      common-anim-add-accum-attlist,
      common-anim-values-attlist,
      common-anim-spline-mode-attlist,
      anim-transition-filter-attlist,
      common-timing-attlist
    }
  | element anim:par {
      common-anim-attlist,
      common-timing-attlist,
      common-endsync-timing-attlist,
      animation-element*
    }
  | element anim:seq {
      common-anim-attlist,
      common-endsync-timing-attlist,
      common-timing-attlist,
      animation-element*
    }
  | element anim:iterate {
      common-anim-attlist,
      anim-iterate-attlist,
      common-timing-attlist,
      common-endsync-timing-attlist,
      animation-element*
    }
  | element anim:audio {
      common-anim-attlist,
      anim-audio-attlist,
      common-basic-timing-attlist
    }
  | element anim:command {
      common-anim-attlist,
      anim-command-attlist,
      common-begin-end-timing-attlist,
      common-anim-target-attlist,
      element anim:param {
        attribute anim:name { \string },
        attribute anim:value { \string }
      }*
    }
anim-animate-motion-attlist =
  attribute svg:path { pathData }?
  & attribute svg:origin { \string }?
  & attribute smil:calcMode {
      "discrete" | "linear" | "paced" | "spline"
    }?
anim-animate-color-attlist =
  attribute anim:color-interpolation { "rgb" | "hsl" }?
  & attribute anim:color-interpolation-direction {
      "clockwise" | "counter-clockwise"
    }?
anim-animate-transform-attlist =
  attribute svg:type {
    "translate" | "scale" | "rotate" | "skewX" | "skewY"
  }
anim-transition-filter-attlist =
  attribute smil:type { \string }
  & attribute smil:subtype { \string }?
  & attribute smil:direction { "forward" | "reverse" }?
  & attribute smil:fadeColor { color }?
  & attribute smil:mode { "in" | "out" }?
common-anim-target-attlist =
  attribute smil:targetElement { IDREF }?
  & attribute anim:sub-item { \string }?
common-anim-named-target-attlist =
  attribute smil:attributeName { \string }
common-anim-values-attlist =
  attribute smil:values { \string }?
  & attribute anim:formula { \string }?
  & common-anim-set-values-attlist
  & attribute smil:from { \string }?
  & attribute smil:by { \string }?
common-anim-spline-mode-attlist =
  attribute smil:calcMode {
    "discrete" | "linear" | "paced" | "spline"
  }?
common-spline-anim-value-attlist =
  attribute smil:keyTimes { \string }?
  & attribute smil:keySplines { \string }?
common-anim-add-accum-attlist =
  attribute smil:accumulate { "none" | "sum" }?
  & attribute smil:additive { "replace" | "sum" }?
common-anim-set-values-attlist = attribute smil:to { \string }?
common-begin-end-timing-attlist =
  attribute smil:begin { \string }?
  & attribute smil:end { \string }?
common-dur-timing-attlist = attribute smil:dur { \string }?
common-endsync-timing-attlist =
  attribute smil:endsync { "first" | "last" | "all" | "media" | IDREF }?
common-repeat-timing-attlist =
  attribute smil:repeatDur { \string }?,
  attribute smil:repeatCount { nonNegativeDecimal | "indefinite" }?
nonNegativeDecimal = xsd:decimal { minInclusive = "0.0" }
common-fill-timing-attlist =
  attribute smil:fill {
    "remove" | "freeze" | "hold" | "auto" | "default" | "transition"
  }?
common-fill-default-attlist =
  attribute smil:fillDefault {
    "remove" | "freeze" | "hold" | "transition" | "auto" | "inherit"
  }?
common-restart-timing-attlist =
  attribute smil:restart {
    "never" | "always" | "whenNotActive" | "default"
  }?
common-restart-default-attlist =
  attribute smil:restartDefault {
    "never" | "always" | "whenNotActive" | "inherit"
  }?
common-time-manip-attlist =
  attribute smil:accelerate { zeroToOneDecimal }?
  & attribute smil:decelerate { zeroToOneDecimal }?
  & attribute smil:autoReverse { boolean }?
zeroToOneDecimal = xsd:decimal { minInclusive = "0" maxInclusive = "1" }
common-basic-timing-attlist =
  common-begin-end-timing-attlist,
  common-dur-timing-attlist,
  common-repeat-timing-attlist,
  common-restart-timing-attlist,
  common-restart-default-attlist,
  common-fill-timing-attlist,
  common-fill-default-attlist
common-timing-attlist =
  common-basic-timing-attlist, common-time-manip-attlist
anim-iterate-attlist =
  common-anim-target-attlist
  & attribute anim:iterate-type { \string }?
  & attribute anim:iterate-interval { duration }?
anim-audio-attlist =
  attribute xlink:href { anyIRI }?
  & attribute anim:audio-level { double }?
anim-command-attlist = attribute anim:command { \string }
style-style =
  element style:style {
    style-style-attlist, style-style-content, style-map*
  }
common-in-content-meta-attlist =
  attribute xhtml:about { URIorSafeCURIE },
  attribute xhtml:property { CURIEs },
  common-meta-literal-attlist
common-meta-literal-attlist =
  attribute xhtml:datatype { CURIE }?,
  attribute xhtml:content { \string }?
xml-id = attribute xml:id { ID }
style-style-attlist =
  attribute style:name { styleName }
  & attribute style:display-name { \string }?
  & attribute style:parent-style-name { styleNameRef }?
  & attribute style:next-style-name { styleNameRef }?
  & attribute style:list-level { positiveInteger | empty }?
  & attribute style:list-style-name { styleName | empty }?
  & attribute style:master-page-name { styleNameRef }?
  & attribute style:auto-update { boolean }?
  & attribute style:data-style-name { styleNameRef }?
  & attribute style:percentage-data-style-name { styleNameRef }?
  & attribute style:class { \string }?
  & attribute style:default-outline-level { positiveInteger | empty }?
style-map = element style:map { style-map-attlist, empty }
style-map-attlist =
  attribute style:condition { \string }
  & attribute style:apply-style-name { styleNameRef }
  & attribute style:base-cell-address { cellAddress }?
style-default-style =
  element style:default-style { style-style-content }
style-page-layout =
  element style:page-layout {
    style-page-layout-attlist, style-page-layout-content
  }
style-page-layout-content =
  style-page-layout-properties?,
  style-header-style?,
  style-footer-style?
style-page-layout-attlist =
  attribute style:name { styleName }
  & attribute style:page-usage {
      "all" | "left" | "right" | "mirrored"
    }?
style-header-style =
  element style:header-style { style-header-footer-properties? }
style-footer-style =
  element style:footer-style { style-header-footer-properties? }
style-default-page-layout =
  element style:default-page-layout { style-page-layout-content }
style-master-page =
  element style:master-page {
    style-master-page-attlist,
    (style-header, style-header-left?)?,
    (style-footer, style-footer-left?)?,
    draw-layer-set?,
    office-forms?,
    shape*,
    animation-element?,
    presentation-notes?
  }
style-master-page-attlist =
  attribute style:name { styleName }
  & attribute style:display-name { \string }?
  & attribute style:page-layout-name { styleNameRef }
  & attribute draw:style-name { styleNameRef }?
  & attribute style:next-style-name { styleNameRef }?
style-header =
  element style:header {
    common-style-header-footer-attlist, header-footer-content
  }
style-footer =
  element style:footer {
    common-style-header-footer-attlist, header-footer-content
  }
style-header-left =
  element style:header-left {
    common-style-header-footer-attlist, header-footer-content
  }
style-footer-left =
  element style:footer-left {
    common-style-header-footer-attlist, header-footer-content
  }
header-footer-content =
  (text-tracked-changes,
   text-decls,
   (text-h
    | text-p
    | text-list
    | table-table
    | text-section
    | text-table-of-content
    | text-illustration-index
    | text-table-index
    | text-object-index
    | text-user-index
    | text-alphabetical-index
    | text-bibliography
    | text-index-title
    | change-marks)*)
  | (style-region-left?, style-region-center?, style-region-right?)
common-style-header-footer-attlist =
  attribute style:display { boolean }?
style-region-left = element style:region-left { region-content }
style-region-center = element style:region-center { region-content }
style-region-right = element style:region-right { region-content }
region-content = text-p*
presentation-notes =
  element presentation:notes {
    common-presentation-header-footer-attlist,
    presentation-notes-attlist,
    office-forms,
    shape*
  }
presentation-notes-attlist =
  attribute style:page-layout-name { styleNameRef }?
  & attribute draw:style-name { styleNameRef }?
table-table-template =
  element table:table-template {
    table-table-template-attlist,
    table-first-row?,
    table-last-row?,
    table-first-column?,
    table-last-column?,
    table-body,
    table-even-rows?,
    table-odd-rows?,
    table-even-columns?,
    table-odd-columns?,
    table-background?
  }
table-table-template-attlist =
  attribute table:name { \string }
  & attribute table:first-row-start-column { rowOrCol }
  & attribute table:first-row-end-column { rowOrCol }
  & attribute table:last-row-start-column { rowOrCol }
  & attribute table:last-row-end-column { rowOrCol }
rowOrCol = "row" | "column"
table-first-row =
  element table:first-row { common-table-template-attlist, empty }
table-last-row =
  element table:last-row { common-table-template-attlist, empty }
table-first-column =
  element table:first-column { common-table-template-attlist, empty }
table-last-column =
  element table:last-column { common-table-template-attlist, empty }
table-body = element table:body { common-table-template-attlist, empty }
table-even-rows =
  element table:even-rows { common-table-template-attlist, empty }
table-odd-rows =
  element table:odd-rows { common-table-template-attlist, empty }
table-even-columns =
  element table:even-columns { common-table-template-attlist, empty }
table-odd-columns =
  element table:odd-columns { common-table-template-attlist, empty }
common-table-template-attlist =
  attribute table:style-name { styleNameRef },
  attribute table:paragraph-style-name { styleNameRef }?
table-background =
  element table:background { table-background-attlist, empty }
table-background-attlist = attribute table:style-name { styleNameRef }
style-font-face =
  element style:font-face {
    style-font-face-attlist, svg-font-face-src?, svg-definition-src?
  }
style-font-face-attlist =
  attribute svg:font-family { \string }?
  & attribute svg:font-style { fontStyle }?
  & attribute svg:font-variant { fontVariant }?
  & attribute svg:font-weight { fontWeight }?
  & attribute svg:font-stretch {
      "normal"
      | "ultra-condensed"
      | "extra-condensed"
      | "condensed"
      | "semi-condensed"
      | "semi-expanded"
      | "expanded"
      | "extra-expanded"
      | "ultra-expanded"
    }?
  & attribute svg:font-size { positiveLength }?
  & attribute svg:unicode-range { \string }?
  & attribute svg:units-per-em { integer }?
  & attribute svg:panose-1 { \string }?
  & attribute svg:stemv { integer }?
  & attribute svg:stemh { integer }?
  & attribute svg:slope { integer }?
  & attribute svg:cap-height { integer }?
  & attribute svg:x-height { integer }?
  & attribute svg:accent-height { integer }?
  & attribute svg:ascent { integer }?
  & attribute svg:descent { integer }?
  & attribute svg:widths { \string }?
  & attribute svg:bbox { \string }?
  & attribute svg:ideographic { integer }?
  & attribute svg:alphabetic { integer }?
  & attribute svg:mathematical { integer }?
  & attribute svg:hanging { integer }?
  & attribute svg:v-ideographic { integer }?
  & attribute svg:v-alphabetic { integer }?
  & attribute svg:v-mathematical { integer }?
  & attribute svg:v-hanging { integer }?
  & attribute svg:underline-position { integer }?
  & attribute svg:underline-thickness { integer }?
  & attribute svg:strikethrough-position { integer }?
  & attribute svg:strikethrough-thickness { integer }?
  & attribute svg:overline-position { integer }?
  & attribute svg:overline-thickness { integer }?
  & attribute style:name { \string }
  & attribute style:font-adornments { \string }?
  & attribute style:font-family-generic { fontFamilyGeneric }?
  & attribute style:font-pitch { fontPitch }?
  & attribute style:font-charset { textEncoding }?
svg-font-face-src =
  element svg:font-face-src {
    (svg-font-face-uri | svg-font-face-name)+
  }
svg-font-face-uri =
  element svg:font-face-uri {
    common-svg-font-face-xlink-attlist, svg-font-face-format*
  }
svg-font-face-format =
  element svg:font-face-format {
    attribute svg:string { \string }?,
    empty
  }
svg-font-face-name =
  element svg:font-face-name {
    attribute svg:name { \string }?,
    empty
  }
svg-definition-src =
  element svg:definition-src {
    common-svg-font-face-xlink-attlist, empty
  }
common-svg-font-face-xlink-attlist =
  attribute xlink:type { "simple" },
  attribute xlink:href { anyIRI },
  attribute xlink:actuate { "onRequest" }?
number-number-style =
  element number:number-style {
    common-data-style-attlist,
    style-text-properties?,
    number-text?,
    (any-number, number-text?)?,
    style-map*
  }
any-number = number-number | number-scientific-number | number-fraction
number-number =
  element number:number {
    number-number-attlist,
    common-decimal-places-attlist,
    common-number-attlist,
    number-embedded-text*
  }
number-number-attlist =
  attribute number:decimal-replacement { \string }?
  & attribute number:display-factor { double }?
number-embedded-text =
  element number:embedded-text { number-embedded-text-attlist, text }
number-embedded-text-attlist = attribute number:position { integer }
number-scientific-number =
  element number:scientific-number {
    number-scientific-number-attlist,
    common-decimal-places-attlist,
    common-number-attlist,
    empty
  }
number-scientific-number-attlist =
  attribute number:min-exponent-digits { integer }?
number-fraction =
  element number:fraction {
    number-fraction-attlist, common-number-attlist, empty
  }
number-fraction-attlist =
  attribute number:min-numerator-digits { integer }?
  & attribute number:min-denominator-digits { integer }?
  & attribute number:denominator-value { integer }?
number-currency-style =
  element number:currency-style {
    common-data-style-attlist,
    common-auto-reorder-attlist,
    style-text-properties?,
    number-text?,
    ((number-and-text, currency-symbol-and-text?)
     | (currency-symbol-and-text, number-and-text?))?,
    style-map*
  }
currency-symbol-and-text = number-currency-symbol, number-text?
number-and-text = number-number, number-text?
number-currency-symbol =
  element number:currency-symbol {
    number-currency-symbol-attlist, text
  }
number-currency-symbol-attlist =
  attribute number:language { languageCode }?,
  attribute number:country { countryCode }?,
  attribute number:script { scriptCode }?,
  attribute number:rfc-language-tag { language }?
number-percentage-style =
  element number:percentage-style {
    common-data-style-attlist,
    style-text-properties?,
    number-text?,
    number-and-text?,
    style-map*
  }
number-date-style =
  element number:date-style {
    common-data-style-attlist,
    common-auto-reorder-attlist,
    common-format-source-attlist,
    style-text-properties?,
    number-text?,
    (any-date, number-text?)+,
    style-map*
  }
any-date =
  number-day
  | number-month
  | number-year
  | number-era
  | number-day-of-week
  | number-week-of-year
  | number-quarter
  | number-hours
  | number-am-pm
  | number-minutes
  | number-seconds
number-day =
  element number:day {
    number-day-attlist, common-calendar-attlist, empty
  }
number-day-attlist = attribute number:style { "short" | "long" }?
number-month =
  element number:month {
    number-month-attlist, common-calendar-attlist, empty
  }
number-month-attlist =
  attribute number:textual { boolean }?
  & attribute number:possessive-form { boolean }?
  & attribute number:style { "short" | "long" }?
number-year =
  element number:year {
    number-year-attlist, common-calendar-attlist, empty
  }
number-year-attlist = attribute number:style { "short" | "long" }?
number-era =
  element number:era {
    number-era-attlist, common-calendar-attlist, empty
  }
number-era-attlist = attribute number:style { "short" | "long" }?
number-day-of-week =
  element number:day-of-week {
    number-day-of-week-attlist, common-calendar-attlist, empty
  }
number-day-of-week-attlist =
  attribute number:style { "short" | "long" }?
number-week-of-year =
  element number:week-of-year { common-calendar-attlist, empty }
number-quarter =
  element number:quarter {
    number-quarter-attlist, common-calendar-attlist, empty
  }
number-quarter-attlist = attribute number:style { "short" | "long" }?
number-time-style =
  element number:time-style {
    number-time-style-attlist,
    common-data-style-attlist,
    common-format-source-attlist,
    style-text-properties?,
    number-text?,
    (any-time, number-text?)+,
    style-map*
  }
any-time = number-hours | number-am-pm | number-minutes | number-seconds
number-time-style-attlist =
  attribute number:truncate-on-overflow { boolean }?
number-hours = element number:hours { number-hours-attlist, empty }
number-hours-attlist = attribute number:style { "short" | "long" }?
number-minutes =
  element number:minutes { number-minutes-attlist, empty }
number-minutes-attlist = attribute number:style { "short" | "long" }?
number-seconds =
  element number:seconds { number-seconds-attlist, empty }
number-seconds-attlist =
  attribute number:style { "short" | "long" }?
  & attribute number:decimal-places { integer }?
number-am-pm = element number:am-pm { empty }
number-boolean-style =
  element number:boolean-style {
    common-data-style-attlist,
    style-text-properties?,
    number-text?,
    (number-boolean, number-text?)?,
    style-map*
  }
number-boolean = element number:boolean { empty }
number-text-style =
  element number:text-style {
    common-data-style-attlist,
    style-text-properties?,
    number-text?,
    (number-text-content, number-text?)*,
    style-map*
  }
number-text = element number:text { text }
number-text-content = element number:text-content { empty }
common-data-style-attlist =
  attribute style:name { styleName }
  & attribute style:display-name { \string }?
  & attribute number:language { languageCode }?
  & attribute number:country { countryCode }?
  & attribute number:script { scriptCode }?
  & attribute number:rfc-language-tag { language }?
  & attribute number:title { \string }?
  & attribute style:volatile { boolean }?
  & attribute number:transliteration-format { \string }?
  & attribute number:transliteration-language { countryCode }?
  & attribute number:transliteration-country { countryCode }?
  & attribute number:transliteration-style {
      "short" | "medium" | "long"
    }?
common-auto-reorder-attlist =
  attribute number:automatic-order { boolean }?
common-format-source-attlist =
  attribute number:format-source { "fixed" | "language" }?
common-decimal-places-attlist =
  attribute number:decimal-places { integer }?
common-number-attlist =
  attribute number:min-integer-digits { integer }?
  & attribute number:grouping { boolean }?
common-calendar-attlist =
  attribute number:calendar {
    "gregorian"
    | "gengou"
    | "ROC"
    | "hanja_yoil"
    | "hanja"
    | "hijri"
    | "jewish"
    | "buddhist"
    | \string
  }?
style-style-content =
  (attribute style:family { "text" },
   style-text-properties?)
  | (attribute style:family { "paragraph" },
     style-paragraph-properties?,
     style-text-properties?)
  | (attribute style:family { "section" },
     style-section-properties?)
  | (attribute style:family { "ruby" },
     style-ruby-properties?)
  | (attribute style:family { "table" },
     style-table-properties?)
  | (attribute style:family { "table-column" },
     style-table-column-properties?)
  | (attribute style:family { "table-row" },
     style-table-row-properties?)
  | (attribute style:family { "table-cell" },
     style-table-cell-properties?,
     style-paragraph-properties?,
     style-text-properties?)
  | (attribute style:family { "graphic" | "presentation" },
     style-graphic-properties?,
     style-paragraph-properties?,
     style-text-properties?)
  | (attribute style:family { "drawing-page" },
     style-drawing-page-properties?)
  | (attribute style:family { "chart" },
     style-chart-properties?,
     style-graphic-properties?,
     style-paragraph-properties?,
     style-text-properties?)
text-linenumbering-configuration =
  element text:linenumbering-configuration {
    text-linenumbering-configuration-attlist,
    text-linenumbering-separator?
  }
text-linenumbering-configuration-attlist =
  attribute text:number-lines { boolean }?
  & common-num-format-attlist?
  & attribute text:style-name { styleNameRef }?
  & attribute text:increment { nonNegativeInteger }?
  & attribute text:number-position {
      "left" | "right" | "inner" | "outer"
    }?
  & attribute text:offset { nonNegativeLength }?
  & attribute text:count-empty-lines { boolean }?
  & attribute text:count-in-text-boxes { boolean }?
  & attribute text:restart-on-page { boolean }?
text-linenumbering-separator =
  element text:linenumbering-separator {
    attribute text:increment { nonNegativeInteger }?,
    text
  }
text-notes-configuration =
  element text:notes-configuration { text-notes-configuration-content }
text-notes-configuration-content =
  text-note-class
  & attribute text:citation-style-name { styleNameRef }?
  & attribute text:citation-body-style-name { styleNameRef }?
  & attribute text:default-style-name { styleNameRef }?
  & attribute text:master-page-name { styleNameRef }?
  & attribute text:start-value { nonNegativeInteger }?
  & common-num-format-prefix-suffix-attlist
  & common-num-format-attlist?
  & attribute text:start-numbering-at {
      "document" | "chapter" | "page"
    }?
  & attribute text:footnotes-position {
      "text" | "page" | "section" | "document"
    }?
  & element text:note-continuation-notice-forward { text }?
  & element text:note-continuation-notice-backward { text }?
text-bibliography-configuration =
  element text:bibliography-configuration {
    text-bibliography-configuration-attlist, text-sort-key*
  }
text-bibliography-configuration-attlist =
  attribute text:prefix { \string }?
  & attribute text:suffix { \string }?
  & attribute text:numbered-entries { boolean }?
  & attribute text:sort-by-position { boolean }?
  & attribute fo:language { languageCode }?
  & attribute fo:country { countryCode }?
  & attribute fo:script { scriptCode }?
  & attribute style:rfc-language-tag { language }?
  & attribute text:sort-algorithm { \string }?
text-sort-key = element text:sort-key { text-sort-key-attlist, empty }
text-sort-key-attlist =
  attribute text:key {
    "address"
    | "annote"
    | "author"
    | "bibliography-type"
    | "booktitle"
    | "chapter"
    | "custom1"
    | "custom2"
    | "custom3"
    | "custom4"
    | "custom5"
    | "edition"
    | "editor"
    | "howpublished"
    | "identifier"
    | "institution"
    | "isbn"
    | "issn"
    | "journal"
    | "month"
    | "note"
    | "number"
    | "organizations"
    | "pages"
    | "publisher"
    | "report-type"
    | "school"
    | "series"
    | "title"
    | "url"
    | "volume"
    | "year"
  },
  attribute text:sort-ascending { boolean }?
text-list-style =
  element text:list-style {
    text-list-style-attr, text-list-style-content*
  }
text-list-style-attr =
  attribute style:name { styleName }
  & attribute style:display-name { \string }?
  & attribute text:consecutive-numbering { boolean }?
text-list-style-content =
  element text:list-level-style-number {
    text-list-level-style-attr,
    text-list-level-style-number-attr,
    style-list-level-properties?,
    style-text-properties?
  }
  | element text:list-level-style-bullet {
      text-list-level-style-attr,
      text-list-level-style-bullet-attr,
      style-list-level-properties?,
      style-text-properties?
    }
  | element text:list-level-style-image {
      text-list-level-style-attr,
      text-list-level-style-image-attr,
      style-list-level-properties?
    }
text-list-level-style-number-attr =
  attribute text:style-name { styleNameRef }?
  & common-num-format-attlist
  & common-num-format-prefix-suffix-attlist
  & attribute text:display-levels { positiveInteger }?
  & attribute text:start-value { positiveInteger }?
text-list-level-style-bullet-attr =
  attribute text:style-name { styleNameRef }?
  & attribute text:bullet-char { character }
  & common-num-format-prefix-suffix-attlist
  & attribute text:bullet-relative-size { percent }?
text-list-level-style-image-attr =
  common-draw-data-attlist | office-binary-data
text-list-level-style-attr = attribute text:level { positiveInteger }
text-outline-style =
  element text:outline-style {
    text-outline-style-attr, text-outline-level-style+
  }
text-outline-style-attr = attribute style:name { styleName }
text-outline-level-style =
  element text:outline-level-style {
    text-outline-level-style-attlist,
    style-list-level-properties?,
    style-text-properties?
  }
text-outline-level-style-attlist =
  attribute text:level { positiveInteger }
  & attribute text:style-name { styleNameRef }?
  & common-num-format-attlist
  & common-num-format-prefix-suffix-attlist
  & attribute text:display-levels { positiveInteger }?
  & attribute text:start-value { positiveInteger }?
style-graphic-properties =
  element style:graphic-properties {
    style-graphic-properties-content-strict
  }
style-graphic-properties-content-strict =
  style-graphic-properties-attlist,
  style-graphic-fill-properties-attlist,
  style-graphic-properties-elements
style-drawing-page-properties =
  element style:drawing-page-properties {
    style-drawing-page-properties-content-strict
  }
style-drawing-page-properties-content-strict =
  style-graphic-fill-properties-attlist,
  style-drawing-page-properties-attlist,
  style-drawing-page-properties-elements
draw-gradient =
  element draw:gradient {
    common-draw-gradient-attlist, draw-gradient-attlist, empty
  }
common-draw-gradient-attlist =
  attribute draw:name { styleName }?
  & attribute draw:display-name { \string }?
  & attribute draw:style { gradient-style }
  & attribute draw:cx { percent }?
  & attribute draw:cy { percent }?
  & attribute draw:angle { angle }?
  & attribute draw:border { percent }?
gradient-style =
  "linear" | "axial" | "radial" | "ellipsoid" | "square" | "rectangular"
draw-gradient-attlist =
  attribute draw:start-color { color }?
  & attribute draw:end-color { color }?
  & attribute draw:start-intensity { zeroToHundredPercent }?
  & attribute draw:end-intensity { zeroToHundredPercent }?
svg-linearGradient =
  element svg:linearGradient {
    common-svg-gradient-attlist,
    attribute svg:x1 { coordinate | percent }?,
    attribute svg:y1 { coordinate | percent }?,
    attribute svg:x2 { coordinate | percent }?,
    attribute svg:y2 { coordinate | percent }?,
    svg-stop*
  }
svg-radialGradient =
  element svg:radialGradient {
    common-svg-gradient-attlist,
    attribute svg:cx { coordinate | percent }?,
    attribute svg:cy { coordinate | percent }?,
    attribute svg:r { coordinate | percent }?,
    attribute svg:fx { coordinate | percent }?,
    attribute svg:fy { coordinate | percent }?,
    svg-stop*
  }
svg-stop =
  element svg:stop {
    attribute svg:offset { double | percent },
    attribute svg:stop-color { color }?,
    attribute svg:stop-opacity { double }?
  }
common-svg-gradient-attlist =
  attribute svg:gradientUnits { "objectBoundingBox" }?
  & attribute svg:gradientTransform { \string }?
  & attribute svg:spreadMethod { "pad" | "reflect" | "repeat" }?
  & attribute draw:name { styleName }
  & attribute draw:display-name { \string }?
draw-hatch = element draw:hatch { draw-hatch-attlist, empty }
draw-hatch-attlist =
  attribute draw:name { styleName }
  & attribute draw:display-name { \string }?
  & attribute draw:style { "single" | "double" | "triple" }
  & attribute draw:color { color }?
  & attribute draw:distance { length }?
  & attribute draw:rotation { angle }?
draw-fill-image =
  element draw:fill-image {
    draw-fill-image-attlist,
    attribute xlink:type { "simple" },
    attribute xlink:href { anyIRI },
    attribute xlink:show { "embed" }?,
    attribute xlink:actuate { "onLoad" }?,
    empty
  }
draw-fill-image-attlist =
  attribute draw:name { styleName }
  & attribute draw:display-name { \string }?
  & attribute svg:width { length }?
  & attribute svg:height { length }?
draw-opacity =
  element draw:opacity {
    common-draw-gradient-attlist, draw-opacity-attlist, empty
  }
draw-opacity-attlist =
  attribute draw:start { zeroToHundredPercent }?,
  attribute draw:end { zeroToHundredPercent }?
draw-marker =
  element draw:marker {
    draw-marker-attlist,
    common-draw-viewbox-attlist,
    common-draw-path-data-attlist,
    empty
  }
draw-marker-attlist =
  attribute draw:name { styleName }
  & attribute draw:display-name { \string }?
draw-stroke-dash =
  element draw:stroke-dash { draw-stroke-dash-attlist, empty }
draw-stroke-dash-attlist =
  attribute draw:name { styleName }
  & attribute draw:display-name { \string }?
  & attribute draw:style { "rect" | "round" }?
  & attribute draw:dots1 { integer }?
  & attribute draw:dots1-length { length | percent }?
  & attribute draw:dots2 { integer }?
  & attribute draw:dots2-length { length | percent }?
  & attribute draw:distance { length | percent }?
style-presentation-page-layout =
  element style:presentation-page-layout {
    attribute style:name { styleName },
    attribute style:display-name { \string }?,
    presentation-placeholder*
  }
presentation-placeholder =
  element presentation:placeholder {
    attribute presentation:object { presentation-classes },
    attribute svg:x { coordinate | percent },
    attribute svg:y { coordinate | percent },
    attribute svg:width { length | percent },
    attribute svg:height { length | percent },
    empty
  }
style-page-layout-properties =
  element style:page-layout-properties {
    style-page-layout-properties-content-strict
  }
style-page-layout-properties-content-strict =
  style-page-layout-properties-attlist,
  style-page-layout-properties-elements
style-page-layout-properties-attlist =
  attribute fo:page-width { length }?
  & attribute fo:page-height { length }?
  & common-num-format-attlist?
  & common-num-format-prefix-suffix-attlist
  & attribute style:paper-tray-name { "default" | \string }?
  & attribute style:print-orientation { "portrait" | "landscape" }?
  & common-horizontal-margin-attlist
  & common-vertical-margin-attlist
  & common-margin-attlist
  & common-border-attlist
  & common-border-line-width-attlist
  & common-padding-attlist
  & common-shadow-attlist
  & common-background-color-attlist
  & attribute style:register-truth-ref-style-name { styleNameRef }?
  & attribute style:print {
      list {
        ("headers"
         | "grid"
         | "annotations"
         | "objects"
         | "charts"
         | "drawings"
         | "formulas"
         | "zero-values")*
      }
    }?
  & attribute style:print-page-order { "ttb" | "ltr" }?
  & attribute style:first-page-number { positiveInteger | "continue" }?
  & attribute style:scale-to { percent }?
  & attribute style:scale-to-pages { positiveInteger }?
  & attribute style:table-centering {
      "horizontal" | "vertical" | "both" | "none"
    }?
  & attribute style:footnote-max-height { length }?
  & common-writing-mode-attlist
  & attribute style:layout-grid-mode { "none" | "line" | "both" }?
  & attribute style:layout-grid-standard-mode { boolean }?
  & attribute style:layout-grid-base-height { length }?
  & attribute style:layout-grid-ruby-height { length }?
  & attribute style:layout-grid-lines { positiveInteger }?
  & attribute style:layout-grid-base-width { length }?
  & attribute style:layout-grid-color { color }?
  & attribute style:layout-grid-ruby-below { boolean }?
  & attribute style:layout-grid-print { boolean }?
  & attribute style:layout-grid-display { boolean }?
  & attribute style:layout-grid-snap-to { boolean }?
style-page-layout-properties-elements =
  style-background-image & style-columns & style-footnote-sep
style-footnote-sep =
  element style:footnote-sep { style-footnote-sep-attlist, empty }?
style-footnote-sep-attlist =
  attribute style:width { length }?,
  attribute style:rel-width { percent }?,
  attribute style:color { color }?,
  attribute style:line-style { lineStyle }?,
  attribute style:adjustment { "left" | "center" | "right" }?,
  attribute style:distance-before-sep { length }?,
  attribute style:distance-after-sep { length }?
style-header-footer-properties =
  element style:header-footer-properties {
    style-header-footer-properties-content-strict
  }
style-header-footer-properties-content-strict =
  style-header-footer-properties-attlist,
  style-header-footer-properties-elements
style-header-footer-properties-attlist =
  attribute svg:height { length }?
  & attribute fo:min-height { length }?
  & common-horizontal-margin-attlist
  & common-vertical-margin-attlist
  & common-margin-attlist
  & common-border-attlist
  & common-border-line-width-attlist
  & common-padding-attlist
  & common-background-color-attlist
  & common-shadow-attlist
  & attribute style:dynamic-spacing { boolean }?
style-header-footer-properties-elements = style-background-image
style-text-properties =
  element style:text-properties { style-text-properties-content-strict }
style-text-properties-content-strict =
  style-text-properties-attlist, style-text-properties-elements
style-text-properties-elements = empty
style-text-properties-attlist =
  attribute fo:font-variant { fontVariant }?
  & attribute fo:text-transform {
      "none" | "lowercase" | "uppercase" | "capitalize"
    }?
  & attribute fo:color { color }?
  & attribute style:use-window-font-color { boolean }?
  & attribute style:text-outline { boolean }?
  & attribute style:text-line-through-type { lineType }?
  & attribute style:text-line-through-style { lineStyle }?
  & attribute style:text-line-through-width { lineWidth }?
  & attribute style:text-line-through-color { "font-color" | color }?
  & attribute style:text-line-through-text { \string }?
  & attribute style:text-line-through-text-style { styleNameRef }?
  & attribute style:text-position {
      list { (percent | "super" | "sub"), percent? }
    }?
  & attribute style:font-name { \string }?
  & attribute style:font-name-asian { \string }?
  & attribute style:font-name-complex { \string }?
  & attribute fo:font-family { \string }?
  & attribute style:font-family-asian { \string }?
  & attribute style:font-family-complex { \string }?
  & attribute style:font-family-generic { fontFamilyGeneric }?
  & attribute style:font-family-generic-asian { fontFamilyGeneric }?
  & attribute style:font-family-generic-complex { fontFamilyGeneric }?
  & attribute style:font-style-name { \string }?
  & attribute style:font-style-name-asian { \string }?
  & attribute style:font-style-name-complex { \string }?
  & attribute style:font-pitch { fontPitch }?
  & attribute style:font-pitch-asian { fontPitch }?
  & attribute style:font-pitch-complex { fontPitch }?
  & attribute style:font-charset { textEncoding }?
  & attribute style:font-charset-asian { textEncoding }?
  & attribute style:font-charset-complex { textEncoding }?
  & attribute fo:font-size { positiveLength | percent }?
  & attribute style:font-size-asian { positiveLength | percent }?
  & attribute style:font-size-complex { positiveLength | percent }?
  & attribute style:font-size-rel { length }?
  & attribute style:font-size-rel-asian { length }?
  & attribute style:font-size-rel-complex { length }?
  & attribute style:script-type {
      "latin" | "asian" | "complex" | "ignore"
    }?
  & attribute fo:letter-spacing { length | "normal" }?
  & attribute fo:language { languageCode }?
  & attribute style:language-asian { languageCode }?
  & attribute style:language-complex { languageCode }?
  & attribute fo:country { countryCode }?
  & attribute style:country-asian { countryCode }?
  & attribute style:country-complex { countryCode }?
  & attribute fo:script { scriptCode }?
  & attribute style:script-asian { scriptCode }?
  & attribute style:script-complex { scriptCode }?
  & attribute style:rfc-language-tag { language }?
  & attribute style:rfc-language-tag-asian { language }?
  & attribute style:rfc-language-tag-complex { language }?
  & attribute fo:font-style { fontStyle }?
  & attribute style:font-style-asian { fontStyle }?
  & attribute style:font-style-complex { fontStyle }?
  & attribute style:font-relief { "none" | "embossed" | "engraved" }?
  & attribute fo:text-shadow { shadowType }?
  & attribute style:text-underline-type { lineType }?
  & attribute style:text-underline-style { lineStyle }?
  & attribute style:text-underline-width { lineWidth }?
  & attribute style:text-underline-color { "font-color" | color }?
  & attribute style:text-overline-type { lineType }?
  & attribute style:text-overline-style { lineStyle }?
  & attribute style:text-overline-width { lineWidth }?
  & attribute style:text-overline-color { "font-color" | color }?
  & attribute style:text-overline-mode { lineMode }?
  & attribute fo:font-weight { fontWeight }?
  & attribute style:font-weight-asian { fontWeight }?
  & attribute style:font-weight-complex { fontWeight }?
  & attribute style:text-underline-mode { lineMode }?
  & attribute style:text-line-through-mode { lineMode }?
  & attribute style:letter-kerning { boolean }?
  & attribute style:text-blinking { boolean }?
  & common-background-color-attlist
  & attribute style:text-combine { "none" | "letters" | "lines" }?
  & attribute style:text-combine-start-char { character }?
  & attribute style:text-combine-end-char { character }?
  & attribute style:text-emphasize {
      "none"
      | list {
          ("none" | "accent" | "dot" | "circle" | "disc"),
          ("above" | "below")
        }
    }?
  & attribute style:text-scale { percent }?
  & attribute style:text-rotation-angle { angle }?
  & attribute style:text-rotation-scale { "fixed" | "line-height" }?
  & attribute fo:hyphenate { boolean }?
  & attribute fo:hyphenation-remain-char-count { positiveInteger }?
  & attribute fo:hyphenation-push-char-count { positiveInteger }?
  & (attribute text:display { "true" }
     | attribute text:display { "none" }
     | (attribute text:display { "condition" },
        attribute text:condition { "none" })
     | empty)
fontVariant = "normal" | "small-caps"
fontFamilyGeneric =
  "roman" | "swiss" | "modern" | "decorative" | "script" | "system"
fontPitch = "fixed" | "variable"
textEncoding = xsd:string { pattern = "[A-Za-z][A-Za-z0-9._\-]*" }
fontStyle = "normal" | "italic" | "oblique"
shadowType = "none" | \string
lineType = "none" | "single" | "double"
lineStyle =
  "none"
  | "solid"
  | "dotted"
  | "dash"
  | "long-dash"
  | "dot-dash"
  | "dot-dot-dash"
  | "wave"
lineWidth =
  "auto"
  | "normal"
  | "bold"
  | "thin"
  | "medium"
  | "thick"
  | positiveInteger
  | percent
  | positiveLength
fontWeight =
  "normal"
  | "bold"
  | "100"
  | "200"
  | "300"
  | "400"
  | "500"
  | "600"
  | "700"
  | "800"
  | "900"
lineMode = "continuous" | "skip-white-space"
style-paragraph-properties =
  element style:paragraph-properties {
    style-paragraph-properties-content-strict
  }
style-paragraph-properties-content-strict =
  style-paragraph-properties-attlist,
  style-paragraph-properties-elements
style-paragraph-properties-attlist =
  attribute fo:line-height { "normal" | nonNegativeLength | percent }?
  & attribute style:line-height-at-least { nonNegativeLength }?
  & attribute style:line-spacing { length }?
  & attribute style:font-independent-line-spacing { boolean }?
  & common-text-align
  & attribute fo:text-align-last { "start" | "center" | "justify" }?
  & attribute style:justify-single-word { boolean }?
  & attribute fo:keep-together { "auto" | "always" }?
  & attribute fo:widows { nonNegativeInteger }?
  & attribute fo:orphans { nonNegativeInteger }?
  & attribute style:tab-stop-distance { nonNegativeLength }?
  & attribute fo:hyphenation-keep { "auto" | "page" }?
  & attribute fo:hyphenation-ladder-count {
      "no-limit" | positiveInteger
    }?
  & attribute style:register-true { boolean }?
  & common-horizontal-margin-attlist
  & attribute fo:text-indent { length | percent }?
  & attribute style:auto-text-indent { boolean }?
  & common-vertical-margin-attlist
  & common-margin-attlist
  & common-break-attlist
  & common-background-color-attlist
  & common-border-attlist
  & common-border-line-width-attlist
  & attribute style:join-border { boolean }?
  & common-padding-attlist
  & common-shadow-attlist
  & common-keep-with-next-attlist
  & attribute text:number-lines { boolean }?
  & attribute text:line-number { nonNegativeInteger }?
  & attribute style:text-autospace { "none" | "ideograph-alpha" }?
  & attribute style:punctuation-wrap { "simple" | "hanging" }?
  & attribute style:line-break { "normal" | "strict" }?
  & attribute style:vertical-align {
      "top" | "middle" | "bottom" | "auto" | "baseline"
    }?
  & common-writing-mode-attlist
  & attribute style:writing-mode-automatic { boolean }?
  & attribute style:snap-to-layout-grid { boolean }?
  & common-page-number-attlist
  & common-background-transparency-attlist
common-text-align =
  attribute fo:text-align {
    "start" | "end" | "left" | "right" | "center" | "justify"
  }?
style-paragraph-properties-elements =
  style-tab-stops & style-drop-cap & style-background-image
style-tab-stops = element style:tab-stops { style-tab-stop* }?
style-tab-stop =
  element style:tab-stop { style-tab-stop-attlist, empty }
style-tab-stop-attlist =
  attribute style:position { length }
  & (attribute style:type { "left" | "center" | "right" }?
     | (attribute style:type { "char" },
        style-tab-stop-char-attlist))
  & attribute style:leader-type { lineType }?
  & attribute style:leader-style { lineStyle }?
  & attribute style:leader-width { lineWidth }?
  & attribute style:leader-color { "font-color" | color }?
  & attribute style:leader-text { character }?
  & attribute style:leader-text-style { styleNameRef }?
style-tab-stop-char-attlist = attribute style:char { character }
style-drop-cap =
  element style:drop-cap { style-drop-cap-attlist, empty }?
style-drop-cap-attlist =
  attribute style:length { "word" | positiveInteger }?
  & attribute style:lines { positiveInteger }?
  & attribute style:distance { length }?
  & attribute style:style-name { styleNameRef }?
common-horizontal-margin-attlist =
  attribute fo:margin-left { length | percent }?,
  attribute fo:margin-right { length | percent }?
common-vertical-margin-attlist =
  attribute fo:margin-top { nonNegativeLength | percent }?,
  attribute fo:margin-bottom { nonNegativeLength | percent }?
common-margin-attlist =
  attribute fo:margin { nonNegativeLength | percent }?
common-break-attlist =
  attribute fo:break-before { "auto" | "column" | "page" }?,
  attribute fo:break-after { "auto" | "column" | "page" }?
common-background-color-attlist =
  attribute fo:background-color { "transparent" | color }?
style-background-image =
  element style:background-image {
    style-background-image-attlist,
    (common-draw-data-attlist | office-binary-data | empty)
  }?
style-background-image-attlist =
  attribute style:repeat { "no-repeat" | "repeat" | "stretch" }?
  & attribute style:position {
      "left"
      | "center"
      | "right"
      | "top"
      | "bottom"
      | list { horiBackPos, vertBackPos }
      | list { vertBackPos, horiBackPos }
    }?
  & attribute style:filter-name { \string }?
  & attribute draw:opacity { zeroToHundredPercent }?
horiBackPos = "left" | "center" | "right"
vertBackPos = "top" | "center" | "bottom"
common-border-attlist =
  attribute fo:border { \string }?,
  attribute fo:border-top { \string }?,
  attribute fo:border-bottom { \string }?,
  attribute fo:border-left { \string }?,
  attribute fo:border-right { \string }?
common-border-line-width-attlist =
  attribute style:border-line-width { borderWidths }?,
  attribute style:border-line-width-top { borderWidths }?,
  attribute style:border-line-width-bottom { borderWidths }?,
  attribute style:border-line-width-left { borderWidths }?,
  attribute style:border-line-width-right { borderWidths }?
borderWidths = list { positiveLength, positiveLength, positiveLength }
common-padding-attlist =
  attribute fo:padding { nonNegativeLength }?,
  attribute fo:padding-top { nonNegativeLength }?,
  attribute fo:padding-bottom { nonNegativeLength }?,
  attribute fo:padding-left { nonNegativeLength }?,
  attribute fo:padding-right { nonNegativeLength }?
common-shadow-attlist = attribute style:shadow { shadowType }?
common-keep-with-next-attlist =
  attribute fo:keep-with-next { "auto" | "always" }?
common-writing-mode-attlist =
  attribute style:writing-mode {
    "lr-tb" | "rl-tb" | "tb-rl" | "tb-lr" | "lr" | "rl" | "tb" | "page"
  }?
common-page-number-attlist =
  attribute style:page-number { positiveInteger | "auto" }?
common-background-transparency-attlist =
  attribute style:background-transparency { zeroToHundredPercent }?
style-ruby-properties =
  element style:ruby-properties { style-ruby-properties-content-strict }
style-ruby-properties-content-strict =
  style-ruby-properties-attlist, style-ruby-properties-elements
style-ruby-properties-elements = empty
style-ruby-properties-attlist =
  attribute style:ruby-position { "above" | "below" }?
  & attribute style:ruby-align {
      "left"
      | "center"
      | "right"
      | "distribute-letter"
      | "distribute-space"
    }?
style-section-properties =
  element style:section-properties {
    style-section-properties-content-strict
  }
style-section-properties-content-strict =
  style-section-properties-attlist, style-section-properties-elements
style-section-properties-attlist =
  common-background-color-attlist
  & common-horizontal-margin-attlist
  & attribute style:protect { boolean }?
  & common-editable-attlist
  & attribute text:dont-balance-text-columns { boolean }?
  & common-writing-mode-attlist
style-section-properties-elements =
  style-background-image & style-columns & text-notes-configuration*
style-columns =
  element style:columns {
    style-columns-attlist, style-column-sep?, style-column*
  }?
style-columns-attlist =
  attribute fo:column-count { positiveInteger }
  & attribute fo:column-gap { length }?
style-column = element style:column { style-column-attlist }
style-column-attlist =
  attribute style:rel-width { relativeLength }
  & attribute fo:start-indent { length }?
  & attribute fo:end-indent { length }?
  & attribute fo:space-before { length }?
  & attribute fo:space-after { length }?
style-column-sep = element style:column-sep { style-column-sep-attlist }
style-column-sep-attlist =
  attribute style:style {
    "none" | "solid" | "dotted" | "dashed" | "dot-dashed"
  }?
  & attribute style:width { length }
  & attribute style:height { zeroToHundredPercent }?
  & attribute style:vertical-align { "top" | "middle" | "bottom" }?
  & attribute style:color { color }?
style-table-properties =
  element style:table-properties {
    style-table-properties-content-strict
  }
style-table-properties-content-strict =
  style-table-properties-attlist, style-table-properties-elements
style-table-properties-attlist =
  attribute style:width { positiveLength }?
  & attribute style:rel-width { percent }?
  & attribute table:align { "left" | "center" | "right" | "margins" }?
  & common-horizontal-margin-attlist
  & common-vertical-margin-attlist
  & common-margin-attlist
  & common-page-number-attlist
  & common-break-attlist
  & common-background-color-attlist
  & common-shadow-attlist
  & common-keep-with-next-attlist
  & attribute style:may-break-between-rows { boolean }?
  & attribute table:border-model { "collapsing" | "separating" }?
  & common-writing-mode-attlist
  & attribute table:display { boolean }?
style-table-properties-elements = style-background-image
style-table-column-properties =
  element style:table-column-properties {
    style-table-column-properties-content-strict
  }
style-table-column-properties-content-strict =
  style-table-column-properties-attlist,
  style-table-column-properties-elements
style-table-column-properties-elements = empty
style-table-column-properties-attlist =
  attribute style:column-width { positiveLength }?
  & attribute style:rel-column-width { relativeLength }?
  & attribute style:use-optimal-column-width { boolean }?
  & common-break-attlist
style-table-row-properties =
  element style:table-row-properties {
    style-table-row-properties-content-strict
  }
style-table-row-properties-content-strict =
  style-table-row-properties-attlist,
  style-table-row-properties-elements
style-table-row-properties-attlist =
  attribute style:row-height { positiveLength }?
  & attribute style:min-row-height { nonNegativeLength }?
  & attribute style:use-optimal-row-height { boolean }?
  & common-background-color-attlist
  & common-break-attlist
  & attribute fo:keep-together { "auto" | "always" }?
style-table-row-properties-elements = style-background-image
style-table-cell-properties =
  element style:table-cell-properties {
    style-table-cell-properties-content-strict
  }
style-table-cell-properties-content-strict =
  style-table-cell-properties-attlist,
  style-table-cell-properties-elements
style-table-cell-properties-attlist =
  attribute style:vertical-align {
    "top" | "middle" | "bottom" | "automatic"
  }?
  & attribute style:text-align-source { "fix" | "value-type" }?
  & common-style-direction-attlist
  & attribute style:glyph-orientation-vertical {
      "auto" | "0" | "0deg" | "0rad" | "0grad"
    }?
  & common-writing-mode-attlist
  & common-shadow-attlist
  & common-background-color-attlist
  & common-border-attlist
  & attribute style:diagonal-tl-br { \string }?
  & attribute style:diagonal-tl-br-widths { borderWidths }?
  & attribute style:diagonal-bl-tr { \string }?
  & attribute style:diagonal-bl-tr-widths { borderWidths }?
  & common-border-line-width-attlist
  & common-padding-attlist
  & attribute fo:wrap-option { "no-wrap" | "wrap" }?
  & common-rotation-angle-attlist
  & attribute style:rotation-align {
      "none" | "bottom" | "top" | "center"
    }?
  & attribute style:cell-protect {
      "none"
      | "hidden-and-protected"
      | list { ("protected" | "formula-hidden")+ }
    }?
  & attribute style:print-content { boolean }?
  & attribute style:decimal-places { nonNegativeInteger }?
  & attribute style:repeat-content { boolean }?
  & attribute style:shrink-to-fit { boolean }?
common-style-direction-attlist =
  attribute style:direction { "ltr" | "ttb" }?
style-table-cell-properties-elements = style-background-image
common-rotation-angle-attlist =
  attribute style:rotation-angle { angle }?
style-list-level-properties =
  element style:list-level-properties {
    style-list-level-properties-content-strict
  }
style-list-level-properties-content-strict =
  style-list-level-properties-attlist,
  style-list-level-properties-elements
style-list-level-properties-attlist =
  common-text-align
  & attribute text:space-before { length }?
  & attribute text:min-label-width { nonNegativeLength }?
  & attribute text:min-label-distance { nonNegativeLength }?
  & attribute style:font-name { \string }?
  & attribute fo:width { positiveLength }?
  & attribute fo:height { positiveLength }?
  & common-vertical-rel-attlist
  & common-vertical-pos-attlist
  & attribute text:list-level-position-and-space-mode {
      "label-width-and-position" | "label-alignment"
    }?
style-list-level-properties-elements = style-list-level-label-alignment
style-list-level-label-alignment =
  element style:list-level-label-alignment {
    style-list-level-label-alignment-attlist, empty
  }?
style-list-level-label-alignment-attlist =
  attribute text:label-followed-by { "listtab" | "space" | "nothing" }
  & attribute text:list-tab-stop-position { length }?
  & attribute fo:text-indent { length }?
  & attribute fo:margin-left { length }?
style-graphic-properties-attlist =
  attribute draw:stroke { "none" | "dash" | "solid" }?
  & attribute draw:stroke-dash { styleNameRef }?
  & attribute draw:stroke-dash-names { styleNameRefs }?
  & attribute svg:stroke-width { length }?
  & attribute svg:stroke-color { color }?
  & attribute draw:marker-start { styleNameRef }?
  & attribute draw:marker-end { styleNameRef }?
  & attribute draw:marker-start-width { length }?
  & attribute draw:marker-end-width { length }?
  & attribute draw:marker-start-center { boolean }?
  & attribute draw:marker-end-center { boolean }?
  & attribute svg:stroke-opacity {
      xsd:double { minInclusive = "0" maxInclusive = "1" }
      | zeroToHundredPercent
    }?
  & attribute draw:stroke-linejoin {
      "miter" | "round" | "bevel" | "middle" | "none"
    }?
  & attribute svg:stroke-linecap { "butt" | "square" | "round" }?
  & attribute draw:symbol-color { color }?
  & attribute text:animation {
      "none" | "scroll" | "alternate" | "slide"
    }?
  & attribute text:animation-direction {
      "left" | "right" | "up" | "down"
    }?
  & attribute text:animation-start-inside { boolean }?
  & attribute text:animation-stop-inside { boolean }?
  & attribute text:animation-repeat { nonNegativeInteger }?
  & attribute text:animation-delay { duration }?
  & attribute text:animation-steps { length }?
  & attribute draw:auto-grow-width { boolean }?
  & attribute draw:auto-grow-height { boolean }?
  & attribute draw:fit-to-size { boolean }?
  & attribute draw:fit-to-contour { boolean }?
  & attribute draw:textarea-vertical-align {
      "top" | "middle" | "bottom" | "justify"
    }?
  & attribute draw:textarea-horizontal-align {
      "left" | "center" | "right" | "justify"
    }?
  & attribute fo:wrap-option { "no-wrap" | "wrap" }?
  & attribute style:shrink-to-fit { boolean }?
  & attribute draw:color-mode {
      "greyscale" | "mono" | "watermark" | "standard"
    }?
  & attribute draw:color-inversion { boolean }?
  & attribute draw:luminance { zeroToHundredPercent }?
  & attribute draw:contrast { percent }?
  & attribute draw:gamma { percent }?
  & attribute draw:red { signedZeroToHundredPercent }?
  & attribute draw:green { signedZeroToHundredPercent }?
  & attribute draw:blue { signedZeroToHundredPercent }?
  & attribute draw:image-opacity { zeroToHundredPercent }?
  & attribute draw:shadow { "visible" | "hidden" }?
  & attribute draw:shadow-offset-x { length }?
  & attribute draw:shadow-offset-y { length }?
  & attribute draw:shadow-color { color }?
  & attribute draw:shadow-opacity { zeroToHundredPercent }?
  & attribute draw:start-line-spacing-horizontal { distance }?
  & attribute draw:start-line-spacing-vertical { distance }?
  & attribute draw:end-line-spacing-horizontal { distance }?
  & attribute draw:end-line-spacing-vertical { distance }?
  & attribute draw:line-distance { distance }?
  & attribute draw:guide-overhang { length }?
  & attribute draw:guide-distance { distance }?
  & attribute draw:start-guide { length }?
  & attribute draw:end-guide { length }?
  & attribute draw:placing { "below" | "above" }?
  & attribute draw:parallel { boolean }?
  & attribute draw:measure-align {
      "automatic" | "left-outside" | "inside" | "right-outside"
    }?
  & attribute draw:measure-vertical-align {
      "automatic" | "above" | "below" | "center"
    }?
  & attribute draw:unit {
      "automatic"
      | "mm"
      | "cm"
      | "m"
      | "km"
      | "pt"
      | "pc"
      | "inch"
      | "ft"
      | "mi"
    }?
  & attribute draw:show-unit { boolean }?
  & attribute draw:decimal-places { nonNegativeInteger }?
  & attribute draw:caption-type {
      "straight-line" | "angled-line" | "angled-connector-line"
    }?
  & attribute draw:caption-angle-type { "fixed" | "free" }?
  & attribute draw:caption-angle { angle }?
  & attribute draw:caption-gap { distance }?
  & attribute draw:caption-escape-direction {
      "horizontal" | "vertical" | "auto"
    }?
  & attribute draw:caption-escape { length | percent }?
  & attribute draw:caption-line-length { length }?
  & attribute draw:caption-fit-line-length { boolean }?
  & attribute dr3d:horizontal-segments { nonNegativeInteger }?
  & attribute dr3d:vertical-segments { nonNegativeInteger }?
  & attribute dr3d:edge-rounding { percent }?
  & attribute dr3d:edge-rounding-mode { "correct" | "attractive" }?
  & attribute dr3d:back-scale { percent }?
  & attribute dr3d:depth { length }?
  & attribute dr3d:backface-culling { "enabled" | "disabled" }?
  & attribute dr3d:end-angle { angle }?
  & attribute dr3d:close-front { boolean }?
  & attribute dr3d:close-back { boolean }?
  & attribute dr3d:lighting-mode { "standard" | "double-sided" }?
  & attribute dr3d:normals-kind { "object" | "flat" | "sphere" }?
  & attribute dr3d:normals-direction { "normal" | "inverse" }?
  & attribute dr3d:texture-generation-mode-x {
      "object" | "parallel" | "sphere"
    }?
  & attribute dr3d:texture-generation-mode-y {
      "object" | "parallel" | "sphere"
    }?
  & attribute dr3d:texture-kind { "luminance" | "intensity" | "color" }?
  & attribute dr3d:texture-filter { "enabled" | "disabled" }?
  & attribute dr3d:texture-mode { "replace" | "modulate" | "blend" }?
  & attribute dr3d:ambient-color { color }?
  & attribute dr3d:emissive-color { color }?
  & attribute dr3d:specular-color { color }?
  & attribute dr3d:diffuse-color { color }?
  & attribute dr3d:shininess { percent }?
  & attribute dr3d:shadow { "visible" | "hidden" }?
  & common-draw-rel-size-attlist
  & attribute fo:min-width { length | percent }?
  & attribute fo:min-height { length | percent }?
  & attribute fo:max-height { length | percent }?
  & attribute fo:max-width { length | percent }?
  & common-horizontal-margin-attlist
  & common-vertical-margin-attlist
  & common-margin-attlist
  & attribute style:print-content { boolean }?
  & attribute style:protect {
      "none"
      | list { ("content" | "position" | "size")+ }
    }?
  & attribute style:horizontal-pos {
      "left"
      | "center"
      | "right"
      | "from-left"
      | "inside"
      | "outside"
      | "from-inside"
    }?
  & attribute svg:x { coordinate }?
  & attribute style:horizontal-rel {
      "page"
      | "page-content"
      | "page-start-margin"
      | "page-end-margin"
      | "frame"
      | "frame-content"
      | "frame-start-margin"
      | "frame-end-margin"
      | "paragraph"
      | "paragraph-content"
      | "paragraph-start-margin"
      | "paragraph-end-margin"
      | "char"
    }?
  & common-vertical-pos-attlist
  & common-vertical-rel-attlist
  & common-text-anchor-attlist
  & common-border-attlist
  & common-border-line-width-attlist
  & common-padding-attlist
  & common-shadow-attlist
  & common-background-color-attlist
  & common-background-transparency-attlist
  & common-editable-attlist
  & attribute style:wrap {
      "none"
      | "left"
      | "right"
      | "parallel"
      | "dynamic"
      | "run-through"
      | "biggest"
    }?
  & attribute style:wrap-dynamic-threshold { nonNegativeLength }?
  & attribute style:number-wrapped-paragraphs {
      "no-limit" | positiveInteger
    }?
  & attribute style:wrap-contour { boolean }?
  & attribute style:wrap-contour-mode { "full" | "outside" }?
  & attribute style:run-through { "foreground" | "background" }?
  & attribute style:flow-with-text { boolean }?
  & attribute style:overflow-behavior {
      "clip" | "auto-create-new-frame"
    }?
  & attribute style:mirror {
      "none"
      | "vertical"
      | horizontal-mirror
      | list { "vertical", horizontal-mirror }
      | list { horizontal-mirror, "vertical" }
    }?
  & attribute fo:clip { "auto" | clipShape }?
  & attribute draw:wrap-influence-on-position {
      "iterative" | "once-concurrent" | "once-successive"
    }?
  & common-writing-mode-attlist
  & attribute draw:frame-display-scrollbar { boolean }?
  & attribute draw:frame-display-border { boolean }?
  & attribute draw:frame-margin-horizontal { nonNegativePixelLength }?
  & attribute draw:frame-margin-vertical { nonNegativePixelLength }?
  & attribute draw:visible-area-left { nonNegativeLength }?
  & attribute draw:visible-area-top { nonNegativeLength }?
  & attribute draw:visible-area-width { positiveLength }?
  & attribute draw:visible-area-height { positiveLength }?
  & attribute draw:draw-aspect {
      "content" | "thumbnail" | "icon" | "print-view"
    }?
  & attribute draw:ole-draw-aspect { nonNegativeInteger }?
style-graphic-fill-properties-attlist =
  attribute draw:fill {
    "none" | "solid" | "bitmap" | "gradient" | "hatch"
  }?
  & attribute draw:fill-color { color }?
  & attribute draw:secondary-fill-color { color }?
  & attribute draw:fill-gradient-name { styleNameRef }?
  & attribute draw:gradient-step-count { nonNegativeInteger }?
  & attribute draw:fill-hatch-name { styleNameRef }?
  & attribute draw:fill-hatch-solid { boolean }?
  & attribute draw:fill-image-name { styleNameRef }?
  & attribute style:repeat { "no-repeat" | "repeat" | "stretch" }?
  & attribute draw:fill-image-width { length | percent }?
  & attribute draw:fill-image-height { length | percent }?
  & attribute draw:fill-image-ref-point-x { percent }?
  & attribute draw:fill-image-ref-point-y { percent }?
  & attribute draw:fill-image-ref-point {
      "top-left"
      | "top"
      | "top-right"
      | "left"
      | "center"
      | "right"
      | "bottom-left"
      | "bottom"
      | "bottom-right"
    }?
  & attribute draw:tile-repeat-offset {
      list { zeroToHundredPercent, ("horizontal" | "vertical") }
    }?
  & attribute draw:opacity { zeroToHundredPercent }?
  & attribute draw:opacity-name { styleNameRef }?
  & attribute svg:fill-rule { "nonzero" | "evenodd" }?
style-graphic-properties-elements =
  text-list-style? & style-background-image & style-columns
common-vertical-pos-attlist =
  attribute style:vertical-pos {
    "top" | "middle" | "bottom" | "from-top" | "below"
  }?,
  attribute svg:y { coordinate }?
common-vertical-rel-attlist =
  attribute style:vertical-rel {
    "page"
    | "page-content"
    | "frame"
    | "frame-content"
    | "paragraph"
    | "paragraph-content"
    | "char"
    | "line"
    | "baseline"
    | "text"
  }?
common-editable-attlist = attribute style:editable { boolean }?
horizontal-mirror =
  "horizontal" | "horizontal-on-odd" | "horizontal-on-even"
clipShape =
  xsd:string {
    pattern =
      "rect\([ ]*((-?([0-9]+(\.[0-9]*)?|\.[0-9]+)((cm)|(mm)|(in)|(pt)|(pc)))|(auto))([ ]*,[ ]*((-?([0-9]+(\.[0-9]*)?|\.[0-9]+)((cm)|(mm)|(in)|(pt)|(pc))))|(auto)){3}[ ]*\)"
  }
nonNegativePixelLength =
  xsd:string { pattern = "([0-9]+(\.[0-9]*)?|\.[0-9]+)(px)" }
style-chart-properties =
  element style:chart-properties {
    style-chart-properties-content-strict
  }
style-chart-properties-content-strict =
  style-chart-properties-attlist, style-chart-properties-elements
style-chart-properties-elements = empty
style-chart-properties-attlist =
  attribute chart:scale-text { boolean }?
  & attribute chart:three-dimensional { boolean }?
  & attribute chart:deep { boolean }?
  & attribute chart:right-angled-axes { boolean }?
  & (attribute chart:symbol-type { "none" }
     | attribute chart:symbol-type { "automatic" }
     | (attribute chart:symbol-type { "named-symbol" },
        attribute chart:symbol-name {
          "square"
          | "diamond"
          | "arrow-down"
          | "arrow-up"
          | "arrow-right"
          | "arrow-left"
          | "bow-tie"
          | "hourglass"
          | "circle"
          | "star"
          | "x"
          | "plus"
          | "asterisk"
          | "horizontal-bar"
          | "vertical-bar"
        })
     | (attribute chart:symbol-type { "image" },
        element chart:symbol-image {
          attribute xlink:href { anyIRI }
        })
     | empty)
  & attribute chart:symbol-width { nonNegativeLength }?
  & attribute chart:symbol-height { nonNegativeLength }?
  & attribute chart:sort-by-x-values { boolean }?
  & attribute chart:vertical { boolean }?
  & attribute chart:connect-bars { boolean }?
  & attribute chart:gap-width { integer }?
  & attribute chart:overlap { integer }?
  & attribute chart:group-bars-per-axis { boolean }?
  & attribute chart:japanese-candle-stick { boolean }?
  & attribute chart:interpolation {
      "none" | "cubic-spline" | "b-spline"
    }?
  & attribute chart:spline-order { positiveInteger }?
  & attribute chart:spline-resolution { positiveInteger }?
  & attribute chart:pie-offset { nonNegativeInteger }?
  & attribute chart:angle-offset { angle }?
  & attribute chart:hole-size { percent }?
  & attribute chart:lines { boolean }?
  & attribute chart:solid-type {
      "cuboid" | "cylinder" | "cone" | "pyramid"
    }?
  & attribute chart:stacked { boolean }?
  & attribute chart:percentage { boolean }?
  & attribute chart:treat-empty-cells {
      "use-zero" | "leave-gap" | "ignore"
    }?
  & attribute chart:link-data-style-to-source { boolean }?
  & attribute chart:logarithmic { boolean }?
  & attribute chart:maximum { double }?
  & attribute chart:minimum { double }?
  & attribute chart:origin { double }?
  & attribute chart:interval-major { double }?
  & attribute chart:interval-minor-divisor { positiveInteger }?
  & attribute chart:tick-marks-major-inner { boolean }?
  & attribute chart:tick-marks-major-outer { boolean }?
  & attribute chart:tick-marks-minor-inner { boolean }?
  & attribute chart:tick-marks-minor-outer { boolean }?
  & attribute chart:reverse-direction { boolean }?
  & attribute chart:display-label { boolean }?
  & attribute chart:text-overlap { boolean }?
  & attribute text:line-break { boolean }?
  & attribute chart:label-arrangement {
      "side-by-side" | "stagger-even" | "stagger-odd"
    }?
  & common-style-direction-attlist
  & common-rotation-angle-attlist
  & attribute chart:data-label-number {
      "none" | "value" | "percentage" | "value-and-percentage"
    }?
  & attribute chart:data-label-text { boolean }?
  & attribute chart:data-label-symbol { boolean }?
  & element chart:label-separator { text-p }?
  & attribute chart:label-position { labelPositions }?
  & attribute chart:label-position-negative { labelPositions }?
  & attribute chart:visible { boolean }?
  & attribute chart:auto-position { boolean }?
  & attribute chart:auto-size { boolean }?
  & attribute chart:mean-value { boolean }?
  & attribute chart:error-category {
      "none"
      | "variance"
      | "standard-deviation"
      | "percentage"
      | "error-margin"
      | "constant"
      | "standard-error"
      | "cell-range"
    }?
  & attribute chart:error-percentage { double }?
  & attribute chart:error-margin { double }?
  & attribute chart:error-lower-limit { double }?
  & attribute chart:error-upper-limit { double }?
  & attribute chart:error-upper-indicator { boolean }?
  & attribute chart:error-lower-indicator { boolean }?
  & attribute chart:error-lower-range { cellRangeAddressList }?
  & attribute chart:error-upper-range { cellRangeAddressList }?
  & attribute chart:series-source { "columns" | "rows" }?
  & attribute chart:regression-type {
      "none" | "linear" | "logarithmic" | "exponential" | "power"
    }?
  & attribute chart:axis-position { "start" | "end" | double }?
  & attribute chart:axis-label-position {
      "near-axis"
      | "near-axis-other-side"
      | "outside-start"
      | "outside-end"
    }?
  & attribute chart:tick-mark-position {
      "at-labels" | "at-axis" | "at-labels-and-axis"
    }?
  & attribute chart:include-hidden-cells { boolean }?
labelPositions =
  "avoid-overlap"
  | "center"
  | "top"
  | "top-right"
  | "right"
  | "bottom-right"
  | "bottom"
  | "bottom-left"
  | "left"
  | "top-left"
  | "inside"
  | "outside"
  | "near-origin"
style-drawing-page-properties-attlist =
  attribute presentation:transition-type {
    "manual" | "automatic" | "semi-automatic"
  }?
  & attribute presentation:transition-style {
      "none"
      | "fade-from-left"
      | "fade-from-top"
      | "fade-from-right"
      | "fade-from-bottom"
      | "fade-from-upperleft"
      | "fade-from-upperright"
      | "fade-from-lowerleft"
      | "fade-from-lowerright"
      | "move-from-left"
      | "move-from-top"
      | "move-from-right"
      | "move-from-bottom"
      | "move-from-upperleft"
      | "move-from-upperright"
      | "move-from-lowerleft"
      | "move-from-lowerright"
      | "uncover-to-left"
      | "uncover-to-top"
      | "uncover-to-right"
      | "uncover-to-bottom"
      | "uncover-to-upperleft"
      | "uncover-to-upperright"
      | "uncover-to-lowerleft"
      | "uncover-to-lowerright"
      | "fade-to-center"
      | "fade-from-center"
      | "vertical-stripes"
      | "horizontal-stripes"
      | "clockwise"
      | "counterclockwise"
      | "open-vertical"
      | "open-horizontal"
      | "close-vertical"
      | "close-horizontal"
      | "wavyline-from-left"
      | "wavyline-from-top"
      | "wavyline-from-right"
      | "wavyline-from-bottom"
      | "spiralin-left"
      | "spiralin-right"
      | "spiralout-left"
      | "spiralout-right"
      | "roll-from-top"
      | "roll-from-left"
      | "roll-from-right"
      | "roll-from-bottom"
      | "stretch-from-left"
      | "stretch-from-top"
      | "stretch-from-right"
      | "stretch-from-bottom"
      | "vertical-lines"
      | "horizontal-lines"
      | "dissolve"
      | "random"
      | "vertical-checkerboard"
      | "horizontal-checkerboard"
      | "interlocking-horizontal-left"
      | "interlocking-horizontal-right"
      | "interlocking-vertical-top"
      | "interlocking-vertical-bottom"
      | "fly-away"
      | "open"
      | "close"
      | "melt"
    }?
  & attribute presentation:transition-speed { presentationSpeeds }?
  & attribute smil:type { \string }?
  & attribute smil:subtype { \string }?
  & attribute smil:direction { "forward" | "reverse" }?
  & attribute smil:fadeColor { color }?
  & attribute presentation:duration { duration }?
  & attribute presentation:visibility { "visible" | "hidden" }?
  & attribute draw:background-size { "full" | "border" }?
  & attribute presentation:background-objects-visible { boolean }?
  & attribute presentation:background-visible { boolean }?
  & attribute presentation:display-header { boolean }?
  & attribute presentation:display-footer { boolean }?
  & attribute presentation:display-page-number { boolean }?
  & attribute presentation:display-date-time { boolean }?
style-drawing-page-properties-elements = presentation-sound?
\string = xsd:string
date = xsd:date
time = xsd:time
dateTime = xsd:dateTime
duration = xsd:duration
integer = xsd:integer
nonNegativeInteger = xsd:nonNegativeInteger
positiveInteger = xsd:positiveInteger
double = xsd:double
anyURI = xsd:anyURI
base64Binary = xsd:base64Binary
ID = xsd:ID
IDREF = xsd:IDREF
IDREFS = xsd:IDREFS
NCName = xsd:NCName
boolean = "true" | "false"
dateOrDateTime = xsd:date | xsd:dateTime
timeOrDateTime = xsd:time | xsd:dateTime
language = xsd:language
countryCode = xsd:token { pattern = "[A-Za-z0-9]{1,8}" }
languageCode = xsd:token { pattern = "[A-Za-z]{1,8}" }
scriptCode = xsd:token { pattern = "[A-Za-z0-9]{1,8}" }
character = xsd:string { length = "1" }
length =
  xsd:string {
    pattern =
      "-?([0-9]+(\.[0-9]*)?|\.[0-9]+)((cm)|(mm)|(in)|(pt)|(pc)|(px))"
  }
nonNegativeLength =
  xsd:string {
    pattern =
      "([0-9]+(\.[0-9]*)?|\.[0-9]+)((cm)|(mm)|(in)|(pt)|(pc)|(px))"
  }
positiveLength =
  xsd:string {
    pattern =
      "([0-9]*[1-9][0-9]*(\.[0-9]*)?|0+\.[0-9]*[1-9][0-9]*|\.[0-9]*[1-9][0-9]*)((cm)|(mm)|(in)|(pt)|(pc)|(px))"
  }
percent = xsd:string { pattern = "-?([0-9]+(\.[0-9]*)?|\.[0-9]+)%" }
zeroToHundredPercent =
  xsd:string {
    pattern = "([0-9]?[0-9](\.[0-9]*)?|100(\.0*)?|\.[0-9]+)%"
  }
signedZeroToHundredPercent =
  xsd:string {
    pattern = "-?([0-9]?[0-9](\.[0-9]*)?|100(\.0*)?|\.[0-9]+)%"
  }
relativeLength = xsd:string { pattern = "[0-9]+\*" }
coordinate = length
distance = length
color = xsd:string { pattern = "#[0-9a-fA-F]{6}" }
angle = xsd:string
CURIE =
  xsd:string { pattern = "(([\i-[:]][\c-[:]]*)?:)?.+" minLength = "1" }
CURIEs = list { CURIE+ }
SafeCURIE =
  xsd:string {
    pattern = "\[(([\i-[:]][\c-[:]]*)?:)?.+\]"
    minLength = "3"
  }
URIorSafeCURIE = anyURI | SafeCURIE
styleName = xsd:NCName
styleNameRef = xsd:NCName | empty
styleNameRefs = list { xsd:NCName* }
variableName = xsd:string
targetFrameName = "_self" | "_blank" | "_parent" | "_top" | \string
valueType =
  "float"
  | "time"
  | "date"
  | "percentage"
  | "currency"
  | "boolean"
  | "string"
points =
  xsd:string { pattern = "-?[0-9]+,-?[0-9]+([ ]+-?[0-9]+,-?[0-9]+)*" }
pathData = xsd:string
vector3D =
  xsd:string {
    pattern =
      "\([ ]*-?([0-9]+(\.[0-9]*)?|\.[0-9]+)([ ]+-?([0-9]+(\.[0-9]*)?|\.[0-9]+)){2}[ ]*\)"
  }
namespacedToken = xsd:QName { pattern = "[^:]+:[^:]+" }
anyIRI =
  xsd:anyURI
  >> dc:description [
       "An IRI-reference as defined in [RFC3987]. See ODF 1.2 Part 1 section 18.3."
     ]
anyAttListOrElements =
  attribute * { text }*,
  anyElements
anyElements =
  element * {
    mixed { anyAttListOrElements }
  }*