Parts

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-common-attrs =
  attribute office:version { "1.2" }
  & attribute grddl:transformation {
      list { anyIRI* }
    }?

Content

office-document-content =
  element office:document-content {
    office-document-common-attrs,
    office-scripts,
    office-font-face-decls,
    office-automatic-styles,
    office-body
  }
office-body = element office:body {
  element office:text {
    attribute text:global { boolean }? &
    attribute text:use-soft-page-breaks { boolean }?,
    office-forms,
    text-tracked-changes,
    text-decls,
    table-decls,
    text-content* | (text-page-sequence, (shape)*),
    table-functions
  }
}
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?
table-decls =
  table-calculation-settings?,
  table-content-validations?,
  table-label-ranges?
text-page-sequence =
  element text:page-sequence {
    text-page+
  }
text-page =
  element text:page {
    attribute text:master-page-name { styleNameRef },
    empty
  }
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

Paragraphs

text-h =
  element text:h {
    heading-attrs,
    paragraph-attrs,
    element text:number { \string }?,
    (paragraph-content | text-a)*
  }
text-p =
  element text:p {
    paragraph-attrs,
    (paragraph-content | text-a)*
  }
heading-attrs =
  attribute text:outline-level { positiveInteger } &
  attribute text:restart-numbering { boolean }? &
  attribute text:start-value { nonNegativeInteger }? &
  attribute text:is-list-header { boolean }?
paragraph-attrs =
  attribute text:style-name { styleNameRef }? &
  attribute text:class-names { styleNameRefs }? &
  attribute text:cond-style-name { styleNameRef }? &
  (attribute xml:id { ID }, attribute text:id { NCName }?)? &
  common-in-content-meta-attlist?
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 }?
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 | text-a)*
    } |
  element text:meta {
      common-in-content-meta-attlist? &
      attribute xml:id { ID }?,
      (paragraph-content | text-a)*
    } |
  (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 | text-a)* },
      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: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:title { common-field-fixed-attlist, text } |
  element text:subject { common-field-fixed-attlist, text } |
  element text:keywords { common-field-fixed-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:hidden-paragraph {
      text-hidden-paragraph-attlist, text
    } |
  element text:meta-field { text-meta-field-attlist, (paragraph-content | text-a)* } |
  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
    }
text-a =
  element text:a {
    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 }?,
    office-event-listeners?,
    paragraph-content*
  }

Lists

text-list =
  element text:list {
    attribute text:style-name { styleNameRef }? &
    attribute text:continue-numbering { boolean }? &
    attribute text:continue-list { IDREF }? &
    attribute xml:id { ID }?
    text-list-header?,
    text-list-item*
  }
text-list-header =
  element text:list-header {
    attribute xml:id { ID }?,
    text-list-item-content
  }
text-list-item =
  element text:list-item {
    attribute text:start-value { nonNegativeInteger }? &
    attribute text:style-override { styleNameRef }? &
    attribute xml:id { ID }?,
    text-list-item-content
  }
text-list-item-content =
  element text:number { \string }?,
  (text-p | text-h | text-list | text-soft-page-break)*

Numbered paragraphs

text-numbered-paragraph =
  element text:numbered-paragraph {
    text-numbered-paragraph-attr,
    element text:number { \string }?,
    (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 })?
  & attribute xml:id { ID }?

Sections

text-section =
  element text:section {
    text-section-attlist,
    (text-section-source | office-dde-source | empty),
    text-content*
  }
text-section-attlist =
  common-section-attlist
  & (attribute text:display { "true" | "none" }
     | (attribute text:display { "condition" },
        attribute text:condition { \string })
     | empty)
