emacs-elpa-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[elpa] externals/org 35183b6 3/3: Merge branch 'km/from-emacs-master'


From: ELPA Syncer
Subject: [elpa] externals/org 35183b6 3/3: Merge branch 'km/from-emacs-master'
Date: Sun, 27 Jun 2021 23:57:15 -0400 (EDT)

branch: externals/org
commit 35183b634bb6a4b7e7bd8f6e2bbb6da8297e6190
Merge: 8e3e2f6 bb572a3
Author: Kyle Meyer <kyle@kyleam.com>
Commit: Kyle Meyer <kyle@kyleam.com>

    Merge branch 'km/from-emacs-master'
---
 .../OpenDocument-schema-v1.3+libreoffice.rnc       |   892 ++
 ...ma-v1.2-os.rnc => OpenDocument-schema-v1.3.rnc} | 11694 ++++++++++---------
 etc/schema/schemas.xml                             |     7 +-
 lisp/org-compat.el                                 |     4 +-
 4 files changed, 6814 insertions(+), 5783 deletions(-)

diff --git a/etc/schema/OpenDocument-schema-v1.3+libreoffice.rnc 
b/etc/schema/OpenDocument-schema-v1.3+libreoffice.rnc
new file mode 100644
index 0000000..5239c84
--- /dev/null
+++ b/etc/schema/OpenDocument-schema-v1.3+libreoffice.rnc
@@ -0,0 +1,892 @@
+# Open Document Format for Office Applications (OpenDocument) Version 1.3
+# OASIS Standard, In progress
+# Relax-NG Schema
+# Source: https://tools.oasis-open.org/version-control/svn/office/
+# Copyright (c) OASIS Open 2002-2015. 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 calcext =
+  "urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0"
+namespace chart = "urn:oasis:names:tc:opendocument:xmlns:chart:1.0"
+namespace chartooo = "http://openoffice.org/2010/chart";
+namespace config = "urn:oasis:names:tc:opendocument:xmlns:config:1.0"
+namespace css3t = "http://www.w3.org/TR/css3-text/";
+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 drawooo = "http://openoffice.org/2010/draw";
+namespace field =
+  "urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field: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 loext =
+  "urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0"
+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 officeooo = "http://openoffice.org/2009/office";
+namespace presentation =
+  "urn:oasis:names:tc:opendocument:xmlns:presentation:1.0"
+namespace rng = "http://relaxng.org/ns/structure/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 tableooo = "http://openoffice.org/2009/table";
+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";
+
+include "OpenDocument-schema-v1.3.rnc" {
+  office-document-common-attrs =
+    attribute office:version {
+      # FIXME remove this hack once we write 1.3
+      "1.3" | "1.2"
+    }
+    & attribute grddl:transformation {
+        list { anyIRI* }
+      }?
+  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 }?
+    & # FIXME remove this once the export bug is fixed
+      attribute draw:fit-to-size {
+        "true" | "false" | "all" | "shrink-to-fit"
+      }?
+    & 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 { signedZeroToHundredPercent }
+      # https://issues.oasis-open.org/browse/OFFICE-3821
+      ?
+    & 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 }?
+    & # TODO: no proposal for loext:shadow-blur
+      attribute loext:shadow-blur { length }?
+    & 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 }?
+    & # https://issues.oasis-open.org/browse/OFFICE-4047
+      attribute loext:allow-overlap { boolean }?
+    & # TODO: no proposal for loext:glow*
+      attribute loext:glow-radius { length }?
+    & attribute loext:glow-color { color }?
+    & attribute loext:glow-transparency { zeroToHundredPercent }?
+    & # TODO: no proposal for loext:softedge-radius
+      attribute loext:softedge-radius { length }?
+  draw-text =
+    (text-p
+     | text-list
+     | # https://issues.oasis-open.org/browse/OFFICE-3761
+       loext-table)*
+  office-annotation-attlist &=
+    attribute office:display { boolean }?
+    & common-office-annotation-name-attlist?
+    & attribute loext:resolved { boolean }?
+  style-style-content =
+    (attribute style:family { "text" },
+     style-text-properties?)
+    | (attribute style:family { "paragraph" },
+       # TODO no proposal
+       loext-graphic-properties?,
+       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" },
+       # TODO no proposal
+       loext-graphic-properties?,
+       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?)
+  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?,
+      # TODO no proposal
+      table-first-row-even-column?,
+      table-last-row-even-column?,
+      table-first-row-end-column?,
+      table-first-row-start-column?,
+      table-last-row-end-column?,
+      table-last-row-start-column?
+    }
+  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)?,
+      # TODO no proposal
+      loext-signatureline?,
+      loext-qrcode?
+    }
+  common-value-and-type-attlist =
+    (attribute office:value-type { "float" },
+     attribute calcext:value-type { "float" }?,
+     attribute office:value { double })
+    | (attribute office:value-type { "percentage" },
+       attribute calcext:value-type { "percentage" }?,
+       attribute office:value { double })
+    | (attribute office:value-type { "currency" },
+       attribute calcext:value-type { "currency" }?,
+       attribute office:value { double },
+       attribute office:currency { \string }?)
+    | (attribute office:value-type { "date" },
+       attribute calcext:value-type { "date" }?,
+       attribute office:date-value { dateOrDateTime })
+    | (attribute office:value-type { "time" },
+       attribute calcext:value-type { "time" }?,
+       attribute office:time-value { duration })
+    | (attribute office:value-type { "boolean" },
+       attribute calcext:value-type { "boolean" }?,
+       attribute office:boolean-value { boolean })
+    | (attribute office:value-type { "string" },
+       # OFFICE-3759
+       attribute calcext:value-type { "string" | "error" }?,
+       attribute office:string-value { \string }?)
+  chart-axis =
+    element chart:axis {
+      chart-axis-attlist,
+      # OFFICE-2119
+      ((attribute chartooo:axis-type { "auto" },
+        chartooo-date-scale?)
+       | (attribute chartooo:axis-type { "date" },
+          chartooo-date-scale)
+       | attribute chartooo:axis-type { "text" })?,
+      chart-title?,
+      chart-categories?,
+      chart-grid*
+    }
+  table-table =
+    element table:table {
+      table-table-attlist,
+      table-title?,
+      table-desc?,
+      # TODO add to proposal, OFFICE-2112
+      table-table-protection?,
+      table-table-source?,
+      office-dde-source?,
+      table-scenario?,
+      office-forms?,
+      table-shapes?,
+      table-columns-and-groups,
+      table-rows-and-groups,
+      table-named-expressions?,
+      # TODO no proposal, this is wild guessing, OFFICE-3785
+      element calcext:conditional-formats {
+        element calcext:conditional-format {
+          attribute calcext:target-range-address { cellRangeAddress },
+          (element calcext:condition {
+             attribute calcext:apply-style-name { styleNameRef },
+             attribute calcext:value { \string },
+             attribute calcext:base-cell-address { cellAddress }
+           }+
+           | element calcext:data-bar {
+               attribute calcext:max-length { \string },
+               attribute calcext:negative-color { color },
+               attribute calcext:positive-color { color },
+               attribute calcext:axis-color { color },
+               attribute calcext:axis-position { "middle" }?,
+               element calcext:formatting-entry {
+                 attribute calcext:value { \string },
+                 attribute calcext:type {
+                   "auto-minimum"
+                   | "auto-maximum"
+                   | "minimum"
+                   | "maximum"
+                   | "percent"
+                   | "percentile"
+                   | "number"
+                   | "formula"
+                 }
+               },
+               element calcext:formatting-entry {
+                 attribute calcext:value { \string },
+                 attribute calcext:type {
+                   "auto-minimum"
+                   | "auto-maximum"
+                   | "minimum"
+                   | "maximum"
+                   | "percent"
+                   | "percentile"
+                   | "number"
+                   | "formula"
+                 }
+               }
+             }
+           | element calcext:color-scale {
+               element calcext:color-scale-entry {
+                 attribute calcext:value { \string },
+                 attribute calcext:type {
+                   "minimum"
+                   | "maximum"
+                   | "percent"
+                   | "percentile"
+                   | "number"
+                   | "formula"
+                 },
+                 attribute calcext:color { color }
+               },
+               element calcext:color-scale-entry {
+                 attribute calcext:value { \string },
+                 attribute calcext:type {
+                   "minimum"
+                   | "maximum"
+                   | "percent"
+                   | "percentile"
+                   | "number"
+                   | "formula"
+                 },
+                 attribute calcext:color { color }
+               },
+               element calcext:color-scale-entry {
+                 attribute calcext:value { \string },
+                 attribute calcext:type {
+                   "minimum"
+                   | "maximum"
+                   | "percent"
+                   | "percentile"
+                   | "number"
+                   | "formula"
+                 },
+                 attribute calcext:color { color }
+               }?
+             })
+        }+
+      }?
+    }
+  # TODO no proposal
+  draw-object =
+    element draw:object {
+      draw-object-attlist,
+      loext-text,
+      (common-draw-data-attlist | office-document | math-math)
+    }
+  draw-object-ole =
+    element draw:object-ole {
+      draw-object-ole-attlist,
+      loext-text,
+      (common-draw-data-attlist | office-binary-data)
+    }
+  # FIXME: one test exports 250 here, which is probably a bug
+  fontWeight =
+    "normal"
+    | "bold"
+    | "100"
+    | "200"
+    | "250"
+    | "300"
+    | "400"
+    | "500"
+    | "600"
+    | "700"
+    | "800"
+    | "900"
+}
+# TODO no proposal
+loext-p =
+  element loext:p { paragraph-attrs, paragraph-content-or-hyperlink* }
+loext-text = (loext-p | text-list | loext-table)*
+# OFFICE-2119
+chartooo-date-scale =
+  element chartooo:date-scale {
+    attribute chart:base-time-unit { chart-time-unit }?
+    & (attribute chart:major-interval-value { positiveInteger },
+       attribute chart:major-interval-unit { chart-time-unit })?
+    & (attribute chart:minor-interval-value { positiveInteger },
+       attribute chart:minor-interval-unit { chart-time-unit })?
+  }
+chart-time-unit = "days" | "months" | "years"
+# TODO no proposal
+loext-signatureline =
+  element loext:signatureline {
+    attribute loext:id { \string },
+    attribute loext:suggested-signer-name { \string },
+    attribute loext:suggested-signer-title { \string },
+    attribute loext:suggested-signer-email { \string },
+    attribute loext:signing-instructions { \string },
+    attribute loext:show-sign-date { boolean },
+    attribute loext:can-add-comment { boolean }
+  }
+loext-qrcode =
+  element loext:qrcode {
+    attribute office:string-value { \string },
+    attribute loext:qrcode-errorcorrection {
+      "low" | "medium" | "quartile" | "high"
+    },
+    attribute loext:qrcode-border { nonNegativeInteger }
+  }
+# https://issues.oasis-open.org/browse/OFFICE-3761
+loext-table =
+  element loext:table {
+    table-table-attlist,
+    table-title?,
+    table-desc?,
+    table-table-source?,
+    office-dde-source?,
+    table-scenario?,
+    office-forms?,
+    table-shapes?,
+    loext-columns-and-groups,
+    loext-rows-and-groups,
+    table-named-expressions?
+  }
+loext-rows-and-groups = (table-table-row-group | loext-rows-no-group)+
+loext-rows-no-group =
+  (loext-rows, (table-table-header-rows, loext-rows?)?)
+  | (table-table-header-rows, loext-rows?)
+loext-rows =
+  table-table-rows | (text-soft-page-break?, loext-table-row)+
+loext-table-row =
+  element loext:table-row {
+    table-table-row-attlist,
+    (loext-table-cell | loext-covered-table-cell)+
+  }
+loext-table-cell =
+  element loext:table-cell {
+    table-table-cell-attlist,
+    table-table-cell-attlist-extra,
+    table-table-cell-content
+  }
+loext-covered-table-cell =
+  element loext:covered-table-cell {
+    table-table-cell-attlist, table-table-cell-content
+  }
+loext-columns-and-groups =
+  (table-table-column-group | loext-columns-no-group)+
+loext-columns-no-group =
+  (loext-columns, (table-table-header-columns, loext-columns?)?)
+  | (table-table-header-columns, loext-columns?)
+loext-columns = loext-table-columns | loext-table-column+
+loext-table-columns =
+  element loext:table-columns { loext-table-column+ }
+loext-table-column =
+  element loext:table-column { table-table-column-attlist, empty }
+loext-graphic-properties =
+  element loext:graphic-properties {
+    style-graphic-properties-content-strict
+  }
+table-first-row-even-column =
+  element loext:first-row-even-column {
+    common-table-template-attlist, empty
+  }
+table-last-row-even-column =
+  element loext:last-row-even-column {
+    common-table-template-attlist, empty
+  }
+table-first-row-end-column =
+  element loext:first-row-end-column {
+    common-table-template-attlist, empty
+  }
+table-first-row-start-column =
+  element loext:first-row-start-column {
+    common-table-template-attlist, empty
+  }
+table-last-row-end-column =
+  element loext:last-row-end-column {
+    common-table-template-attlist, empty
+  }
+table-last-row-start-column =
+  element loext:last-row-start-column {
+    common-table-template-attlist, empty
+  }
+common-draw-rel-size-attlist &=
+  # OFFICE-3854
+  attribute loext:rel-width-rel {
+    "page"
+    | [
+        # TODO layout-environment ?
+
+      ]
+      "paragraph"
+  }?,
+  attribute loext:rel-height-rel { "page" | "paragraph" }?
+common-svg-font-face-xlink-attlist &=
+  # TODO no proposal
+  attribute loext:font-style { fontStyle }?,
+  attribute loext:font-weight { fontWeight }?
+# TODO no proposal
+
+# there's no ref-attrs so add it here
+text-common-ref-content &=
+  attribute loext:reference-language { language }?
+style-list-level-label-alignment-attlist &=
+  # TODO no proposal
+  attribute loext:label-followed-by {
+    "listtab" | "space" | "nothing" | "newline"
+  }?
+style-ruby-properties-attlist &=
+  # TODO proposal, OFFICE-3944
+  attribute loext:ruby-position {
+    "above" | "below" | "inter-character"
+  }?
+style-text-properties-attlist &=
+  # TODO no proposal
+  attribute officeooo:rsid { \string }?,
+  attribute officeooo:paragraph-rsid { \string }?,
+  # https://issues.oasis-open.org/browse/OFFICE-4049
+  attribute loext:opacity { zeroToHundredPercent }?
+style-text-properties-attlist &=
+  # OFFICE-3843
+  attribute loext:padding { nonNegativeLength }?,
+  attribute loext:padding-left { nonNegativeLength }?,
+  attribute loext:padding-right { nonNegativeLength }?,
+  attribute loext:padding-top { nonNegativeLength }?,
+  attribute loext:padding-bottom { nonNegativeLength }?,
+  attribute loext:border { \string }?,
+  attribute loext:border-left { \string }?,
+  attribute loext:border-right { \string }?,
+  attribute loext:border-top { \string }?,
+  attribute loext:border-bottom { \string }?,
+  attribute loext:shadow { shadowType }?
+# TODO no proposal
+style-chart-properties-attlist &=
+  attribute loext:try-staggering-first { boolean }?
+# TODO no proposal
+style-chart-properties-attlist &=
+  attribute loext:std-weight { \string }?
+# TODO no proposal
+chart-series-attlist &= attribute loext:label-string { \string }?
+# OFFICE-1148
+style-chart-properties-attlist &=
+  attribute loext:regression-max-degree { positiveInteger }?,
+  attribute loext:regression-force-intercept { boolean }?,
+  attribute loext:regression-intercept-value { double }?,
+  attribute loext:regression-name { \string }?,
+  attribute loext:regression-period { \string }?,
+  attribute loext:regression-extrapolate-forward { \string }?,
+  attribute loext:regression-extrapolate-backward { \string }?
+# TODO no proposal
+table-data-pilot-field-attlist &=
+  attribute tableooo:display-name { \string }?
+# TODO no proposal, 9009663d
+chart-chart-attlist &= attribute loext:data-pilot-source { \string }?
+# OFFICE-2112, TODO half of this missing in proposal
+table-table-protection =
+  element loext:table-protection {
+    attribute loext:select-protected-cells { boolean }?,
+    attribute loext:select-unprotected-cells { boolean }?,
+    attribute loext:insert-columns { boolean }?,
+    attribute loext:insert-rows { boolean }?,
+    attribute loext:delete-columns { boolean }?,
+    attribute loext:delete-rows { boolean }?
+  }
+office-spreadsheet-attlist &=
+  attribute loext:protection-key-digest-algorithm-2 { anyURI }?
+table-table-attlist &=
+  attribute loext:protection-key-digest-algorithm-2 { anyURI }?
+# https://issues.oasis-open.org/browse/OFFICE-2317
+vertJustifyValues = "auto" | "distribute"
+common-text-justify =
+  attribute css3t:text-justify { vertJustifyValues }?
+style-vertical-justify =
+  attribute loext:vertical-justify { vertJustifyValues }?,
+  attribute style:vertical-justify { vertJustifyValues }?
+style-paragraph-properties-attlist &=
+  (common-text-justify, style-vertical-justify)?
+style-table-cell-properties-attlist &=
+  (common-text-justify, style-vertical-justify)?
+number-fraction-attlist &=
+  # OFFICE-3695
+
+  # TODO no proposal, 1544a26ac9f7dd60605dd21e9cbe29d490aafdce
+  attribute loext:max-numerator-digits { positiveInteger }?
+# TODO no proposal
+table-data-pilot-level-attlist &=
+  attribute calcext:repeat-item-labels { boolean }?
+# TODO no proposal
+draw-enhanced-geometry-attlist &=
+  attribute drawooo:sub-view-size { \string }?,
+  attribute drawooo:enhanced-path { \string }?
+# TODO no proposal
+draw-custom-shape-attlist &= common-draw-rel-size-attlist
+# TODO no proposal
+style-page-layout-properties-attlist &=
+  style-graphic-fill-properties-attlist
+style-header-footer-properties-attlist &=
+  style-graphic-fill-properties-attlist
+# TODO no proposal
+text-index-entry-tab-stop-attrs &= attribute style:with-tab { boolean }?
+# TODO no proposal
+style-text-properties-attlist &=
+  attribute loext:char-shading-value { \string }?
+# TODO no proposal
+text-bookmark-start-attlist &=
+  (attribute loext:hidden { boolean },
+   attribute loext:condition { \string }?)?
+# TODO no proposal; see 7a5d79f2297a43d0a854e304b0792164272edfe0
+
+# FIXME this is almost certainly incomplete: need to figure out which elements 
can have this and which named pattern can be extended with it to get exactly 
these elements
+form-checkbox-attlist &= attribute form:input-required { boolean }?
+# https://issues.oasis-open.org/browse/OFFICE-4030
+common-writing-mode-attlist &= attribute loext:writing-mode { "bt-lr" }?
+# https://issues.oasis-open.org/browse/OFFICE-4073
+common-vertical-rel-attlist &=
+  attribute loext:vertical-rel {
+    "page-content-top" | "page-content-bottom"
+  }?
+# https://issues.oasis-open.org/browse/OFFICE-4105
+style-page-layout-properties-attlist &=
+  attribute loext:margin-gutter { length }?
+# just a test-case for user-defined attributes, move along, nothing to see 
here...
+style-table-cell-properties-attlist &= attribute proName { \string }?
+# TODO no proposal
+chart-data-point-attlist &=
+  attribute loext:custom-label-field { \string }?
+# TODO no proposal
+style-text-properties-attlist &=
+  attribute loext:hyphenation-no-caps { boolean }?
+# TODO no proposal
+chart-data-point-attlist &=
+  (attribute loext:custom-label-pos-x { double },
+   attribute loext:custom-label-pos-y { double })?
+# TODO no proposal
+chart-legend-attlist &= attribute loext:overlay { boolean }?
+# https://issues.oasis-open.org/browse/OFFICE-3936
+style-chart-properties-attlist &=
+  attribute loext:major-origin { double }?
+# TODO no proposal
+text-index-entry-chapter-attrs &=
+  attribute loext:outline-content-visible { boolean }?
+# https://issues.oasis-open.org/browse/OFFICE-2096
+paragraph-content |=
+  element field:fieldmark-start {
+    attribute text:name { \string },
+    attribute field:type {
+      # TODO <rng:ref name="namespacedToken"/>
+      \string
+    },
+    element field:param {
+      attribute field:name { \string },
+      attribute field:value { \string }
+    }*
+  }
+paragraph-content |= element field:fieldmark-end { empty }
+paragraph-content |=
+  element field:fieldmark {
+    attribute text:name { \string },
+    attribute field:type {
+      # TODO <rng:ref name="namespacedToken"/>
+      \string
+    },
+    element field:param {
+      attribute field:name { \string },
+      attribute field:value { \string }
+    }*
+  }
+# TODO no proposal
+animation-element |=
+  element loext:animatePhysics {
+    common-anim-target-attlist,
+    common-timing-attlist,
+    animate-physics-attlist
+  }
+animate-physics-attlist =
+  # default value: 0
+  attribute loext:velocity-x { double }?,
+  # default value: 0
+  attribute loext:velocity-y { double }?,
+  # default value: 0.1
+  attribute loext:bounciness {
+    xsd:double { minInclusive = "0" maxInclusive = "1" }
+  }?,
+  # default value: 1
+  attribute loext:density {
+    xsd:double { minInclusive = "0" }
+  }?
+# TODO no proposal
+style-chart-properties-attlist &=
+  attribute loext:custom-leader-lines { boolean }?
+# TODO no proposal
+style-chart-properties-attlist &=
+  attribute loext:external-data { \string }?
diff --git a/etc/schema/od-schema-v1.2-os.rnc 
b/etc/schema/OpenDocument-schema-v1.3.rnc
similarity index 96%
rename from etc/schema/od-schema-v1.2-os.rnc
rename to etc/schema/OpenDocument-schema-v1.3.rnc
index 8d679d6..2a78679 100644
--- a/etc/schema/od-schema-v1.2-os.rnc
+++ b/etc/schema/OpenDocument-schema-v1.3.rnc
@@ -1,33 +1,16 @@
-# 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.
+# Open Document Format for Office Applications (OpenDocument) Version 1.3
+# Committee Specification 02
+# 30 October 2020
+# Copyright (c) OASIS Open 2020. All Rights Reserved.
+# Source: https://docs.oasis-open.org/office/OpenDocument/v1.3/cs02/schemas/
+# Latest stage of specification: 
https://docs.oasis-open.org/office/OpenDocument/v1.3/OpenDocument-v1.3-part1-introduction.html
+# TC IPR Statement: https://www.oasis-open.org/committees/office/ipr.php
 #
-# 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.
+#    Open Document Format for Office Applications (OpenDocument) Version 1.3
+#    Relax-NG Schema
+#    OpenDocument-v1.3-schema.rng
+
+# https://issues.oasis-open.org/browse/OFFICE-2153
 
 namespace anim = "urn:oasis:names:tc:opendocument:xmlns:animation:1.0"
 namespace chart = "urn:oasis:names:tc:opendocument:xmlns:chart:1.0"
@@ -46,6 +29,7 @@ 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 rng = "http://relaxng.org/ns/structure/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"
@@ -58,2090 +42,1874 @@ 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
+CURIE =
+  xsd:string { pattern = "(([\i-[:]][\c-[:]]*)?:)?.+" minLength = "1" }
+CURIEs = list { CURIE+ }
+ID = xsd:ID
+IDREF = xsd:IDREF
+IDREFS = xsd:IDREFS
+NCName = xsd:NCName
+SafeCURIE =
+  xsd:string {
+    pattern = "\[(([\i-[:]][\c-[:]]*)?:)?.+\]"
+    minLength = "3"
   }
-office-document-common-attrs =
-  attribute office:version { "1.2" }
-  & attribute grddl:transformation {
-      list { anyIRI* }
+URIorSafeCURIE = anyURI | SafeCURIE
+angle = xsd:string
+anim-animate-color-attlist =
+  attribute anim:color-interpolation { "rgb" | "hsl" }?
+  & attribute anim:color-interpolation-direction {
+      "clockwise" | "counter-clockwise"
     }?
-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
+anim-animate-motion-attlist =
+  attribute svg:path { pathData }?
+  & attribute svg:origin { \string }?
+  & attribute smil:calcMode {
+      "discrete" | "linear" | "paced" | "spline"
+    }?
+anim-animate-transform-attlist =
+  attribute svg:type {
+    "translate" | "scale" | "rotate" | "skewX" | "skewY"
   }
-  | element office:drawing {
-      office-drawing-attlist,
-      office-drawing-content-prelude,
-      office-drawing-content-main,
-      office-drawing-content-epilogue
+anim-audio-attlist =
+  attribute xlink:href { anyIRI }?
+  & attribute anim:audio-level { double }?
+anim-command-attlist = attribute anim:command { \string }
+anim-iterate-attlist =
+  common-anim-target-attlist
+  & attribute anim:iterate-type { \string }?
+  & attribute anim:iterate-interval { duration }?
+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" }?
+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 office:presentation {
-      office-presentation-attlist,
-      office-presentation-content-prelude,
-      office-presentation-content-main,
-      office-presentation-content-epilogue
+  | 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 office:spreadsheet {
-      office-spreadsheet-attlist,
-      office-spreadsheet-content-prelude,
-      office-spreadsheet-content-main,
-      office-spreadsheet-content-epilogue
+  | 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 office:chart {
-      office-chart-attlist,
-      office-chart-content-prelude,
-      office-chart-content-main,
-      office-chart-content-epilogue
+  | 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 office:image {
-      office-image-attlist,
-      office-image-content-prelude,
-      office-image-content-main,
-      office-image-content-epilogue
+  | 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
     }
-  | 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"
+  | element anim:par {
+      common-anim-attlist,
+      common-timing-attlist,
+      common-endsync-timing-attlist,
+      animation-element*
     }
-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 anim:seq {
+      common-anim-attlist,
+      common-endsync-timing-attlist,
+      common-timing-attlist,
+      animation-element*
     }
-  | element meta:hyperlink-behaviour {
-      attribute office:target-frame-name { targetFrameName }?,
-      attribute xlink:show { "new" | "replace" }?
+  | element anim:iterate {
+      common-anim-attlist,
+      anim-iterate-attlist,
+      common-timing-attlist,
+      common-endsync-timing-attlist,
+      animation-element*
     }
-  | 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 anim:audio {
+      common-anim-attlist,
+      anim-audio-attlist,
+      common-basic-timing-attlist
     }
-  | 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)
+  | 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 }
+      }*
     }
-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*
+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
+any-number = number-number | number-scientific-number | number-fraction
+any-time = number-hours | number-am-pm | number-minutes | number-seconds
+anyAttListOrElements =
+  attribute * { text }*,
+  anyElements
+anyElements =
+  element * {
+    mixed { anyAttListOrElements }
+  }*
+anyIRI =
+  xsd:anyURI
+  >> dc:description [
+       "An IRI-reference as defined in [RFC3987]. See ODF 1.3 Part 3 section 
18.3."
+     ]
+anyURI = xsd:anyURI
+base64Binary = xsd:base64Binary
+boolean = "true" | "false"
+borderWidths = list { positiveLength, positiveLength, positiveLength }
+bound-column = attribute form:bound-column { \string }?
+button-type = attribute form:button-type { types }?
+cellAddress =
+  xsd:string {
+    pattern = "($?([^\. ']+|'([^']|'')+'))?\.$?[A-Z]+$?[0-9]+"
   }
-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*
+cellRangeAddress =
+  xsd:string {
+    pattern =
+      "($?([^\. ']+|'([^']|'')+'))?\.$?[A-Z]+$?[0-9]+(:($?([^\. 
']+|'([^']|'')+'))?\.$?[A-Z]+$?[0-9]+)?"
   }
-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
+  | 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'
+     ]
+change-mark-attr = attribute text:change-id { IDREF }
+change-marks =
+  element text:change { change-mark-attr }
+  | element text:change-start { change-mark-attr }
+  | element text:change-end { change-mark-attr }
+character = xsd:string { length = "1" }
+chart-axis =
+  element chart:axis {
+    chart-axis-attlist, chart-title?, chart-categories?, chart-grid*
   }