text-section-source =
  element text:section-source {
    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-soft-page-break = element text:soft-page-break { 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 }?
  & attribute xml:id { ID }?

Tables

table-table =
  element table:table {
    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 }? &
    attribute xml:id { ID }? &
    attribute table:is-sub-table { boolean }?,
    element table:title { text }?,
    element table:desc { text }?,
    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-row =
  element table:table-row {
    attribute table:number-rows-repeated { positiveInteger }? &
    attribute table:style-name { styleNameRef }? &
    attribute table:default-cell-style-name { styleNameRef }? &
    attribute table:visibility { "visible" | "collapse" | "filter" }? &
    attribute xml:id { ID }?,
    (table-table-cell | table-covered-table-cell)+
  }
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 }? &
  attribute xml:id { 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 {
    attribute table:number-columns-repeated { positiveInteger }? &
    attribute table:style-name { styleNameRef }? &
    attribute table:visibility { "visible" | "collapse" | "filter" }? &
    attribute table:default-cell-style-name { styleNameRef }? &
    attribute xml:id { ID }?,
    table-table-column-attlist,
    empty
  }
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 {
    attribute table:display { boolean }?,
    table-columns-and-groups
  }
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 {
    attribute table:display { boolean }?,
    table-rows-and-groups
  }

Indexes

Table of contents

text-table-of-content =
  element text:table-of-content {
    common-section-attlist,
    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-index-body
  }
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 {
    attribute text:outline-level { positiveInteger } &
    attribute text:style-name { styleNameRef },
    (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)*
  }

Illustration index

text-illustration-index =
  element text:illustration-index {
    common-section-attlist,
    element text:illustration-index-source {
      text-illustration-index-source-attrs,
      text-index-title-template?,
      text-illustration-index-entry-template?
    },
    text-index-body
  }
text-illustration-index-source-attrs =
  attribute text:index-scope { "document" | "chapter" }? &
  attribute text:relative-tab-stop-position { boolean }? &
  attribute text:use-caption { boolean }? &
  attribute text:caption-sequence-name { \string }? &
  attribute text:caption-sequence-format { "text" | "category-and-value" | "caption" }?
text-illustration-index-entry-template =
  element text:illustration-index-entry-template {
    text-illustration-index-entry-content
  }
text-illustration-index-entry-content =
  attribute text:style-name { styleNameRef },
  (text-index-entry-chapter |
   text-index-entry-page-number |
   text-index-entry-text |
   text-index-entry-span |
   text-index-entry-tab-stop)*

Table index

text-table-index =
  element text:table-index {
    common-section-attlist,
    element text:table-index-source {
      text-illustration-index-source-attrs,
      text-index-title-template?,
      text-table-index-entry-template?
    },
    text-index-body
  }
text-table-index-entry-template =
  element text:table-index-entry-template {
    text-illustration-index-entry-content
  }

Object index

text-object-index =
  element text:object-index {
    common-section-attlist,
    element text:object-index-source {
      attribute text:index-scope { "document" | "chapter" }? &
      attribute text:relative-tab-stop-position { boolean }? &
      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-index-title-template?,
      text-object-index-entry-template?
    },
    text-index-body
  }
text-object-index-entry-template =
  element text:object-index-entry-template {
    text-illustration-index-entry-content
  }

User index

text-user-index =
  element text:user-index {
    common-section-attlist,
    element text:user-index-source {
      text-user-index-source-attr,
      text-index-title-template?,
      text-user-index-entry-template*,
      text-index-source-styles*
    },
    text-index-body
  }
text-user-index-source-attr =
  attribute text:index-scope { "document" | "chapter" }? &
  attribute text:relative-tab-stop-position { boolean }? &
  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 {
    attribute text:outline-level { positiveInteger } &
    attribute text:style-name { styleNameRef },
    (text-index-entry-chapter |
     text-index-entry-page-number |
     text-index-entry-text |
     text-index-entry-span |
     text-index-entry-tab-stop)*
  }

Alphabetical index

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 =
  attribute text:index-scope { "document" | "chapter" }? &
  attribute text:relative-tab-stop-position { boolean }? &
  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 {
    attribute text:outline-level { "1" | "2" | "3" | "separator" } &
    attribute text:style-name { styleNameRef },
    (text-index-entry-chapter |
     text-index-entry-page-number |
     text-index-entry-text |
     text-index-entry-span |
     text-index-entry-tab-stop )*
  }

Bibliography

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 }

Index entries

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-page-number =
  element text:index-entry-page-number {
    attribute text:style-name { styleNameRef }?
  }
text-index-entry-text =
  element text:index-entry-text {
    attribute text:style-name { styleNameRef }?
  }
text-index-entry-span =
  element text:index-entry-span {
    attribute text:style-name { styleNameRef }?,
    text
  }
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 }?
  }
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"
    }

Misc index properties

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-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*
  }

Styles