-text-list-header-attr = xml-id?
-text-numbered-paragraph =
-  element text:numbered-paragraph {
-    text-numbered-paragraph-attr, text-number?, (text-p | text-h)
+chart-axis-attlist =
+  attribute chart:dimension { chart-dimension }
+  & attribute chart:name { \string }?
+  & attribute chart:style-name { styleNameRef }?
+chart-categories =
+  element chart:categories {
+    attribute table:cell-range-address { cellRangeAddressList }?
   }
-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 })?
+chart-chart =
+  element chart:chart {
+    chart-chart-attlist,
+    chart-title?,
+    chart-subtitle?,
+    chart-footer?,
+    chart-legend?,
+    chart-plot-area,
+    shape*,
+    # https://issues.oasis-open.org/browse/OFFICE-2123
+    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?
-text-section =
-  element text:section {
-    text-section-attlist,
-    (text-section-source | text-section-source-dde | empty),
-    text-content*
+chart-coordinate-region =
+  element chart:coordinate-region {
+    chart-coordinate-region-attlist, empty
   }
-text-section-attlist =
-  common-section-attlist
-  & (attribute text:display { "true" | "none" }
-     | (attribute text:display { "condition" },
-        attribute text:condition { \string })
+chart-coordinate-region-attlist =
+  common-draw-position-attlist, common-draw-size-attlist
+# https://issues.oasis-open.org/browse/OFFICE-3928
+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-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-dimension = "x" | "y" | "z"
+chart-domain =
+  element chart:domain {
+    attribute table:cell-range-address { cellRangeAddressList }?
+  }
+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-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-floor = element chart:floor { chart-floor-attlist, empty }
+chart-floor-attlist =
+  attribute svg:width { length }?
+  & attribute chart:style-name { styleNameRef }?
+chart-footer = element chart:footer { chart-title-attlist, text-p? }
+chart-grid = element chart:grid { chart-grid-attlist }
+chart-grid-attlist =
+  attribute chart:class { "major" | "minor" }?
+  & attribute chart:style-name { styleNameRef }?
+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 },
+        common-draw-size-attlist
+        # https://issues.oasis-open.org/browse/OFFICE-3883
+        )
      | 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 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-plot-area =
+  element chart:plot-area {
+    chart-plot-area-attlist,
+    # https://issues.oasis-open.org/browse/OFFICE-3928
+    chart-coordinate-region?,
+    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?
-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
+chart-regression-curve =
+  element chart:regression-curve {
+    chart-regression-curve-attlist, chart-equation?
   }
-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 }?
+chart-regression-curve-attlist =
+  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-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 }
+chart-subtitle = element chart:subtitle { chart-title-attlist, text-p? }
+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-wall = element chart:wall { chart-wall-attlist, empty }
+chart-wall-attlist =
+  attribute svg:width { length }?
+  & attribute chart:style-name { styleNameRef }?
+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}[ ]*\)"
+  }
+color = xsd:string { pattern = "#[0-9a-fA-F]{6}" }
+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 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 form:formatted-text {
+      form-formatted-text-attlist, common-form-control-content
     }
-  | element text:meta {
-      text-meta-attlist, paragraph-content-or-hyperlink*
+  | 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
     }
-  | (text-bookmark | text-bookmark-start | text-bookmark-end)
-  | element text:reference-mark {
-      attribute text:name { \string }
+  | 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 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 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 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 form:combobox {
+      form-combobox-attlist, common-form-control-content, form-item*
     }
-  | element text:user-index-mark-start {
-      text-id, text-outline-level, text-index-name
+  | element form:listbox {
+      form-listbox-attlist, common-form-control-content, form-option*
     }
-  | 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 form:checkbox {
+      form-checkbox-attlist, common-form-control-content
     }
-  | 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-anim-add-accum-attlist =
+  attribute smil:accumulate { "none" | "sum" }?
+  & attribute smil:additive { "replace" | "sum" }?
+common-anim-attlist =
+  attribute presentation:node-type {
+    "default"
+    | "on-click"
+    | "with-previous"
+    | "after-previous"
+    | "timing-root"
+    | "main-sequence"
+    | "interactive-sequence"
   }?
-  & common-field-fixed-attlist
-text-template-name-attlist =
-  attribute text:display {
-    "full" | "path" | "name" | "name-and-extension" | "area" | "title"
+  & 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 }?)?
+common-anim-named-target-attlist =
+  attribute smil:attributeName { \string }
+common-anim-set-values-attlist = attribute smil:to { \string }?
+common-anim-spline-mode-attlist =
+  attribute smil:calcMode {
+    "discrete" | "linear" | "paced" | "spline"
   }?
-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"
+common-anim-target-attlist =
+  attribute smil:targetElement { IDREF }?
+  & attribute anim:sub-item { \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-auto-reorder-attlist =
+  attribute number:automatic-order { boolean }?
+common-background-color-attlist =
+  attribute fo:background-color { "transparent" | color }?
+common-background-transparency-attlist =
+  attribute style:background-transparency { zeroToHundredPercent }?
+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-begin-end-timing-attlist =
+  attribute smil:begin { \string }?
+  & attribute smil:end { \string }?
+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 }?
+common-break-attlist =
+  attribute fo:break-before { "auto" | "column" | "page" }?,
+  attribute fo:break-after { "auto" | "column" | "page" }?
+common-calendar-attlist =
+  attribute number:calendar {
+    "gregorian"
+    | "gengou"
+    | "ROC"
+    | "hanja_yoil"
+    | "hanja"
+    | "hijri"
+    | "jewish"
+    | "buddhist"
+    | \string
   }?
-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-contour-attlist = attribute draw:recreate-on-edit { boolean }
+common-control-id-attlist =
+  xml-id,
+  attribute form:id { NCName }?
+common-convert-empty-attlist =
+  attribute form:convert-empty-to-null { boolean }?
+common-current-value-attlist = attribute form:current-value { \string }?
+common-data-field-attlist = attribute form:data-field { \string }?
+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-db-default-value = common-value-and-type-attlist?
+common-db-object-description = attribute db:description { \string }?
+common-db-object-name = attribute db:name { \string }
+common-db-object-title = attribute db:title { \string }?
+common-db-table-name-attlist =
+  attribute db:name { \string }
+  & attribute db:catalog-name { \string }?
+  & attribute db:schema-name { \string }?
+common-db-table-style-name =
+  attribute db:style-name { styleNameRef }?
+  & attribute db:default-row-style-name { styleNameRef }?
+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 }?
+common-decimal-places-attlist =
+  attribute number:decimal-places { integer }?,
+  (attribute number:min-decimal-places { integer }?)
+  # https://issues.oasis-open.org/browse/OFFICE-3860  added 
number:min-decimal-places
+
+common-delay-for-repeat = attribute form:delay-for-repeat { duration }?
+common-disabled-attlist = attribute form:disabled { boolean }?
+common-dr3d-transform-attlist = attribute dr3d:transform { \string }?
+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" }?
+common-draw-caption-id-attlist = attribute draw:caption-id { IDREF }?
+common-draw-circle-ellipse-attlist =
+  attribute draw:kind { "full" | "section" | "cut" | "arc" }?
+  & attribute draw:start-angle { angle }?
+  & attribute draw:end-angle { angle }?
+common-draw-circle-ellipse-pos-attlist =
+  attribute svg:cx { coordinate },
+  attribute svg:cy { coordinate }
+common-draw-data-attlist =
+  attribute xlink:type { "simple" },
+  attribute xlink:href { anyIRI },
+  attribute xlink:show { "embed" }?,
+  attribute xlink:actuate { "onLoad" }?
+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 }?
+common-draw-id-attlist =
+  (xml-id,
+   attribute draw:id { NCName }?)?
+common-draw-layer-name-attlist = attribute draw:layer { \string }?
+common-draw-mime-type-attlist = attribute draw:mime-type { \string }?
+# https://issues.oasis-open.org/browse/OFFICE-3943
+common-draw-name-attlist = attribute draw:name { \string }?
+common-draw-path-data-attlist = attribute svg:d { pathData }
+common-draw-points-attlist = attribute draw:points { points }
+common-draw-position-attlist =
+  attribute svg:x { coordinate }?,
+  attribute svg:y { coordinate }?
+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" }?
+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
+common-draw-size-attlist =
+  attribute svg:width { length }?,
+  attribute svg:height { length }?
+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-transform-attlist = attribute draw:transform { \string }?
+common-draw-viewbox-attlist =
+  attribute svg:viewBox {
+    list { integer, integer, integer, integer }
+  }
+common-draw-z-index-attlist =
+  attribute draw:z-index { nonNegativeInteger }?
+common-dur-timing-attlist = attribute smil:dur { \string }?
+common-editable-attlist = attribute style:editable { boolean }?
+common-endsync-timing-attlist =
+  attribute smil:endsync { "first" | "last" | "all" | "media" | IDREF }?
+common-field-data-style-name-attlist =
+  attribute style:data-style-name { styleNameRef }?
+common-field-database-name =
+  attribute text:database-name { \string }?
+  | form-connection-resource
+common-field-database-table =
+  common-field-database-table-attlist, common-field-database-name
+common-field-database-table-attlist =
+  attribute text:table-name { \string }
+  & attribute text:table-type { "table" | "query" | "command" }?
 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-display-value-formula-none-attlist =
+  attribute text:display { "value" | "formula" | "none" }?
+common-field-display-value-none-attlist =
+  attribute text:display { "value" | "none" }?
+common-field-fixed-attlist = attribute text:fixed { boolean }?
 common-field-formula-attlist = attribute text:formula { \string }?
-common-field-data-style-name-attlist =
-  attribute style:data-style-name { styleNameRef }?
+common-field-name-attlist = attribute text:name { variableName }
 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"
+common-fill-default-attlist =
+  attribute smil:fillDefault {
+    "remove" | "freeze" | "hold" | "transition" | "auto" | "inherit"
+  }?
+common-fill-timing-attlist =
+  attribute smil:fill {
+    "remove" | "freeze" | "hold" | "auto" | "default" | "transition"
+  }?
+common-form-control-attlist =
+  attribute form:name { \string }?
+  & attribute form:control-implementation { namespacedToken }?
+common-form-control-content = form-properties?, office-event-listeners?
+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" }?)
+common-form-visual-effect-attlist =
+  attribute form:visual-effect { "flat" | "3d" }?
+common-format-source-attlist =
+  attribute number:format-source { "fixed" | "language" }?
+common-horizontal-margin-attlist =
+  attribute fo:margin-left { length | percent }?,
+  attribute fo:margin-right { length | percent }?
+common-in-content-meta-attlist =
+  attribute xhtml:about { URIorSafeCURIE },
+  attribute xhtml:property { CURIEs },
+  common-meta-literal-attlist
+common-keep-with-next-attlist =
+  attribute fo:keep-with-next { "auto" | "always" }?
+common-linked-cell =
+  attribute form:linked-cell { cellAddress | \string }?
+common-margin-attlist =
+  attribute fo:margin { nonNegativeLength | percent }?
+common-maxlength-attlist =
+  attribute form:max-length { nonNegativeInteger }?
+common-meta-literal-attlist =
+  attribute xhtml:datatype { CURIE }?,
+  attribute xhtml:content { \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
+common-num-format-prefix-suffix-attlist =
+  attribute style:num-prefix { \string }?,
+  attribute style:num-suffix { \string }?
+common-number-attlist =
+  attribute number:min-integer-digits { integer }?
+  & attribute number:grouping { 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
+common-office-annotation-name-attlist =
+  attribute office:name { \string }
+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-page-number-attlist =
+  attribute style:page-number {
+    (nonNegativeInteger | "auto")
+    # https://issues.oasis-open.org/browse/OFFICE-3923
+
+  }?
+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 }?
+common-presentation-header-footer-attlist =
+  attribute presentation:use-header-name { \string }?
+  & attribute presentation:use-footer-name { \string }?
+  & attribute presentation:use-date-time-name { \string }?
+common-printable-attlist = attribute form:printable { boolean }?
+common-readonly-attlist = attribute form:readonly { boolean }?
+common-ref-format-values = "page" | "chapter" | "direction" | "text"
+common-repeat = attribute form:repeat { boolean }?
+common-repeat-timing-attlist =
+  attribute smil:repeatDur { \string }?,
+  attribute smil:repeatCount { nonNegativeDecimal | "indefinite" }?
+common-restart-default-attlist =
+  attribute smil:restartDefault {
+    "never" | "always" | "whenNotActive" | "inherit"
+  }?
+common-restart-timing-attlist =
+  attribute smil:restart {
+    "never" | "always" | "whenNotActive" | "default"
+  }?
+common-rotation-angle-attlist =
+  attribute style:rotation-angle { angle }?
+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?
+common-shadow-attlist = attribute style:shadow { shadowType }?
+common-source-cell-range =
+  attribute form:source-cell-range { cellRangeAddress | \string }?
+common-spin-button = attribute form:spin-button { boolean }?
+common-spline-anim-value-attlist =
+  attribute smil:keyTimes { \string }?
+  & attribute smil:keySplines { \string }?
+common-stock-marker-attlist =
+  attribute chart:style-name { styleNameRef }?
+common-style-direction-attlist =
+  attribute style:direction { "ltr" | "ttb" }?
+common-style-header-footer-attlist =
+  attribute style:display { boolean }?
+common-svg-font-face-xlink-attlist =
+  attribute xlink:type { "simple" },
+  attribute xlink:href { anyIRI },
+  attribute xlink:actuate { "onRequest" }?
+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 }?
+common-tab-attlist =
+  attribute form:tab-index { nonNegativeInteger }?
+  & attribute form:tab-stop { boolean }?
+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 }
+common-table-change-attlist =
+  attribute table:id { \string }
+  & attribute table:acceptance-state {
+      "accepted" | "rejected" | "pending"
     }?
-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
+  & attribute table:rejecting-change-id { \string }?
+common-table-range-attlist =
+  common-table-cell-address-attlist
+  | common-table-cell-range-address-attlist
+common-table-template-attlist =
+  attribute table:style-name { styleNameRef },
+  attribute table:paragraph-style-name { styleNameRef }?
+common-text-align =
+  attribute fo:text-align {
+    "start" | "end" | "left" | "right" | "center" | "justify"
+  }?
+common-text-anchor-attlist =
+  attribute text:anchor-type {
+    "page" | "frame" | "paragraph" | "char" | "as-char"
+  }?
+  & attribute text:anchor-page-number { positiveInteger }?
+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-time-manip-attlist =
+  attribute smil:accelerate { zeroToOneDecimal }?
+  & attribute smil:decelerate { zeroToOneDecimal }?
+  & attribute smil:autoReverse { boolean }?
+common-timing-attlist =
+  common-basic-timing-attlist, common-time-manip-attlist
+common-title-attlist = attribute form:title { \string }?
+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-value-attlist = attribute form:value { \string }?
+common-value-type-attlist = attribute office:value-type { valueType }
+common-vertical-margin-attlist =
+  attribute fo:margin-top { nonNegativeLength | percent }?,
+  attribute fo:margin-bottom { nonNegativeLength | percent }?
+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-writing-mode-attlist =
+  attribute style:writing-mode {
+    "lr-tb" | "rl-tb" | "tb-rl" | "tb-lr" | "lr" | "rl" | "tb" | "page"
+  }?
+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-entry =
+  element config:config-item-map-entry {
+    config-config-item-map-entry-attlist, config-items
   }
-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?
+config-config-item-map-entry-attlist =
+  attribute config:name { \string }?
+config-config-item-map-indexed =
+  element config:config-item-map-indexed {
+    config-config-item-map-indexed-attlist,
+    config-config-item-map-entry+
   }
-text-table-index-entry-template =
-  element text:table-index-entry-template {
-    text-illustration-index-entry-content
+config-config-item-map-indexed-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+
   }
-text-object-index =
-  element text:object-index {
-    common-section-attlist, text-object-index-source, text-index-body
+config-config-item-map-named-attlist = attribute config:name { \string }
+config-config-item-set =
+  element config:config-item-set {
+    config-config-item-set-attlist, config-items
   }
-text-object-index-source =
-  element text:object-index-source {
-    text-object-index-source-attrs,
-    text-index-title-template?,
-    text-object-index-entry-template?
+config-config-item-set-attlist = attribute config:name { \string }
+config-items =
+  (config-config-item
+   | config-config-item-set
+   | config-config-item-map-named
+   | config-config-item-map-indexed)+
+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
+    }
+coordinate = length
+countryCode = xsd:token { pattern = "[A-Za-z0-9]{1,8}" }
+currency-symbol-and-text =
+  number-currency-symbol,
+  number-text-with-fillchar
+  # https://issues.oasis-open.org/browse/OFFICE-3765
+  ?
+current-selected = attribute form:current-selected { boolean }?
+custom-shape-type = "non-primitive" | \string
+date = xsd:date
+dateOrDateTime = xsd:date | xsd:dateTime
+dateTime = xsd:dateTime
+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?
   }
-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
+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-apply-command = attribute db:apply-command { 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-character-set =
+  element db:character-set { db-character-set-attlist, empty }
+db-character-set-attlist = attribute db:encoding { textEncoding }?
+db-column =
+  element db:column {
+    db-column-attlist,
+    common-db-object-name,
+    common-db-object-title,
+    common-db-object-description,
+    common-db-default-value
   }
-text-user-index =
-  element text:user-index {
-    common-section-attlist, text-user-index-source, text-index-body
+db-column-attlist =
+  attribute db:visible { boolean }?
+  & attribute db:style-name { styleNameRef }?
+  & attribute db:default-cell-style-name { styleNameRef }?
+db-column-definition =
+  element db:column-definition {
+    db-column-definition-attlist, common-db-default-value
   }
-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*
+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-column-definitions =
+  element db:column-definitions {
+    db-column-definitions-attlist, db-column-definition+
   }
-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)*
+db-column-definitions-attlist = empty
+db-columns = element db:columns { db-columns-attlist, db-column+ }
+db-columns-attlist = empty
+db-command = attribute db:command { \string }
+db-component =
+  element db:component {
+    db-component-attlist,
+    common-db-object-name,
+    common-db-object-title,
+    common-db-object-description,
+    (office-document | math-math)?
   }
-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
+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-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)*
   }
-text-alphabetical-index-source =
-  element text:alphabetical-index-source {
-    text-alphabetical-index-source-attrs,
-    text-index-title-template?,
-    text-alphabetical-index-entry-template*
+db-component-collection-attlist = empty
+db-connection-data =
+  element db:connection-data {
+    db-connection-data-attlist,
+    (db-database-description | db-connection-resource),
+    db-login?
   }
-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 }
+db-connection-data-attlist = empty
+db-connection-resource =
+  element db:connection-resource {
+    db-connection-resource-attlist, empty
   }
-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)*
+db-connection-resource-attlist =
+  attribute xlink:type { "simple" },
+  attribute xlink:href { anyIRI },
+  attribute xlink:show { "none" }?,
+  attribute xlink:actuate { "onRequest" }?
+db-data-source =
+  element db:data-source {
+    db-data-source-attlist,
+    db-connection-data,
+    db-driver-settings?,
+    db-application-connection-settings?
   }
-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
+db-data-source-attlist = empty
+db-data-source-setting =
+  element db:data-source-setting {
+    db-data-source-setting-attlist, db-data-source-setting-value+
   }
-text-bibliography-source =
-  element text:bibliography-source {
-    text-index-title-template?, text-bibliography-entry-template*
+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
   }
-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)*
+db-data-source-setting-value-attlist = empty
+db-data-source-settings =
+  element db:data-source-settings {
+    db-data-source-settings-attlist, db-data-source-setting+
   }
-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*
+db-data-source-settings-attlist = empty
+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-database-description =
+  element db:database-description {
+    db-database-description-attlist,
+    (db-file-based-database | db-server-database)
   }
-text-index-source-style =
-  element text:index-source-style {
-    attribute text:style-name { styleName },
-    empty
+db-database-description-attlist = empty
+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-driver-settings =
+  element db:driver-settings {
+    db-driver-settings-attlist,
+    db-auto-increment?,
+    db-delimiter?,
+    db-character-set?,
+    db-table-settings?
   }
-text-index-title-template =
-  element text:index-title-template {
-    attribute text:style-name { styleNameRef }?,
-    text
+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-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-filter-statement =
+  element db:filter-statement { db-command, db-apply-command, empty }
+db-forms =
+  element db:forms {
+    db-forms-attlist, (db-component | db-component-collection)*
   }
-text-index-entry-chapter =
-  element text:index-entry-chapter {
-    attribute text:style-name { styleNameRef }?,
-    text-index-entry-chapter-attrs
+db-forms-attlist = empty
+db-host-and-port =
+  attribute db:hostname { \string },
+  attribute db:port { positiveInteger }?
+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-column =
+  element db:index-column { db-index-column-attlist, empty }
+db-index-column-attlist =
+  attribute db:name { \string }
+  & attribute db:is-ascending { boolean }?
+db-index-columns = element db:index-columns { db-index-column+ }
+db-indices = element db:indices { db-indices-attlist, db-index+ }
+db-indices-attlist = empty
+db-is-first-row-header-line =
+  attribute db:is-first-row-header-line { boolean }?
+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-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-key-columns =
+  element db:key-columns { db-key-columns-attlist, db-key-column+ }
+db-key-columns-attlist = empty
+db-keys = element db:keys { db-keys-attlist, db-key+ }
+db-keys-attlist = empty
+db-local-socket-name = attribute db:local-socket { \string }?
+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-order-statement =
+  element db:order-statement { db-command, db-apply-command, empty }
+db-queries =
+  element db:queries {
+    db-queries-attlist, (db-query | db-query-collection)*
   }
-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 }?
+db-queries-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?
   }
-text-index-entry-page-number =
-  element text:index-entry-page-number {
-    attribute text:style-name { styleNameRef }?
+db-query-attlist =
+  attribute db:command { \string }
+  & attribute db:escape-processing { boolean }?
+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)*
   }
-text-index-entry-span =
-  element text:index-entry-span {
-    attribute text:style-name { styleNameRef }?,
-    text
+db-query-collection-attlist = empty
+db-reports =
+  element db:reports {
+    db-reports-attlist, (db-component | db-component-collection)*
   }
-text-index-entry-bibliography =
-  element text:index-entry-bibliography {
-    text-index-entry-bibliography-attrs
+db-reports-attlist = empty
+db-schema-definition =
+  element db:schema-definition {
+    db-schema-definition-attlist, db-table-definitions
   }
-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
+db-schema-definition-attlist = empty
+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-show-deleted = attribute db:show-deleted { boolean }?
+db-table-definition =
+  element db:table-definition {
+    common-db-table-name-attlist,
+    db-table-definition-attlist,
+    db-column-definitions,
+    db-keys?,
+    db-indices?
   }
-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 }?
+db-table-definition-attlist = attribute db:type { \string }?
+db-table-definitions =
+  element db:table-definitions {
+    db-table-definitions-attlist, db-table-definition*
   }
-text-index-entry-link-end =
-  element text:index-entry-link-end {
-    attribute text:style-name { styleNameRef }?
+db-table-definitions-attlist = empty
+db-table-exclude-filter =
+  element db:table-exclude-filter {
+    db-table-exclude-filter-attlist, db-table-filter-pattern+
   }
-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?
+db-table-exclude-filter-attlist = empty
+db-table-filter =
+  element db:table-filter {
+    db-table-filter-attlist,
+    db-table-include-filter?,
+    db-table-exclude-filter?
   }
-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)+
+db-table-filter-attlist = empty
+db-table-filter-pattern =
+  element db:table-filter-pattern {
+    db-table-filter-pattern-attlist, \string
   }
-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
+db-table-filter-pattern-attlist = empty
+db-table-include-filter =
+  element db:table-include-filter {
+    db-table-include-filter-attlist, db-table-filter-pattern+
   }
-table-covered-table-cell =
-  element table:covered-table-cell {
-    table-table-cell-attlist, table-table-cell-content
+db-table-include-filter-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?
   }
-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
+db-table-presentation-attlist = empty
+db-table-presentations =
+  element db:table-representations {
+    db-table-presentations-attlist, db-table-presentation*
   }
-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)+
+db-table-presentations-attlist = empty
+db-table-setting =
+  element db:table-setting {
+    db-table-setting-attlist, db-delimiter?, db-character-set?, empty
   }
-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
+db-table-setting-attlist = db-is-first-row-header-line, db-show-deleted
+db-table-settings = element db:table-settings { db-table-setting* }
+db-table-type = element db:table-type { db-table-type-attlist, \string }
+db-table-type-attlist = empty
+db-table-type-filter =
+  element db:table-type-filter {
+    db-table-type-filter-attlist, db-table-type*
   }
-table-table-row-group-attlist = attribute table:display { boolean }?
-cellAddress =
-  xsd:string {
-    pattern = "($?([^\. ']+|'([^']|'')+'))?\.$?[A-Z]+$?[0-9]+"
+db-table-type-filter-attlist = empty
+db-update-table =
+  element db:update-table { common-db-table-name-attlist }
+dc-creator = element dc:creator { \string }
+dc-date = element dc:date { dateTime }
+distance = length
+double = xsd:double
+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
   }
-cellRangeAddress =
-  xsd:string {
-    pattern =
-      "($?([^\. ']+|'([^']|'')+'))?\.$?[A-Z]+$?[0-9]+(:($?([^\. 
']+|'([^']|'')+'))?\.$?[A-Z]+$?[0-9]+)?"
+dr3d-cube-attlist =
+  attribute dr3d:min-edge { vector3D }?,
+  attribute dr3d:max-edge { 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
   }
-  | 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),
+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-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
   }
-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?
+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*
   }
-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
+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 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 }?,
+  & attribute dr3d:ambient-color { color }?
+  & attribute dr3d:lighting-mode { boolean }?
+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
   }
-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))?
+dr3d-sphere-attlist =
+  attribute dr3d:center { vector3D }?
+  & attribute dr3d:size { vector3D }?
+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-applet =
+  element draw:applet {
+    draw-applet-attlist, common-draw-data-attlist?, draw-param*
   }
-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*
+draw-applet-attlist =
+  attribute draw:code { \string }?
+  & attribute draw:object { \string }?
+  & attribute draw:archive { \string }?
+  & attribute draw:may-script { boolean }?
+  & xml-id?
+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?
   }
-table-error-message =
-  element table:error-message {
-    attribute table:title { \string }?,
-    attribute table:display { boolean }?,
-    attribute table:message-type {
-      "stop" | "warning" | "information"
-    }?,
-    text-p*
+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?
   }
-table-error-macro =
-  element table:error-macro {
-    attribute table:execute { boolean }?
+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?
   }
-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)*
+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
   }
-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
+draw-caption-attlist =
+  (attribute draw:caption-point-x { coordinate },
+   attribute draw:caption-point-y { coordinate })?
+  & attribute draw:corner-radius { nonNegativeLength }?
+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
   }
-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
+draw-circle-attlist = attribute svg:r { 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
   }
-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
+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 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)
+  & attribute svg:d { pathData }?
+draw-contour-path =
+  element draw:contour-path {
+    common-contour-attlist,
+    common-draw-size-attlist,
+    common-draw-viewbox-attlist,
+    common-draw-path-data-attlist,
+    empty
   }
-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)+
+draw-contour-polygon =
+  element draw:contour-polygon {
+    common-contour-attlist,
+    common-draw-size-attlist,
+    common-draw-viewbox-attlist,
+    common-draw-points-attlist,
+    empty
   }
-table-filter-or =
-  element table:filter-or {
-    (table-filter-and | table-filter-condition)+
+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*
   }
-table-filter-condition =
-  element table:filter-condition {
-    table-filter-condition-attlist, table-filter-set-item*
+draw-control-attlist = attribute draw:control { IDREF }
+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?
   }
-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
+draw-custom-shape-attlist =
+  attribute draw:engine { namespacedToken }?
+  & attribute draw:data { \string }?
+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
   }
-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+
+draw-ellipse-attlist =
+  attribute svg:rx { length },
+  attribute svg:ry { length }
+draw-enhanced-geometry =
+  element draw:enhanced-geometry {
+    draw-enhanced-geometry-attlist, draw-equation*, draw-handle*
   }
-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
+draw-enhanced-geometry-attlist =
+  attribute draw:type { custom-shape-type }?
+  & attribute svg:viewBox {
+      list { integer, integer, integer, integer }
     }?
-  & 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
+  & 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 }?
+draw-equation = element draw:equation { draw-equation-attlist, empty }
+draw-equation-attlist =
+  attribute draw:name { \string }?
+  & attribute draw:formula { \string }?
+draw-fill-image =
+  element draw:fill-image {
+    draw-fill-image-attlist,
+    # XLink duplicate declaration removed. see common-draw-data-attlist
+    ((common-draw-data-attlist, empty) | office-binary-data)
+    # https://issues.oasis-open.org/browse/OFFICE-3933
+
   }
-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
+draw-fill-image-attlist =
+  attribute draw:name { styleName }
+  & attribute draw:display-name { \string }?
+  & attribute svg:width { length }?
+  & attribute svg:height { length }?
+draw-floating-frame =
+  element draw:floating-frame {
+    draw-floating-frame-attlist, common-draw-data-attlist
   }
-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
+draw-floating-frame-attlist =
+  attribute draw:frame-name { \string }?
+  & xml-id?
+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)?
   }
-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
+draw-frame-attlist = attribute draw:copy-of { \string }?
+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*
   }