office-document-styles =
  element office:document-styles {
    office-document-common-attrs,
    office-font-face-decls,
    office-styles,
    office-automatic-styles,
    office-master-styles
  }
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-font-face-decls =
  element office:font-face-decls { style-font-face* }?
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*
style-style =
  element style:style {
    style-style-attlist,
    style-style-content,
    style-map*
  }
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-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?)
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 { "normal" | "small-caps" }?
  & 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-underline-type { "none" | "single" | "double" }?
  & attribute style:text-underline-style { lineStyle }?
  & attribute style:text-underline-width { lineWidth }?
  & attribute style:text-underline-color { "font-color" | color }?
  & attribute style:text-underline-mode { "continuous" | "skip-white-space" }?
  & attribute style:text-overline-type { "none" | "single" | "double" }?
  & 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 { "continuous" | "skip-white-space" }?
  & attribute style:text-line-through-type { "none" | "single" | "double" }?
  & 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-line-through-mode { "continuous" | "skip-white-space" }?
  & 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 { "roman" | "swiss" | "modern" | "decorative" | "script" | "system" }?
  & attribute style:font-family-generic-asian { "roman" | "swiss" | "modern" | "decorative" | "script" | "system" }?
  & attribute style:font-family-generic-complex { "roman" | "swiss" | "modern" | "decorative" | "script" | "system" }?
  & attribute style:font-style-name { \string }?
  & attribute style:font-style-name-asian { \string }?
  & attribute style:font-style-name-complex { \string }?
  & attribute style:font-pitch { "fixed" | "variable" }?
  & attribute style:font-pitch-asian { "fixed" | "variable" }?
  & attribute style:font-pitch-complex { "fixed" | "variable" }?
  & 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 { "normal" | "italic" | "oblique" }?
  & attribute style:font-style-asian { "normal" | "italic" | "oblique" }?
  & attribute style:font-style-complex { "normal" | "italic" | "oblique" }?
  & attribute style:font-relief { "none" | "embossed" | "engraved" }?
  & attribute fo:text-shadow { "none" | \string }?
  & attribute fo:font-weight { fontWeight }?
  & attribute style:font-weight-asian { fontWeight }?
  & attribute style:font-weight-complex { fontWeight }?
  & 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)
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
style-paragraph-properties-elements =
  style-tab-stops & style-drop-cap & style-background-image
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 }?
table-table-template =
  element table:table-template {
    attribute table:name { \string } &
    attribute table:first-row-start-column { "row" | "column" } &
    attribute table:first-row-end-column { "row" | "column" } &
    attribute table:last-row-start-column { "row" | "column" } &
    attribute table:last-row-end-column { "row" | "column" },
    element table:first-row { common-table-template-attlist, empty }?,
    element table:last-row { common-table-template-attlist, empty }?,
    element table:first-column { common-table-template-attlist, empty }?,
    element table:last-column { common-table-template-attlist, empty }?,
    element table:body { common-table-template-attlist, empty },
    element table:even-rows { common-table-template-attlist, empty }?,
    element table:odd-rows { common-table-template-attlist, empty }?,
    element table:even-columns { common-table-template-attlist, empty }?,
    element table:odd-columns { common-table-template-attlist, empty }?,
    element table:background { attribute table:style-name { styleNameRef }, empty }?
  }
common-table-template-attlist =
  attribute table:style-name { styleNameRef },
  attribute table:paragraph-style-name { styleNameRef }?

Meta

office-document-meta =
  element office:document-meta {
    office-document-common-attrs,
    office-meta
  }
office-meta = element office:meta {
  office-meta-data*
}?
office-meta-data =
  element meta:generator { \string } |
  element dc:title { \string } |
  element dc:description { \string } |
  element dc:subject { \string } |
  element dc:creator { \string } |
  element dc:date { dateTime } |
  element dc:language { language } |
  element meta:keyword { \string } |
  element meta:initial-creator { \string } |
  element meta:printed-by { \string } |
  element meta:creation-date { dateTime } |
  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 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)
  } |

Settings

office-document-settings =
  element office:document-settings {
    office-document-common-attrs, office-settings
  }

Scripts

office-scripts =
  element office:scripts {
    office-script*,
    office-event-listeners?
  }?
office-script =
  element office:script {
    attribute script:language { \string },
    mixed { anyElements }
  }