-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
+draw-g-attlist = attribute svg:y { coordinate }?
+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"
+    }
+draw-gradient =
+  element draw:gradient {
+    common-draw-gradient-attlist, draw-gradient-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
+draw-gradient-attlist =
+  attribute draw:start-color { color }?
+  & attribute draw:end-color { color }?
+  & attribute draw:start-intensity { zeroToHundredPercent }?
+  & attribute draw:end-intensity { zeroToHundredPercent }?
+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 }?
+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-image =
+  element draw:image {
+    draw-image-attlist,
+    (common-draw-data-attlist | office-binary-data),
+    draw-text
   }
-  & 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)*
+draw-image-attlist =
+  attribute draw:filter-name { \string }?
+  & common-draw-mime-type-attlist
+  & # https://issues.oasis-open.org/browse/OFFICE-3943
+    xml-id?
+draw-image-map =
+  element draw:image-map {
+    (draw-area-rectangle | draw-area-circle | draw-area-polygon)*
   }
-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?
+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-layer-set = element draw:layer-set { draw-layer* }
+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
   }
-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 },
+draw-line-attlist =
+  attribute svg:x1 { coordinate }
+  & attribute svg:y1 { coordinate }
+  & attribute svg:x2 { coordinate }
+  & attribute svg:y2 { coordinate }
+draw-marker =
+  element draw:marker {
+    draw-marker-attlist,
+    common-draw-viewbox-attlist,
+    common-draw-path-data-attlist,
     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
+draw-marker-attlist =
+  attribute draw:name { styleName }
+  & attribute draw:display-name { \string }?
+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
   }
-table-deletion =
-  element table:deletion {
-    table-deletion-attlist,
-    common-table-change-attlist,
-    office-change-info,
-    table-dependencies?,
-    table-deletions?,
-    table-cut-offs?
+draw-measure-attlist =
+  attribute svg:x1 { coordinate }
+  & attribute svg:y1 { coordinate }
+  & attribute svg:x2 { coordinate }
+  & attribute svg:y2 { coordinate }
+draw-object =
+  element draw:object {
+    draw-object-attlist,
+    (common-draw-data-attlist | office-document | math-math)
   }
-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*)
+draw-object-attlist =
+  attribute draw:notify-on-update-of-ranges {
+    cellRangeAddressList | \string
+  }?
+  & xml-id?
+draw-object-ole =
+  element draw:object-ole {
+    draw-object-ole-attlist,
+    (common-draw-data-attlist | office-binary-data)
   }
-table-insertion-cut-off =
-  element table:insertion-cut-off {
-    table-insertion-cut-off-attlist, empty
+draw-object-ole-attlist =
+  attribute draw:class-id { \string }?
+  & xml-id?
+draw-opacity =
+  element draw:opacity {
+    common-draw-gradient-attlist, draw-opacity-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-opacity-attlist =
+  attribute draw:start { zeroToHundredPercent }?,
+  attribute draw:end { zeroToHundredPercent }?
+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 }?
@@ -2153,34 +1921,29 @@ draw-page-attlist =
   & (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,
+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-param = element draw:param { draw-param-attlist, empty }
+draw-param-attlist =
+  attribute draw:name { \string }?
+  & attribute draw:value { \string }?
+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?,
@@ -2189,13 +1952,18 @@ draw-rect =
     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,
+draw-plugin =
+  element draw:plugin {
+    draw-plugin-attlist, common-draw-data-attlist, draw-param*
+  }
+draw-plugin-attlist = common-draw-mime-type-attlist & xml-id?
+# https://issues.oasis-open.org/browse/OFFICE-3943
+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?,
@@ -2204,11 +1972,6 @@ draw-line =
     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,
@@ -2223,13 +1986,11 @@ draw-polyline =
     draw-glue-point*,
     draw-text
   }
-common-draw-points-attlist = attribute draw:points { points }
-draw-polygon =
-  element draw:polygon {
-    common-draw-points-attlist,
+draw-rect =
+  element draw:rect {
+    draw-rect-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?,
@@ -2238,6 +1999,10 @@ draw-polygon =
     draw-glue-point*,
     draw-text
   }
+draw-rect-attlist =
+  attribute draw:corner-radius { nonNegativeLength }?
+  | (attribute svg:rx { nonNegativeLength }?,
+     attribute svg:ry { nonNegativeLength }?)
 draw-regular-polygon =
   element draw:regular-polygon {
     draw-regular-polygon-attlist,
@@ -2258,262 +2023,18 @@ draw-regular-polygon-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-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 }?
 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 =
@@ -2525,2177 +2046,539 @@ draw-text-box-attlist =
   & 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,
+dropdown = attribute form:dropdown { boolean }?
+duration = xsd:duration
+extrusionOrigin =
+  xsd:double { minInclusive = "-0.5" maxInclusive = "0.5" }
+fontFamilyGeneric =
+  "roman" | "swiss" | "modern" | "decorative" | "script" | "system"
+fontPitch = "fixed" | "variable"
+fontStyle = "normal" | "italic" | "oblique"
+fontVariant = "normal" | "small-caps"
+fontWeight =
+  "normal"
+  | "bold"
+  | "100"
+  | "200"
+  | "300"
+  | "400"
+  | "500"
+  | "600"
+  | "700"
+  | "800"
+  | "900"
+for = attribute form:for { \string }?
+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-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 }?
+form-column =
+  element form:column { form-column-attlist, column-controls+ }
+form-column-attlist =
+  common-form-control-attlist, label, text-style-name
+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-connection-resource =
+  element form:connection-resource {
+    attribute xlink:href { anyIRI },
     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?
+form-control-attlist =
+  common-form-control-attlist,
+  common-control-id-attlist,
+  xforms-bind-attlist
+form-date-attlist =
+  attribute form:value { date }?
+  & attribute form:current-value { date }?
+  & attribute form:min-value { date }?
+  & attribute form:max-value { date }?
+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-fixed-text-attlist =
+  form-control-attlist
+  & for
+  & common-disabled-attlist
+  & label
+  & common-printable-attlist
+  & common-title-attlist
+  & attribute form:multi-line { boolean }?
+form-form =
+  element form:form {
+    common-form-control-attlist,
+    form-form-attlist,
+    form-properties?,
+    office-event-listeners?,
+    (controls | form-form)*,
+    form-connection-resource?
   }
-common-draw-area-attlist =
+form-form-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
+   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 }?
+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 }?
+form-frame-attlist =
+  form-control-attlist,
+  common-disabled-attlist,
+  for,
+  label,
+  common-printable-attlist,
+  common-title-attlist
+form-generic-control-attlist = form-control-attlist
+form-grid-attlist =
+  form-control-attlist,
+  common-disabled-attlist,
+  common-printable-attlist,
+  common-tab-attlist,
+  common-title-attlist
+form-hidden-attlist = form-control-attlist, common-value-attlist
+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-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-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 }?
+form-number-attlist =
+  attribute form:value { double }?
+  & attribute form:current-value { double }?
+  & attribute form:min-value { double }?
+  & attribute form:max-value { double }?
+form-option = element form:option { form-option-attlist, text }
+form-option-attlist =
+  current-selected, selected, label, common-value-attlist
+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-properties = element form:properties { form-property+ }
+form-property =
+  element form:property {
+    form-property-name, form-property-value-and-type-attlist
   }
-svg-font-face-name =
-  element svg:font-face-name {
-    attribute svg:name { \string }?,
-    empty
+  | element form:list-property {
+      form-property-name, form-property-type-and-value-list
+    }
+form-property-name = attribute form:property-name { \string }
+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" }
+form-property-value-and-type-attlist =
+  common-value-and-type-attlist
+  | attribute office:value-type { "void" }
+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-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-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-time-attlist =
+  attribute form:value { time }?
+  & attribute form:current-value { time }?
+  & attribute form:min-value { time }?
+  & attribute form:max-value { time }?
+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" }?
+gradient-style =
+  "linear" | "axial" | "radial" | "ellipsoid" | "square" | "rectangular"
+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?)
+heading-attrs =
+  attribute text:outline-level { positiveInteger }
+  & attribute text:restart-numbering { boolean }?
+  & attribute text:start-value { nonNegativeInteger }?
+  & attribute text:is-list-header { boolean }?
+horiBackPos = "left" | "center" | "right"
+horizontal-mirror =
+  "horizontal" | "horizontal-on-odd" | "horizontal-on-even"
+image-data = attribute form:image-data { anyIRI }?
+index-content-main = text-content | text-index-title
+integer = xsd:integer
+label = attribute form:label { \string }?
+labelPositions =
+  "avoid-overlap"
+  | "center"
+  | "top"
+  | "top-right"
+  | "right"
+  | "bottom-right"
+  | "bottom"
+  | "bottom-left"
+  | "left"
+  | "top-left"
+  | "inside"
+  | "outside"
+  | "near-origin"
+language = xsd:language
+languageCode = xsd:token { pattern = "[A-Za-z]{1,8}" }
+length =
+  xsd:string {
+    pattern =
+      "-?([0-9]+(\.[0-9]*)?|\.[0-9]+)((cm)|(mm)|(in)|(pt)|(pc)|(px))"
   }
-svg-definition-src =
-  element svg:definition-src {
-    common-svg-font-face-xlink-attlist, empty
+lineMode = "continuous" | "skip-white-space"
+lineStyle =
+  "none"
+  | "solid"
+  | "dotted"
+  | "dash"
+  | "long-dash"
+  | "dot-dash"
+  | "dot-dot-dash"
+  | "wave"
+lineType = "none" | "single" | "double"
+lineWidth =
+  "auto"
+  | "normal"
+  | "bold"
+  | "thin"
+  | "medium"
+  | "thick"
+  | positiveInteger
+  | percent
+  | positiveLength
+list-linkage-type =
+  attribute form:list-linkage-type {
+    "selection" | "selection-indices"
+  }?
+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"
+  }?
+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 })*
+meta-date-string = element meta:date-string { \string }
+namespacedToken = xsd:QName { pattern = "[^:]+:[^:]+" }
+navigation = "none" | "current" | "parent"
+nonNegativeDecimal = xsd:decimal { minInclusive = "0.0" }
+nonNegativeInteger = xsd:nonNegativeInteger
+nonNegativeLength =
+  xsd:string {
+    pattern =
+      "([0-9]+(\.[0-9]*)?|\.[0-9]+)((cm)|(mm)|(in)|(pt)|(pc)|(px))"
   }
-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 {
+nonNegativePixelLength =
+  xsd:string { pattern = "([0-9]+(\.[0-9]*)?|\.[0-9]+)(px)" }
+number-am-pm = element number:am-pm { empty }
+number-and-text =
+  number-number,
+  (number-text-with-fillchar?)
+  # https://issues.oasis-open.org/browse/OFFICE-3765
+
+number-boolean = element number:boolean { empty }
+number-boolean-style =
+  element number:boolean-style {
     common-data-style-attlist,
     style-text-properties?,
     number-text?,
-    (any-number, number-text?)?,
+    (number-boolean, 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-text-with-fillchar?,
+    # https://issues.oasis-open.org/browse/OFFICE-3765
     ((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*
+  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-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?)+,
+    number-text-with-fillchar?,
+    # https://issues.oasis-open.org/browse/OFFICE-3765
+    (any-date,
+     (number-text-with-fillchar?)
+     # https://issues.oasis-open.org/browse/OFFICE-3765
+     )+,
     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-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-embedded-text =
+  element number:embedded-text { number-embedded-text-attlist, text }
+number-embedded-text-attlist = attribute number:position { integer }
+number-era =
+  element number:era {
+    number-era-attlist, common-calendar-attlist, empty
+  }
+number-era-attlist = attribute number:style { "short" | "long" }?
+number-fill-character = element number:fill-character { text }
+# https://issues.oasis-open.org/browse/OFFICE-3765
+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 }?
+  & (attribute number:max-denominator-value { positiveInteger }?)
+    # https://issues.oasis-open.org/browse/OFFICE-3695 max-denominator-value
+
+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-month =
   element number:month {
     number-month-attlist, common-calendar-attlist, empty
@@ -4704,743 +2587,991 @@ 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-number =
+  element number:number {
+    number-number-attlist,
+    common-decimal-places-attlist,
+    common-number-attlist,
+    number-embedded-text*
   }
-number-year-attlist = attribute number:style { "short" | "long" }?
-number-era =
-  element number:era {
-    number-era-attlist, common-calendar-attlist, empty
+number-number-attlist =
+  attribute number:decimal-replacement { \string }?
+  & attribute number:display-factor { double }?
+number-number-style =
+  element number:number-style {
+    common-data-style-attlist,
+    style-text-properties?,
+    number-text-with-fillchar?,
+    # https://issues.oasis-open.org/browse/OFFICE-3765
+    (any-number, number-text-with-fillchar?)?,
+    # https://issues.oasis-open.org/browse/OFFICE-3765
+    style-map*
   }
-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-percentage-style =
+  element number:percentage-style {
+    common-data-style-attlist,
+    style-text-properties?,
+    number-text-with-fillchar?,
+    # https://issues.oasis-open.org/browse/OFFICE-3765
+    number-and-text?,
+    style-map*
   }
-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*
+number-scientific-number =
+  element number:scientific-number {
+    number-scientific-number-attlist,
+    common-decimal-places-attlist,
+    common-number-attlist,
+    empty
   }
-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-scientific-number-attlist =
+  attribute number:min-exponent-digits { integer }?
+  & attribute number:exponent-interval { positiveInteger }?
+  & # https://issues.oasis-open.org/browse/OFFICE-1828 exponent-interval
+    attribute number:forced-exponent-sign { boolean }
+    # https://issues.oasis-open.org/browse/OFFICE-3860 added 
number:forced-exponent-sign
+    ?
 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 {
+number-text = element number:text { text }
+number-text-content = element number:text-content { empty }
+number-text-style =
+  element number:text-style {
     common-data-style-attlist,
     style-text-properties?,
-    number-text?,
-    (number-boolean, number-text?)?,
+    number-text-with-fillchar?,
+    # https://issues.oasis-open.org/browse/OFFICE-3765
+    (number-text-content,
+     (number-text-with-fillchar?)
+     # https://issues.oasis-open.org/browse/OFFICE-3765
+     )*,
     style-map*
   }
-number-boolean = element number:boolean { empty }
-number-text-style =
-  element number:text-style {
+number-text-with-fillchar =
+  number-text?, (number-fill-character, number-text?)?
+# https://issues.oasis-open.org/browse/OFFICE-3765
+number-time-style =
+  element number:time-style {
+    number-time-style-attlist,
     common-data-style-attlist,
+    common-format-source-attlist,
     style-text-properties?,
-    number-text?,
-    (number-text-content, number-text?)*,
+    number-text-with-fillchar?,
+    # https://issues.oasis-open.org/browse/OFFICE-3765
+    (any-time,
+     (number-text-with-fillchar?)
+     # https://issues.oasis-open.org/browse/OFFICE-3765
+     )+,
     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?
+number-time-style-attlist =
+  attribute number:truncate-on-overflow { boolean }?
+number-week-of-year =
+  element number:week-of-year { common-calendar-attlist, empty }
+number-year =
+  element number:year {
+    number-year-attlist, common-calendar-attlist, empty
+  }
+number-year-attlist = attribute number:style { "short" | "long" }?
+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?,
+    element meta:creator-initials { text }?,
+    # https://issues.oasis-open.org/browse/OFFICE-3776
+    (text-p | text-list)*
+  }
+office-annotation-attlist =
+  attribute office:display { boolean }?
+  & common-office-annotation-name-attlist?
+office-annotation-end =
+  element office:annotation-end { office-annotation-end-attlist }
+office-annotation-end-attlist = common-office-annotation-name-attlist
+office-automatic-styles =
+  element office:automatic-styles { styles & style-page-layout* }?
+office-binary-data = element office:binary-data { base64Binary }
+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-change-info =
+  element office:change-info { dc-creator, dc-date, text-p* }
+office-chart-attlist = empty
+office-chart-content-epilogue = table-functions
+office-chart-content-main = chart-chart
+office-chart-content-prelude = text-decls, table-decls
+office-database =
+  element office:database {
+    db-data-source,
+    db-forms?,
+    db-reports?,
+    db-queries?,
+    db-table-presentations?,
+    db-schema-definition?
   }
-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
+office-dde-source =
+  element office:dde-source {
+    office-dde-source-attlist, common-dde-connection-decl-attlist
   }
-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"
+office-dde-source-attlist =
+  attribute office:name { \string }?
+  & attribute office:conversion-mode {
+      "into-default-style-data-style"
+      | "into-english-number"
+      | "keep-text"
     }?
-  & attribute text:footnotes-position {
-      "text" | "page" | "section" | "document"
+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-attrs = attribute office:mimetype { \string }
+office-document-common-attrs =
+  attribute office:version { "1.3" }
+  & attribute grddl:transformation {
+      list { anyIRI* }
     }?
-  & 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*
+office-document-content =
+  element office:document-content {
+    office-document-common-attrs,
+    office-scripts,
+    office-font-face-decls,
+    office-automatic-styles,
+    office-body
   }
-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*
+office-document-meta =
+  element office:document-meta {
+    office-document-common-attrs, office-meta
   }
-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?
+office-document-settings =
+  element office:document-settings {
+    office-document-common-attrs, office-settings
+  }
+office-document-styles =
+  element office:document-styles {
+    office-document-common-attrs,
+    office-font-face-decls,
+    office-styles,
+    office-automatic-styles,
+    office-master-styles
+  }
+office-drawing-attlist = empty
+office-drawing-content-epilogue = table-functions
+office-drawing-content-main = draw-page*
+office-drawing-content-prelude = text-decls, table-decls
+office-event-listeners =
+  element office:event-listeners {
+    (script-event-listener | presentation-event-listener)*
+  }
+office-font-face-decls =
+  element office:font-face-decls { style-font-face* }?
+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 }?
+office-image-attlist = empty
+office-image-content-epilogue = empty
+office-image-content-main = draw-frame
+office-image-content-prelude = empty
+office-master-styles =
+  element office:master-styles {
+    style-master-page* & style-handout-master? & draw-layer-set?
+  }?
+office-meta = element office:meta { office-meta-content-strict }?
+office-meta-content-strict = office-meta-data*
+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)
+    }
+office-presentation-attlist = empty
+office-presentation-content-epilogue =
+  presentation-settings, table-functions
+office-presentation-content-main = draw-page*
+office-presentation-content-prelude =
+  text-decls, table-decls, presentation-decls
+# removed from text as well
+# <rng:define name="office-process-content">
+#   <rng:optional>
+#     <rng:attribute name="office:process-content">
+#       <rng:ref name="boolean"/>
+#     </rng:attribute>
+#   </rng:optional>
+# </rng:define>
+office-script =
+  element office:script {
+    office-script-attlist,
+    mixed { anyElements }
   }
-  | element text:list-level-style-bullet {
-      text-list-level-style-attr,
-      text-list-level-style-bullet-attr,
-      style-list-level-properties?,
-      style-text-properties?
+office-script-attlist = attribute script:language { \string }
+office-scripts =
+  element office:scripts { office-script*, office-event-listeners? }?
+office-settings = element office:settings { config-config-item-set+ }?
+office-spreadsheet-attlist =
+  attribute table:structure-protected { boolean }?,
+  attribute table:protection-key { \string }?,
+  attribute table:protection-key-digest-algorithm { anyIRI }?
+office-spreadsheet-content-epilogue = table-functions
+office-spreadsheet-content-main = table-table*
+office-spreadsheet-content-prelude =
+  table-tracked-changes?, text-decls, table-decls
+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-text-attlist =
+  attribute text:global { boolean }?
+  & attribute text:use-soft-page-breaks { boolean }?
+office-text-content-epilogue = table-functions
+office-text-content-main =
+  text-content*
+  | (text-page-sequence, (shape)*)
+office-text-content-prelude =
+  office-forms, text-tracked-changes, text-decls, table-decls
+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?
+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 }
+  | text-drop-down
+  | # OFFICE-3881
+    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:list-level-style-image {
-      text-list-level-style-attr,
-      text-list-level-style-image-attr,
-      style-list-level-properties?
+  | element text:database-display {
+      text-database-display-attlist, text
     }
-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*
+  | 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 }
+paragraph-content-or-hyperlink = paragraph-content | text-a
+pathData = xsd:string
+percent = xsd:string { pattern = "-?([0-9]+(\.[0-9]*)?|\.[0-9]+)%" }
+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}[ ]*\)"
   }
-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
+points =
+  xsd:string { pattern = "-?[0-9]+,-?[0-9]+([ ]+-?[0-9]+,-?[0-9]+)*" }
+positiveInteger = xsd:positiveInteger
+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))"
   }
-style-page-layout-properties =
-  element style:page-layout-properties {
-    style-page-layout-properties-content-strict
+presentation-animation-elements =
+  presentation-show-shape
+  | presentation-show-text
+  | presentation-hide-shape
+  | presentation-hide-text
+  | presentation-dim
+  | presentation-play
+presentation-animation-group =
+  element presentation:animation-group {
+    presentation-animation-elements*
   }
-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
+presentation-animations =
+  element presentation:animations {
+    (presentation-animation-elements | presentation-animation-group)*
   }
-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 {
+presentation-classes =
+  "title"
+  | "outline"
+  | "subtitle"
+  | "text"
+  | "graphic"
+  | "object"
+  | "chart"
+  | "table"
+  | "orgchart"
+  | "page"
+  | "notes"
+  | "handout"
+  | "header"
+  | "footer"
+  | "date-time"
+  | "page-number"
+presentation-date-time-decl-attlist =
+  attribute presentation:name { \string }
+  & attribute presentation:source { "fixed" | "current-date" }
+  & attribute style:data-style-name { styleNameRef }?
+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-decls = presentation-decl*
+presentation-dim =
+  element presentation:dim {
+    presentation-dim-attlist, presentation-sound?
+  }
+presentation-dim-attlist =
+  attribute draw:shape-id { IDREF }
+  & attribute draw:color { color }
+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"
-      | list {
-          ("none" | "accent" | "dot" | "circle" | "disc"),
-          ("above" | "below")
-        }
+      | "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-footer-decl-attlist =
+  attribute presentation:name { \string }
+presentation-header-decl-attlist =
+  attribute presentation:name { \string }
+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-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 }?
+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
+  }
+presentation-play =
+  element presentation:play { presentation-play-attlist, empty }
+presentation-play-attlist =
+  attribute draw:shape-id { IDREF },
+  attribute presentation:speed { presentationSpeeds }?
+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 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 =
+  & attribute presentation:stay-on-top { boolean }?
+  & attribute presentation:show-end-of-presentation-slide { boolean }?
+presentation-shape-attlist =
+  attribute presentation:class { presentation-classes }?
+  & attribute presentation:placeholder { boolean }?
+  & attribute presentation:user-transformed { boolean }?
+presentation-show =
+  element presentation:show { presentation-show-attlist, empty }
+presentation-show-attlist =
+  attribute presentation:name { \string }
+  & attribute presentation:pages { \string }
+presentation-show-shape =
+  element presentation:show-shape {
+    common-presentation-effect-attlist, presentation-sound?
+  }
+presentation-show-text =
+  element presentation:show-text {
+    common-presentation-effect-attlist, presentation-sound?
+  }
+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?
+presentationEffectDirections =
   "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
+  | "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"
+presentationEffects =
+  "none"
+  | "fade"
+  | "move"
+  | "stripes"
+  | "open"
+  | "close"
+  | "dissolve"
+  | "wavyline"
+  | "random"
+  | "lines"
+  | "laser"
+  | "appear"
+  | "hide"
+  | "move-short"
+  | "checkerboard"
+  | "rotate"
+  | "stretch"
+presentationSpeeds = "slow" | "medium" | "fast"
+region-content = text-p*
+relativeLength = xsd:string { pattern = "[0-9]+\*" }
+rowOrCol = "row" | "column"
+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" }?))
+scriptCode = xsd:token { pattern = "[A-Za-z0-9]{1,8}" }
+selected = attribute form:selected { boolean }?
+shadowType = "none" | \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
+shapes3d =
+  dr3d-scene | dr3d-extrude | dr3d-sphere | dr3d-rotate | dr3d-cube
+signedZeroToHundredPercent =
+  xsd:string {
+    pattern = "-?([0-9]?[0-9](\.[0-9]*)?|100(\.0*)?|\.[0-9]+)%"
   }
-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 }?
+size = attribute form:size { nonNegativeInteger }?
+states = "unchecked" | "checked" | "unknown"
+\string = xsd:string
 style-background-image =
   element style:background-image {
     style-background-image-attlist,
@@ -5459,74 +3590,159 @@ style-background-image-attlist =
     }?
   & 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-chart-properties =
+  element style:chart-properties {
+    style-chart-properties-content-strict
+  }
+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"
+      | "step-start"
+      | "step-end"
+      | "step-center-x"
+      | "step-center-y"
+    }?
+  & 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"
+      | "moving-average"
+      | "exponential"
+      | "power"
+      | "polynomial"
     }?
-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 }?
+  & attribute chart:regression-max-degree { positiveInteger }?
+  & attribute chart:regression-force-intercept { boolean }?
+  & attribute chart:regression-intercept-value { double }?
+  & attribute chart:regression-name { \string }?
+  & # https://issues.oasis-open.org/browse/OFFICE-3958
+    attribute chart:regression-period { positiveInteger }?
+  & attribute chart:regression-moving-type {
+      "prior" | "central" | "averaged-abscissa"
+    }?
+  & # https://issues.oasis-open.org/browse/OFFICE-3959
+    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 }?
+  & (attribute chart:data-label-series { boolean }?)
+    # https://issues.oasis-open.org/browse/OFFICE-2117
+
+style-chart-properties-content-strict =
+  style-chart-properties-attlist, style-chart-properties-elements
+style-chart-properties-elements = empty
 style-column = element style:column { style-column-attlist }
 style-column-attlist =
   attribute style:rel-width { relativeLength }
@@ -5543,132 +3759,235 @@ style-column-sep-attlist =
   & 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-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-default-page-layout =
+  element style:default-page-layout { style-page-layout-content }
+style-default-style =
+  element style:default-style { style-style-content }
+style-drawing-page-properties =
+  element style:drawing-page-properties {
+    style-drawing-page-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-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-content-strict =
+  style-graphic-fill-properties-attlist,
+  style-drawing-page-properties-attlist,
+  style-drawing-page-properties-elements
+style-drawing-page-properties-elements = presentation-sound?
+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 }?
+style-font-face =
+  element style:font-face {
+    style-font-face-attlist, svg-font-face-src?, svg-definition-src?
   }
-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-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 }?
+style-footer =
+  element style:footer {
+    common-style-header-footer-attlist, header-footer-content
   }
-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"
+style-footer-first =
+  element style:footer-first {
+    common-style-header-footer-attlist,
+    header-footer-content
+    # https://issues.oasis-open.org/browse/OFFICE-3789
+
+  }
+style-footer-left =
+  element style:footer-left {
+    common-style-header-footer-attlist, header-footer-content
+  }
+style-footer-style =
+  element style:footer-style { style-header-footer-properties? }
+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-graphic-fill-properties-attlist =
+  attribute draw:fill {
+    "none" | "solid" | "bitmap" | "gradient" | "hatch"
   }?
-  & 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 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 style:cell-protect {
-      "none"
-      | "hidden-and-protected"
-      | list { ("protected" | "formula-hidden")+ }
+  & attribute draw:tile-repeat-offset {
+      list { zeroToHundredPercent, ("horizontal" | "vertical") }
     }?
-  & 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
+  & attribute draw:opacity { zeroToHundredPercent }?
+  & attribute draw:opacity-name { styleNameRef }?
+  & attribute svg:fill-rule { "nonzero" | "evenodd" }?
+style-graphic-properties =
+  element style:graphic-properties {
+    style-graphic-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 }?
@@ -5717,7 +4036,9 @@ style-graphic-properties-attlist =
       "greyscale" | "mono" | "watermark" | "standard"
     }?
   & attribute draw:color-inversion { boolean }?
-  & attribute draw:luminance { zeroToHundredPercent }?
+  & attribute draw:luminance { signedZeroToHundredPercent }
+    # https://issues.oasis-open.org/browse/OFFICE-3821
+    ?
   & attribute draw:contrast { percent }?
   & attribute draw:gamma { percent }?
   & attribute draw:red { signedZeroToHundredPercent }?
@@ -5758,497 +4079,2316 @@ style-graphic-properties-attlist =
       | "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: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-properties-content-strict =
+  style-graphic-properties-attlist,
+  style-graphic-fill-properties-attlist,
+  style-graphic-properties-elements
+style-graphic-properties-elements =
+  text-list-style? & style-background-image & style-columns
+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 }?
+style-header =
+  element style:header {
+    common-style-header-footer-attlist, header-footer-content
+  }
+style-header-first =
+  element style:header-first {
+    common-style-header-footer-attlist,
+    header-footer-content
+    # https://issues.oasis-open.org/browse/OFFICE-3789
+
+  }
+style-header-footer-properties =
+  element style:header-footer-properties {
+    style-header-footer-properties-content-strict
+  }
+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-content-strict =
+  style-header-footer-properties-attlist,
+  style-header-footer-properties-elements
+style-header-footer-properties-elements = style-background-image
+style-header-left =
+  element style:header-left {
+    common-style-header-footer-attlist, header-footer-content
+  }
+style-header-style =
+  element style:header-style { style-header-footer-properties? }
+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-list-level-properties =
+  element style:list-level-properties {
+    style-list-level-properties-content-strict
+  }
+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"
     }?
-  & 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"
+style-list-level-properties-content-strict =
+  style-list-level-properties-attlist,
+  style-list-level-properties-elements
+style-list-level-properties-elements = style-list-level-label-alignment
+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-master-page =
+  element style:master-page {
+    style-master-page-attlist,
+    (style-header,
+     style-header-left?,
+     (style-header-first?)
+     # https://issues.oasis-open.org/browse/OFFICE-3789
+     )?,
+    (style-footer,
+     style-footer-left?,
+     (style-footer-first?)
+     # https://issues.oasis-open.org/browse/OFFICE-3789
+     )?,
+    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-num-letter-sync-attlist =
+  attribute style:num-letter-sync { boolean }?
+style-page-layout =
+  element style:page-layout {
+    style-page-layout-attlist, style-page-layout-content
+  }
+style-page-layout-attlist =
+  attribute style:name { styleName }
+  & attribute style:page-usage {
+      "all" | "left" | "right" | "mirrored"
     }?
-  & 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"
+style-page-layout-content =
+  style-page-layout-properties?,
+  style-header-style?,
+  style-footer-style?
+style-page-layout-properties =
+  element style:page-layout-properties {
+    style-page-layout-properties-content-strict
+  }
+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 dr3d:texture-generation-mode-y {
-      "object" | "parallel" | "sphere"
+  & 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:scale-to-X { positiveInteger }?,
+        attribute style:scale-to-Y { positiveInteger }?))
+  & # https://issues.oasis-open.org/browse/OFFICE-3857
+    attribute style:table-centering {
+      "horizontal" | "vertical" | "both" | "none"
     }?
-  & 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 }?
+  & 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-content-strict =
+  style-page-layout-properties-attlist,
+  style-page-layout-properties-elements
+style-page-layout-properties-elements =
+  style-background-image & style-columns & style-footnote-sep
+style-paragraph-properties =
+  element style:paragraph-properties {
+    style-paragraph-properties-content-strict
+  }
+style-paragraph-properties-attlist =
+  attribute style:contextual-spacing { boolean }?
+  & # https://issues.oasis-open.org/browse/OFFICE-3767
+    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
-  & attribute style:print-content { boolean }?
-  & attribute style:protect {
-      "none"
-      | list { ("content" | "position" | "size")+ }
+  & 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"
     }?
-  & attribute style:horizontal-pos {
+  & 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-content-strict =
+  style-paragraph-properties-attlist,
+  style-paragraph-properties-elements
+style-paragraph-properties-elements =
+  style-tab-stops & style-drop-cap & style-background-image
+style-presentation-page-layout =
+  element style:presentation-page-layout {
+    attribute style:name { styleName },
+    attribute style:display-name { \string }?,
+    presentation-placeholder*
+  }
+style-region-center = element style:region-center { region-content }
+style-region-left = element style:region-left { region-content }
+style-region-right = element style:region-right { region-content }
+style-ruby-properties =
+  element style:ruby-properties { style-ruby-properties-content-strict }
+style-ruby-properties-attlist =
+  attribute style:ruby-position { "above" | "below" }?
+  & attribute style:ruby-align {
       "left"
       | "center"
       | "right"
-      | "from-left"
-      | "inside"
-      | "outside"
-      | "from-inside"
+      | "distribute-letter"
+      | "distribute-space"
     }?
-  & 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"
+style-ruby-properties-content-strict =
+  style-ruby-properties-attlist, style-ruby-properties-elements
+style-ruby-properties-elements = empty
+style-section-properties =
+  element style:section-properties {
+    style-section-properties-content-strict
+  }
+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-content-strict =
+  style-section-properties-attlist, style-section-properties-elements
+style-section-properties-elements =
+  style-background-image & style-columns & text-notes-configuration*
+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-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-tab-stops = element style:tab-stops { style-tab-stop* }?
+style-table-cell-properties =
+  element style:table-cell-properties {
+    style-table-cell-properties-content-strict
+  }
+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-vertical-pos-attlist
-  & common-vertical-rel-attlist
-  & common-text-anchor-attlist
+  & 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 }?
+style-table-cell-properties-content-strict =
+  style-table-cell-properties-attlist,
+  style-table-cell-properties-elements
+style-table-cell-properties-elements = style-background-image
+style-table-column-properties =
+  element style:table-column-properties {
+    style-table-column-properties-content-strict
+  }
+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-column-properties-content-strict =
+  style-table-column-properties-attlist,
+  style-table-column-properties-elements
+style-table-column-properties-elements = empty
+style-table-properties =
+  element style:table-properties {
+    style-table-properties-content-strict
+  }
+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 }?
+  & (attribute table:tab-color { color }?)
+    # https://issues.oasis-open.org/browse/OFFICE-2173
+
+style-table-properties-content-strict =
+  style-table-properties-attlist, style-table-properties-elements
+style-table-properties-elements = style-background-image
+style-table-row-properties =
+  element style:table-row-properties {
+    style-table-row-properties-content-strict
+  }
+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-content-strict =
+  style-table-row-properties-attlist,
+  style-table-row-properties-elements
+style-table-row-properties-elements = style-background-image
+style-text-properties =
+  element style:text-properties { style-text-properties-content-strict }
+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
-  & common-background-transparency-attlist
-  & common-editable-attlist
-  & attribute style:wrap {
+  & 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"
-      | "left"
-      | "right"
-      | "parallel"
-      | "dynamic"
-      | "run-through"
-      | "biggest"
+      | list {
+          ("none" | "accent" | "dot" | "circle" | "disc"),
+          ("above" | "below")
+        }
     }?
-  & attribute style:wrap-dynamic-threshold { nonNegativeLength }?
-  & attribute style:number-wrapped-paragraphs {
-      "no-limit" | positiveInteger
+  & 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-text-properties-content-strict =
+  style-text-properties-attlist, style-text-properties-elements
+style-text-properties-elements = empty
+styleName = xsd:NCName
+styleNameRef = xsd:NCName | empty
+styleNameRefs = list { xsd:NCName* }
+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*
+svg-definition-src =
+  element svg:definition-src {
+    common-svg-font-face-xlink-attlist, empty
+  }
+svg-desc = element svg:desc { text }
+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-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-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 }?
+  }
+svg-title = element svg:title { text }
+tab-cycles = "records" | "current" | "page"
+table-background =
+  element table:background { table-background-attlist, empty }
+table-background-attlist = attribute table:style-name { styleNameRef }
+table-body = element table:body { common-table-template-attlist, empty }
+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 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 table:automatic-find-labels { boolean }?
+  & attribute table:use-regular-expressions { boolean }?
+  & attribute table:use-wildcards { boolean }?
+  & attribute table:null-year { positiveInteger }?
+table-calculation-settings =
+  element table:calculation-settings {
+    table-calculation-setting-attlist,
+    table-null-date?,
+    table-iteration?
+  }
+table-cell-address =
+  element table:cell-address {
+    common-table-cell-address-attlist, empty
+  }
+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-content-deletion =
+  element table:cell-content-deletion {
+    attribute table:id { \string }?,
+    table-cell-address?,
+    table-change-track-table-cell?
+  }
+table-cell-range-source =
+  element table:cell-range-source {
+    table-table-cell-range-source-attlist,
+    table-linked-source-attlist,
+    empty
+  }
+table-change-deletion =
+  element table:change-deletion {
+    attribute table:id { \string }?,
+    empty
+  }
+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-columns = table-table-columns | table-table-column+
+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-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-content-validation =
+  element table:content-validation {
+    table-validation-attlist,
+    table-help-message?,
+    (table-error-message | (table-error-macro, office-event-listeners))?
+  }
+table-content-validations =
+  element table:content-validations { table-content-validation+ }
+table-covered-table-cell =
+  element table:covered-table-cell {
+    table-table-cell-attlist, table-table-cell-content
+  }
+table-cut-offs =
+  element table:cut-offs {
+    table-movement-cut-off+
+    | (table-insertion-cut-off, table-movement-cut-off*)
+  }
+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-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 style:mirror {
+  & attribute table:used-hierarchy { integer }?
+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"
-      | "vertical"
-      | horizontal-mirror
-      | list { "vertical", horizontal-mirror }
-      | list { horizontal-mirror, "vertical" }
+      | "member-difference"
+      | "member-percentage"
+      | "member-percentage-difference"
+      | "running-total"
+      | "row-percentage"
+      | "column-percentage"
+      | "total-percentage"
+      | "index"
+    }
+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-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"
+    }?
+# https://issues.oasis-open.org/browse/OFFICE-2118
+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-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-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-members =
+  element table:data-pilot-members { table-data-pilot-member* }
+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-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-subtotals =
+  element table:data-pilot-subtotals { table-data-pilot-subtotal* }
+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-data-pilot-tables =
+  element table:data-pilot-tables { table-data-pilot-table* }
+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-ranges =
+  element table:database-ranges { table-database-range* }
+table-database-source-query =
+  element table:database-source-table {
+    table-database-source-table-attlist, empty
+  }
+table-database-source-query-attlist =
+  attribute table:database-name { \string }
+  & attribute table:query-name { \string }
+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-table =
+  element table:database-source-query {
+    table-database-source-query-attlist, empty
+  }
+table-database-source-table-attlist =
+  attribute table:database-name { \string }
+  & attribute table:database-table-name { \string }
+table-dde-link =
+  element table:dde-link { office-dde-source, table-table }
+table-dde-links = element table:dde-links { table-dde-link+ }
+table-decls =
+  table-calculation-settings?,
+  table-content-validations?,
+  table-label-ranges?
+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-deletions =
+  element table:deletions {
+    (table-cell-content-deletion | table-change-deletion)+
+  }
+table-dependencies = element table:dependencies { table-dependency+ }
+table-dependency =
+  element table:dependency {
+    attribute table:id { \string },
+    empty
+  }
+table-desc = element table:desc { text }
+table-detective =
+  element table:detective { table-highlighted-range*, table-operation* }
+table-error-macro =
+  element table:error-macro {
+    attribute table:execute { boolean }?
+  }
+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-even-columns =
+  element table:even-columns { common-table-template-attlist, empty }
+table-even-rows =
+  element table:even-rows { common-table-template-attlist, empty }
+table-filter =
+  element table:filter {
+    table-filter-attlist,
+    (table-filter-condition | table-filter-and | table-filter-or)
+  }
+table-filter-and =
+  element table:filter-and {
+    (table-filter-or | table-filter-condition)+
+  }
+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-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-or =
+  element table:filter-or {
+    (table-filter-and | table-filter-condition)+
+  }
+table-filter-set-item =
+  element table:filter-set-item {
+    attribute table:value { \string },
+    empty
+  }
+table-first-column =
+  element table:first-column { common-table-template-attlist, empty }
+table-first-row =
+  element table:first-row { common-table-template-attlist, empty }
+table-functions =
+  table-named-expressions?,
+  table-database-ranges?,
+  table-data-pilot-tables?,
+  table-consolidation?,
+  table-dde-links?
+table-help-message =
+  element table:help-message {
+    attribute table:title { \string }?,
+    attribute table:display { boolean }?,
+    text-p*
+  }
+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 }
+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-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-iteration =
+  element table:iteration {
+    attribute table:status { "enable" | "disable" }?,
+    attribute table:steps { positiveInteger }?,
+    attribute table:maximum-difference { double }?,
+    empty
+  }
+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-label-ranges = element table:label-ranges { table-label-range* }
+table-last-column =
+  element table:last-column { common-table-template-attlist, empty }
+table-last-row =
+  element table:last-row { common-table-template-attlist, empty }
+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-movement =
+  element table:movement {
+    common-table-change-attlist,
+    table-source-range-address,
+    table-target-range-address,
+    office-change-info,
+    table-dependencies?,
+    table-deletions?
+  }
+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-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-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-null-date =
+  element table:null-date {
+    attribute table:value-type { "date" }?,
+    attribute table:date-value { date }?,
+    empty
+  }
+table-odd-columns =
+  element table:odd-columns { common-table-template-attlist, empty }
+table-odd-rows =
+  element table:odd-rows { common-table-template-attlist, empty }
+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-previous =
+  element table:previous {
+    attribute table:id { \string }?,
+    table-change-track-table-cell
+  }
+table-rows =
+  table-table-rows | (text-soft-page-break?, table-table-row)+
+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-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-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"
     }?
-  & attribute fo:clip { "auto" | clipShape }?
-  & attribute draw:wrap-influence-on-position {
-      "iterative" | "once-concurrent" | "once-successive"
+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
     }?
-  & 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 table:order { "ascending" | "descending" }?
+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-source-cell-range =
+  element table:source-cell-range {
+    table-source-cell-range-attlist, table-filter?
+  }
+table-source-cell-range-attlist =
+  # OFFICE-3665
+  (attribute table:cell-range-address { cellRangeAddress }
+   | (attribute table:name { \string },
+      attribute table:cell-range-address { cellRangeAddress }?))
+table-source-range-address =
+  element table:source-range-address {
+    common-table-range-attlist, empty
+  }
+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-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-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-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-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-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-table-cell =
+  element table:table-cell {
+    table-table-cell-attlist,
+    table-table-cell-attlist-extra,
+    table-table-cell-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-cell-content =
+  table-cell-range-source?,
+  office-annotation?,
+  table-detective?,
+  text-content*
+table-table-cell-range-source-attlist =
+  attribute table:name { \string }
+  & attribute table:last-column-spanned { positiveInteger }
+  & attribute table:last-row-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-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-columns =
+  element table:table-columns { table-table-column+ }
+table-table-header-columns =
+  element table:table-header-columns { table-table-column+ }
+table-table-header-rows =
+  element table:table-header-rows {
+    (text-soft-page-break?, table-table-row)+
+  }
+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-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 }?
+table-table-rows =
+  element table:table-rows { (text-soft-page-break?, table-table-row)+ }
+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-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 }
+table-target-range-address =
+  element table:target-range-address {
+    common-table-range-attlist, empty
+  }
+table-title = element table:title { text }
+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-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"
     }?
-  & attribute draw:ole-draw-aspect { nonNegativeInteger }?
-style-graphic-fill-properties-attlist =
-  attribute draw:fill {
-    "none" | "solid" | "bitmap" | "gradient" | "hatch"
+table-visibility-value = "visible" | "collapse" | "filter"
+target-frame = attribute office:target-frame { targetFrameName }?
+target-location = attribute xlink:href { anyIRI }?
+targetFrameName = "_self" | "_blank" | "_parent" | "_top" | \string
+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-alphabetical-index =
+  element text:alphabetical-index {
+    common-section-attlist,
+    text-alphabetical-index-source,
+    text-index-body
+  }
+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-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-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-bibliography =
+  element text:bibliography {
+    common-section-attlist, text-bibliography-source, text-index-body
+  }
+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-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-bibliography-source =
+  element text:bibliography-source {
+    text-index-title-template?, text-bibliography-entry-template*
+  }
+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-bookmark = element text:bookmark { text-bookmark-attlist, empty }
+text-bookmark-attlist =
+  attribute text:name { \string }
+  & xml-id?
+text-bookmark-end =
+  element text:bookmark-end { text-bookmark-end-attlist, empty }
+text-bookmark-end-attlist = attribute text:name { \string }
+text-bookmark-ref-content =
+  attribute text:reference-format {
+    common-ref-format-values
+    | "number-no-superior"
+    | "number-all-superior"
+    | "number"
   }?
-  & 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") }
+text-bookmark-start =
+  element text:bookmark-start { text-bookmark-start-attlist, empty }
+text-bookmark-start-attlist =
+  attribute text:name { \string }
+  & xml-id?
+  & common-in-content-meta-attlist?
+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 }
+text-chapter-attlist =
+  attribute text:display {
+    "name"
+    | "number"
+    | "number-and-name"
+    | "plain-number-and-name"
+    | "plain-number"
+  }
+  & attribute text:outline-level { nonNegativeInteger }
+text-common-ref-content =
+  text
+  & attribute text:ref-name { \string }?
+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-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
+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-date-attlist =
+  (common-field-fixed-attlist & common-field-data-style-name-attlist)
+  & attribute text:date-value { dateOrDateTime }?
+  & attribute text:date-adjust { duration }?
+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 }
+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?
+text-drop-down =
+  element text:drop-down {
+    attribute text:name { \string },
+    element text:label {
+      attribute text:value { \string }?,
+      attribute text:current-selected { boolean }?
+    }*,
+    text
+  }
+text-file-name-attlist =
+  attribute text:display {
+    "full" | "path" | "name" | "name-and-extension"
+  }?
+  & common-field-fixed-attlist
+text-get-page-variable-attlist = common-field-num-format-attlist
+text-h =
+  element text:h {
+    heading-attrs,
+    paragraph-attrs,
+    text-number?,
+    paragraph-content-or-hyperlink*
+  }
+text-hidden-paragraph-attlist =
+  attribute text:condition { \string }
+  & attribute text:is-hidden { boolean }?
+text-hidden-text-attlist =
+  attribute text:condition { \string }
+  & attribute text:string-value { \string }
+  & attribute text:is-hidden { boolean }?
+text-id = attribute text:id { \string }
+text-illustration-index =
+  element text:illustration-index {
+    common-section-attlist,
+    text-illustration-index-source,
+    text-index-body
+  }
+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-index-entry-link-start
+   | text-index-entry-link-end
+     # https://issues.oasis-open.org/browse/OFFICE-3941
+     )*
+text-illustration-index-entry-template =
+  element text:illustration-index-entry-template {
+    text-illustration-index-entry-content
+  }
+text-illustration-index-entry-template-attrs =
+  attribute text:style-name { styleNameRef }
+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"
     }?
-  & 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"
+text-index-body = element text:index-body { index-content-main* }
+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-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"
   }?
-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}[ ]*\)"
+  & attribute text:outline-level { positiveInteger }?
+text-index-entry-link-end =
+  element text:index-entry-link-end {
+    attribute text:style-name { styleNameRef }?
   }
-nonNegativePixelLength =
-  xsd:string { pattern = "([0-9]+(\.[0-9]*)?|\.[0-9]+)(px)" }
-style-chart-properties =
-  element style:chart-properties {
-    style-chart-properties-content-strict
+text-index-entry-link-start =
+  element text:index-entry-link-start {
+    attribute text:style-name { styleNameRef }?
   }
-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"
+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-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-text =
+  element text:index-entry-text {
+    attribute text:style-name { styleNameRef }?
+  }
+text-index-name = attribute text:index-name { \string }
+text-index-scope-attr =
+  attribute text:index-scope { "document" | "chapter" }?
+text-index-source-style =
+  element text:index-source-style {
+    attribute text:style-name { styleNameRef },
+    empty
+  }
+# https://issues.oasis-open.org/browse/OFFICE-3675
+text-index-source-styles =
+  element text:index-source-styles {
+    attribute text:outline-level { positiveInteger },
+    text-index-source-style*
+  }
+text-index-title =
+  element text:index-title {
+    common-section-attlist, index-content-main*
+  }
+text-index-title-template =
+  element text:index-title-template {
+    attribute text:style-name { styleNameRef }?,
+    text
+  }
+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 chart:tick-mark-position {
-      "at-labels" | "at-axis" | "at-labels-and-axis"
+  & 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-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-header =
+  element text:list-header {
+    text-list-header-attr, text-list-item-content
+  }
+text-list-header-attr = xml-id?
+text-list-item =
+  element text:list-item { text-list-item-attr, text-list-item-content }
+text-list-item-attr =
+  attribute text:start-value { nonNegativeInteger }?
+  & attribute text:style-override { styleNameRef }?
+  & xml-id?
+text-list-item-content =
+  text-number?, (text-p | text-h | text-list | text-soft-page-break)*
+text-list-level-style-attr = attribute text:level { 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-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-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-meta-attlist = common-in-content-meta-attlist? & xml-id?
+text-meta-field-attlist = xml-id & common-field-data-style-name-attlist
+text-note-class = attribute text:note-class { "footnote" | "endnote" }
+text-note-ref-content =
+  attribute text:reference-format { common-ref-format-values }?
+  & text-note-class
+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 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 text:footnotes-position {
+      "text" | "page" | "section" | "document"
     }?
-  & 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))"
+  & element text:note-continuation-notice-forward { text }?
+  & element text:note-continuation-notice-backward { text }?
+text-number = element text:number { \string }
+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-object-index =
+  element text:object-index {
+    common-section-attlist, text-object-index-source, text-index-body
+  }
+text-object-index-entry-template =
+  element text:object-index-entry-template {
+    text-illustration-index-entry-content
+  }
+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-outline-level = attribute text:outline-level { positiveInteger }?
+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 }?
+text-outline-style =
+  element text:outline-style {
+    text-outline-style-attr, text-outline-level-style+
+  }
+text-outline-style-attr = attribute style:name { styleName }
+text-p =
+  element text:p { paragraph-attrs, paragraph-content-or-hyperlink* }
+text-page = element text:page { text-page-attlist, empty }
+text-page-attlist = attribute text:master-page-name { styleNameRef }
+text-page-continuation-attlist =
+  attribute text:select-page { "previous" | "next" }
+  & attribute text:string-value { \string }?
+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-sequence = element text:page-sequence { text-page+ }
+text-placeholder-attlist =
+  attribute text:placeholder-type {
+    "text" | "table" | "text-box" | "image" | "object"
   }
-nonNegativeLength =
-  xsd:string {
-    pattern =
-      "([0-9]+(\.[0-9]*)?|\.[0-9]+)((cm)|(mm)|(in)|(pt)|(pc)|(px))"
+  & common-field-description-attlist
+text-relative-tab-stop-position-attr =
+  attribute text:relative-tab-stop-position { boolean }?
+text-section =
+  element text:section {
+    text-section-attlist,
+    (text-section-source | text-section-source-dde | empty),
+    text-content*
   }
-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))"
+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 }
+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-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-content =
+  attribute text:reference-format {
+    common-ref-format-values
+    | "category-and-value"
+    | "caption"
+    | "value"
+  }?
+text-sequence-ref-name = attribute text:ref-name { \string }?
+text-set-page-variable-attlist =
+  attribute text:active { boolean }?
+  & attribute text:page-adjust { integer }?
+text-soft-page-break = element text:soft-page-break { empty }
+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-style-name = attribute form:text-style-name { styleNameRef }?
+text-tab-attr = attribute text:tab-ref { nonNegativeInteger }?
+text-table-index =
+  element text:table-index {
+    common-section-attlist, text-table-index-source, text-index-body
   }
-percent = xsd:string { pattern = "-?([0-9]+(\.[0-9]*)?|\.[0-9]+)%" }
-zeroToHundredPercent =
-  xsd:string {
-    pattern = "([0-9]?[0-9](\.[0-9]*)?|100(\.0*)?|\.[0-9]+)%"
+text-table-index-entry-template =
+  element text:table-index-entry-template {
+    text-illustration-index-entry-content
   }
-signedZeroToHundredPercent =
-  xsd:string {
-    pattern = "-?([0-9]?[0-9](\.[0-9]*)?|100(\.0*)?|\.[0-9]+)%"
+text-table-index-source =
+  element text:table-index-source {
+    text-illustration-index-source-attrs,
+    text-index-title-template?,
+    text-table-index-entry-template?
   }
-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"
+text-table-of-content =
+  element text:table-of-content {
+    common-section-attlist,
+    text-table-of-content-source,
+    text-index-body
   }
-URIorSafeCURIE = anyURI | SafeCURIE
-styleName = xsd:NCName
-styleNameRef = xsd:NCName | empty
-styleNameRefs = list { xsd:NCName* }
-variableName = xsd:string
-targetFrameName = "_self" | "_blank" | "_parent" | "_top" | \string
+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 =
+  element text:table-of-content-entry-template {
+    text-table-of-content-entry-template-attlist,
+    text-table-of-content-children*
+  }
+text-table-of-content-entry-template-attlist =
+  attribute text:outline-level { positiveInteger }
+  & attribute text:style-name { styleNameRef }
+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-template-name-attlist =
+  attribute text:display {
+    "full" | "path" | "name" | "name-and-extension" | "area" | "title"
+  }?
+text-time-attlist =
+  (common-field-fixed-attlist & common-field-data-style-name-attlist)
+  & attribute text:time-value { timeOrDateTime }?
+  & attribute text:time-adjust { duration }?
+text-toc-mark-start-attrs = text-id, text-outline-level
+text-tracked-changes =
+  element text:tracked-changes {
+    text-tracked-changes-attr, text-changed-region*
+  }?
+text-tracked-changes-attr = attribute text:track-changes { boolean }?
+text-user-field-decl =
+  element text:user-field-decl {
+    common-field-name-attlist,
+    common-field-formula-attlist?,
+    common-value-and-type-attlist
+  }
+text-user-index =
+  element text:user-index {
+    common-section-attlist, text-user-index-source, text-index-body
+  }
+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-index-entry-link-start
+     | text-index-entry-link-end
+       # https://issues.oasis-open.org/browse/OFFICE-3941
+       )*
+  }
+text-user-index-entry-template-attrs =
+  attribute text:outline-level { positiveInteger }
+  & attribute text:style-name { styleNameRef }
+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-variable-decl =
+  element text:variable-decl {
+    common-field-name-attlist, common-value-type-attlist
+  }
+textEncoding = xsd:string { pattern = "[A-Za-z][A-Za-z0-9._\-]*" }
+time = xsd:time
+timeOrDateTime = xsd:time | xsd:dateTime
+types = "submit" | "reset" | "push" | "url"
 valueType =
   "float"
   | "time"
@@ -6257,24 +6397,18 @@ valueType =
   | "currency"
   | "boolean"
   | "string"
-points =
-  xsd:string { pattern = "-?[0-9]+,-?[0-9]+([ ]+-?[0-9]+,-?[0-9]+)*" }
-pathData = xsd:string
+variableName = 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 }
-  }*
+vertBackPos = "top" | "center" | "bottom"
+xforms-bind-attlist = attribute xforms:bind { \string }?
+xforms-model = element xforms:model { anyAttListOrElements }
+xml-id = attribute xml:id { ID }
+zeroToHundredPercent =
+  xsd:string {
+    pattern = "([0-9]?[0-9](\.[0-9]*)?|100(\.0*)?|\.[0-9]+)%"
+  }
+zeroToOneDecimal = xsd:decimal { minInclusive = "0" maxInclusive = "1" }
diff --git a/etc/schema/schemas.xml b/etc/schema/schemas.xml
index f1e0ed7..3e6ed7b 100644
--- a/etc/schema/schemas.xml
+++ b/etc/schema/schemas.xml
@@ -1,7 +1,12 @@
 <?xml version="1.0"?>
 <locatingRules xmlns="http://thaiopensource.com/ns/locating-rules/1.0";>
+  <namespace ns="urn:oasis:names:tc:opendocument:xmlns:office:1.0" 
typeId="LibreOffice"/>
+  <namespace 
ns="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0" 
typeId="LibreOffice"/>
+  <namespace 
ns="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" 
typeId="LibreOffice"/>
+  <namespace ns="urn:oasis:names:tc:opendocument:xmlns:manifest:1.0" 
typeId="OpenDocument Manifest"/>
+
   <documentElement prefix="office" typeId="OpenDocument"/>
   <documentElement prefix="manifest" localName="manifest" typeId="OpenDocument 
Manifest"/>
-  <typeId id="OpenDocument" uri="od-schema-v1.2-os.rnc"/>
+  <typeId id="LibreOffice" uri="OpenDocument-schema-v1.3+libreoffice.rnc"/>
   <typeId id="OpenDocument Manifest" uri="od-manifest-schema-v1.2-os.rnc"/>
 </locatingRules>
diff --git a/lisp/org-compat.el b/lisp/org-compat.el
index 426f607..ff992f3 100644
--- a/lisp/org-compat.el
+++ b/lisp/org-compat.el
@@ -1175,8 +1175,8 @@ key."
     ((guard (not (lookup-key calendar-mode-map "c")))
      (local-set-key "c" #'org-calendar-goto-agenda))
     (_ nil))
-  (unless (and (boundp 'org-agenda-diary-file)
-              (eq org-agenda-diary-file 'diary-file))
+  (when (and (boundp 'org-agenda-diary-file)
+            (not (eq org-agenda-diary-file 'diary-file)))
     (local-set-key org-calendar-insert-diary-entry-key
                   #'org-agenda-diary-entry)))
 



reply via email to

[Prev in Thread] Current Thread [Next in Thread]