unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
* [ELPA Submission] OpenDocumentText exporter for Orgmode
@ 2011-06-13 20:25 Jambunathan K
  2011-06-14 15:50 ` Chong Yidong
  0 siblings, 1 reply; 35+ messages in thread
From: Jambunathan K @ 2011-06-13 20:25 UTC (permalink / raw)
  To: emacs-devel


I would like to submit the "OpenDocumentText exporter for Orgmode" - the
org-odt-YYYYMMDD.tar for inclusion in http://elpa.gnu.org/packages. 

The URL for `package-archives' is:
http://repo.or.cz/w/org-mode/org-jambu.git/blob_plain/HEAD:/packages/

A quick response to the immediately asked questions:

1. The package adds support for exporting Orgmode files to
   OpenDocumentText format. [1]
2. It is a "friendly fork" (or a "feature branch") of Orgmode and is not
   part of official Orgmode Repo (yet). 
3. I am the sole author of all the changes introduced by this package. I
   am a signed contributor to Emacs and my copyright assignment number
   is #618390 [2].
4. The package bundles rnc files for OpenDocument format [3]. I need
   help from Emacs developers on what would be the right way to include
   the copyright notice. I would appreciate if someone could offer me a
   helping hand here.

Jambunathan K.

Footnotes: 

[1] The README can be accessed here:
http://repo.or.cz/w/org-mode/org-jambu.git/blob_plain/HEAD:/packages/README.html
[2] There is one tiny change submitted by Sean O Halpin.
[3] http://lists.gnu.org/archive/html/emacs-devel/2011-03/msg00857.html

-- 



^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: [ELPA Submission] OpenDocumentText exporter for Orgmode
  2011-06-13 20:25 [ELPA Submission] OpenDocumentText exporter for Orgmode Jambunathan K
@ 2011-06-14 15:50 ` Chong Yidong
  2011-06-14 20:05   ` Jambunathan K
  0 siblings, 1 reply; 35+ messages in thread
From: Chong Yidong @ 2011-06-14 15:50 UTC (permalink / raw)
  To: emacs-devel

Jambunathan K <kjambunathan@gmail.com> writes:

> I would like to submit the "OpenDocumentText exporter for Orgmode" - the
> org-odt-YYYYMMDD.tar for inclusion in http://elpa.gnu.org/packages.
>
> The URL for `package-archives' is:
> http://repo.or.cz/w/org-mode/org-jambu.git/blob_plain/HEAD:/packages/

The link is broken.

> 2. It is a "friendly fork" (or a "feature branch") of Orgmode and is not
>    part of official Orgmode Repo (yet).

Does it really have to duplicate the entire Org mode tree?  Why can't
the "OpenDocumentText exporter" functionality be a single Org module?

Also, could you explain in more detail whether/when this work is slated
to become part of org-mode?  I'm not sure it makes sense to include it
as a separate package, if it's soon going to be available via the Org
daily package (or when Org is synched to the Emacs repository) anyway.

> 4. The package bundles rnc files for OpenDocument format [3]. I need
>    help from Emacs developers on what would be the right way to include
>    the copyright notice. I would appreciate if someone could offer me a
>    helping hand here.

See etc/schema/README.



^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: [ELPA Submission] OpenDocumentText exporter for Orgmode
  2011-06-14 15:50 ` Chong Yidong
@ 2011-06-14 20:05   ` Jambunathan K
  2011-06-14 21:09     ` Jambunathan K
                       ` (2 more replies)
  0 siblings, 3 replies; 35+ messages in thread
From: Jambunathan K @ 2011-06-14 20:05 UTC (permalink / raw)
  To: Chong Yidong; +Cc: emacs-devel

[-- Attachment #1: Type: text/plain, Size: 4393 bytes --]

Chong Yidong <cyd@stupidchicken.com> writes:

> Jambunathan K <kjambunathan@gmail.com> writes:
>
>> I would like to submit the "OpenDocumentText exporter for Orgmode" - the
>> org-odt-YYYYMMDD.tar for inclusion in http://elpa.gnu.org/packages.
>>
>> The URL for `package-archives' is:
>> http://repo.or.cz/w/org-mode/org-jambu.git/blob_plain/HEAD:/packages/
>
> The link is broken.

No it is not, it only seems so. The server (which is not a webserver, so
to speak) is merely refusing to list the contents of the directory.

Configure the package-archives with the above URL and the package will
be visible.

Here is the link to archive-contents and the tar file:
http://repo.or.cz/w/org-mode/org-jambu.git/blob_plain/HEAD:/packages/archive-contentshttp://repo.or.cz/w/org-mode/org-jambu.git/blob_plain/HEAD:/packages/org-odt-20110613.tar

Did you checkout README.html?
http://repo.or.cz/w/org-mode/org-jambu.git/blob_plain/HEAD:/packages/README.html

>
>> 2. It is a "friendly fork" (or a "feature branch") of Orgmode and is not
>>    part of official Orgmode Repo (yet).
>
> Does it really have to duplicate the entire Org mode tree?  

Doesn't have to.

> Why can't the "OpenDocumentText exporter" functionality be a single
> Org module?

There are three approaches that I can think of:

1. Roll out my own.

2. I can include *only* the modified and new files as a multi-file
   package and make org-odt dependent on a base version of org.

3. I can distribute my changes as plain old diff against a well-known
   revision of the parent module say org-20110613.tar.

Case 1 => KISS. Self-contained and guaranteed to be consistent. No need
to track dependencies.

Case 2 => In this scenario, at the least, the package manager has to
assure me that org-odt-YYYYMMDD.tar is overlaid on top of the parent
package i.e., at the run time the feature `org-html' is *always*
provided by org-odt package and not by org package.

Case 3 => This scenario sounds like an ugly hack. In this case, the
package server might have to maintain not only the latest
org-YYYYMMDD.tar package but also the historical org-20110613.tar in
it's archives.

Do you see any issues with Case 2?

> Also, could you explain in more detail whether/when this work is
> slated to become part of org-mode?  

AFAICS, Bastien is in favor of inclusion (pending a review, ofcourse). I
believe that the only thing that is slowing things down is the Life
itself with it's non-negotiable demands.

It is close to 3 months since I proposed a formal patch. I am simply
impatient and restless.

> I'm not sure it makes sense to include it as a separate package, if
> it's soon going to be available via the Org daily package (or when Org
> is synched to the Emacs repository) anyway.

There is a strong case for package installers. It attracts more users
and thereby eyeballs. Newbie users are averse to using git. Furthermore,
even serious users rely on installers or stable released before diving
deep.

More importantly, I want that my little work to be available for
posterity and not be lost in the corridors of frail memories or fickle
servers.

>
> Also, could you explain in more detail whether/when this work is slated
> to become part of org-mode?  I'm not sure it makes sense to include it
> as a separate package, if it's soon going to be available via the Org
> daily package (or when Org is synched to the Emacs repository) anyway.
>
>> 4. The package bundles rnc files for OpenDocument format [3]. I need
>>    help from Emacs developers on what would be the right way to include
>>    the copyright notice. I would appreciate if someone could offer me a
>>    helping hand here.
>
> See etc/schema/README.

I need help on two fronts:

1. There is are different schema files for 1.1 and 1.2 formats. Can I
   include them both? How should my schema locating file be composed in
   that case.

2. IANAL and I am anxious to DTRT.

   Does it suffice if I just include the copyright info from the rng
   file or do I also need to copy copyright info from the formal
   spec. (See attachments) If both 1.1 and 1.2 schemas is under included
   do I need to include for each of the instances.

The spec is here:
http://docs.oasis-open.org/office/v1.2/OpenDocument-v1.2.html

RNG file is here:
http://docs.oasis-open.org/office/v1.2/cs01/OpenDocument-v1.2-cs01-schema.rng

Is there anything else I need to do?

Jambunathan K.


[-- Attachment #2: CopyrightNotice-From-RNG-File.txt --]
[-- Type: text/plain, Size: 1667 bytes --]

Open Document Format for Office Applications (OpenDocument) Version 1.2
Committee Specification (CS) 01, 17 March 2011
Relax-NG Schema

Copyright (c) OASIS Open 2002-2011. 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.  

[-- Attachment #3: CopyrightNotice-From-TheSpecification.txt --]
[-- Type: text/plain, Size: 4047 bytes --]

Copyright © OASIS Open 2002–2011. 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.

OASIS requests that any OASIS Party or any other party that believes
it has patent claims that would necessarily be infringed by
implementations of this OASIS Committee Specification or OASIS
Standard, to notify OASIS TC Administrator and provide an indication
of its willingness to grant patent licenses to such patent claims in a
manner consistent with the IPR Mode of the OASIS Technical Committee
that produced this specification.

OASIS invites any party to contact the OASIS TC Administrator if it is
aware of a claim of ownership of any patent claims that would
necessarily be infringed by implementations of this specification by a
patent holder that is not willing to provide a license to such patent
claims in a manner consistent with the IPR Mode of the OASIS Technical
Committee that produced this specification. OASIS may include such
claims on its website, but disclaims any obligation to do so.

OASIS takes no position regarding the validity or scope of any
intellectual property or other rights that might be claimed to pertain
to the implementation or use of the technology described in this
document or the extent to which any license under such rights might or
might not be available; neither does it represent that it has made any
effort to identify any such rights. Information on OASIS' procedures
with respect to rights in any document or deliverable produced by an
OASIS Technical Committee can be found on the OASIS website. Copies of
claims of rights made available for publication and any assurances of
licenses to be made available, or the result of an attempt made to
obtain a general license or permission for the use of such proprietary
rights by implementers or users of this OASIS Committee Specification
or OASIS Standard, can be obtained from the OASIS TC
Administrator. OASIS makes no representation that any information or
list of intellectual property rights will at any time be complete, or
that any claims in such list are, in fact, Essential Claims.

The names "OASIS", “OpenDocument”, “Open Document Format”, and “ODF”
are trademarks of OASIS, the owner and developer of this
specification, and should be used only to refer to the organization
and its official outputs. OASIS welcomes reference to, and
implementation and use of, specifications, while reserving the right
to enforce its marks against misleading uses. Please see
http://www.oasis-open.org/who/trademark.php for above guidance.

[-- Attachment #4: Type: text/plain, Size: 5 bytes --]


-- 

^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: [ELPA Submission] OpenDocumentText exporter for Orgmode
  2011-06-14 20:05   ` Jambunathan K
@ 2011-06-14 21:09     ` Jambunathan K
  2011-06-18  3:15       ` Stefan Monnier
  2011-06-19 14:06     ` [PATCH] OpenDocument schema files Jambunathan K
  2011-06-24 16:01     ` [ELPA Submission] OpenDocumentText exporter for Orgmode Bastien
  2 siblings, 1 reply; 35+ messages in thread
From: Jambunathan K @ 2011-06-14 21:09 UTC (permalink / raw)
  To: Chong Yidong; +Cc: emacs-devel


> [snip]
>
> 2. I can include *only* the modified and new files as a multi-file
>    package and make org-odt dependent on a base version of org.
>
> [snip]
>
> Case 2 => In this scenario, at the least, the package manager has to
> assure me that org-odt-YYYYMMDD.tar is overlaid on top of the parent
> package i.e., at the run time the feature `org-html' is *always*
> provided by org-odt package and not by org package.
>
> [snip]
>
> Do you see any issues with Case 2?

I missed setting some context.

org-html.el is split in to a generic export driver and a html-specific
formatter. The changes are here big and diffused that a simple diff
would simply be not that helpful. (Currently both these modules reside
within org-html.el)

org-odt.el is dependent on the core driver that is part of org-html.el.

There are other tiny changes to org.el, org-footnote.el and org-exp.el.

Jambunathan K. 



^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: [ELPA Submission] OpenDocumentText exporter for Orgmode
  2011-06-14 21:09     ` Jambunathan K
@ 2011-06-18  3:15       ` Stefan Monnier
  2011-06-18  5:22         ` Jambunathan K
  0 siblings, 1 reply; 35+ messages in thread
From: Stefan Monnier @ 2011-06-18  3:15 UTC (permalink / raw)
  To: Chong Yidong; +Cc: emacs-devel

> org-html.el is split in to a generic export driver and a html-specific
> formatter. The changes are here big and diffused that a simple diff
> would simply be not that helpful. (Currently both these modules reside
> within org-html.el)

> org-odt.el is dependent on the core driver that is part of org-html.el.

> There are other tiny changes to org.el, org-footnote.el and org-exp.el.

I suggest you divide your changes into a few patches you can push
independently which refactor the existing org code, with the end result
that your new org-odt.el doesn't need extra changes elsewhere.

Also, in order to speed things up, only submit one small patch at
a time, otherwise the maintainers will tend to be overwhelmed reviewing
a large patch and will let it linger for a long time.


        Stefan



^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: [ELPA Submission] OpenDocumentText exporter for Orgmode
  2011-06-18  3:15       ` Stefan Monnier
@ 2011-06-18  5:22         ` Jambunathan K
  2011-06-18 16:11           ` Chong Yidong
  2011-06-18 19:55           ` Stefan Monnier
  0 siblings, 2 replies; 35+ messages in thread
From: Jambunathan K @ 2011-06-18  5:22 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: Chong Yidong, emacs-devel

Stefan Monnier <monnier@iro.umontreal.ca> writes:

>> org-html.el is split in to a generic export driver and a html-specific
>> formatter. The changes are here big and diffused that a simple diff
>> would simply be not that helpful. (Currently both these modules reside
>> within org-html.el)
>
>> org-odt.el is dependent on the core driver that is part of org-html.el.
>
>> There are other tiny changes to org.el, org-footnote.el and org-exp.el.
>
> I suggest you divide your changes into a few patches you can push
> independently which refactor the existing org code, with the end result
> that your new org-odt.el doesn't need extra changes elsewhere.
>
> Also, in order to speed things up, only submit one small patch at
> a time, otherwise the maintainers will tend to be overwhelmed reviewing
> a large patch and will let it linger for a long time.

Ok. I think we will work out something.

I hope you would consider my request of having the org-odt tarball in
GNU archives. The advantage would be that more people could discover it
and test drive it.

Jambunathan K.

>
>
>         Stefan
>
>

-- 



^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: [ELPA Submission] OpenDocumentText exporter for Orgmode
  2011-06-18  5:22         ` Jambunathan K
@ 2011-06-18 16:11           ` Chong Yidong
  2011-06-18 19:55           ` Stefan Monnier
  1 sibling, 0 replies; 35+ messages in thread
From: Chong Yidong @ 2011-06-18 16:11 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: emacs-devel

Jambunathan K <kjambunathan@gmail.com> writes:

> Ok. I think we will work out something.
>
> I hope you would consider my request of having the org-odt tarball in
> GNU archives. The advantage would be that more people could discover it
> and test drive it.

I don't think it's a good fit.  If you isolate your changes into a small
package that depends on the Org mode daily (or just the version of Org
mode built into Emacs), I'd consider adding that package to the GNU
archive.  But I strongly recommend that you instead work with the Org
developers to get your code included directly to the Org repository.



^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: [ELPA Submission] OpenDocumentText exporter for Orgmode
  2011-06-18  5:22         ` Jambunathan K
  2011-06-18 16:11           ` Chong Yidong
@ 2011-06-18 19:55           ` Stefan Monnier
  2011-06-25 22:38             ` Jambunathan K
  1 sibling, 1 reply; 35+ messages in thread
From: Stefan Monnier @ 2011-06-18 19:55 UTC (permalink / raw)
  To: Chong Yidong; +Cc: emacs-devel

> I hope you would consider my request of having the org-odt tarball in
> GNU archives. The advantage would be that more people could discover it
> and test drive it.

I'm not sure what you mean by "the org-odt tarball" and "GNU archive".
I'll assume "GNU archive" doesn't mean the FSF's ftp archive, but the
GNU ELPA.

If by "org-odt tarball" you mean a tarball including org-odt.el plus
a bunch of files that already exist in Org but with some modifications,
then this is not going to fly.
If it's a bunch of files that do not override Org's own files, then
I don't forsee any problem.

So I'd urge you to work with the Org guys so as to get the needed
changes accepted quickly, and if adding the remaining file doesn't suit
them, we can definitely distribute it as a separate GNU ELPA package.


        Stefan



^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: [PATCH] OpenDocument schema files
  2011-06-14 20:05   ` Jambunathan K
  2011-06-14 21:09     ` Jambunathan K
@ 2011-06-19 14:06     ` Jambunathan K
  2011-06-19 14:19       ` Jambunathan K
                         ` (2 more replies)
  2011-06-24 16:01     ` [ELPA Submission] OpenDocumentText exporter for Orgmode Bastien
  2 siblings, 3 replies; 35+ messages in thread
From: Jambunathan K @ 2011-06-19 14:06 UTC (permalink / raw)
  To: Chong Yidong; +Cc: emacs-devel

[-- Attachment #1: Type: text/plain, Size: 1823 bytes --]

Jambunathan K <kjambunathan@gmail.com> writes:

> Chong Yidong <cyd@stupidchicken.com> writes:
>
>> Jambunathan K <kjambunathan@gmail.com> writes:
>>
>>> I would like to submit the "OpenDocumentText exporter for Orgmode" - the
>>> org-odt-YYYYMMDD.tar for inclusion in http://elpa.gnu.org/packages.
>>>
>>> The URL for `package-archives' is:
>>> http://repo.or.cz/w/org-mode/org-jambu.git/blob_plain/HEAD:/packages/
>>>
>>> [snip]
>>>
>>> 4. The package bundles rnc files for OpenDocument format [3]. I need
>>>    help from Emacs developers on what would be the right way to include
>>>    the copyright notice. I would appreciate if someone could offer me a
>>>    helping hand here.
>>
>> See etc/schema/README.
>
> I need help on two fronts:
>
> 1. There is are different schema files for 1.1 and 1.2 formats. Can I
>    include them both? How should my schema locating file be composed in
>    that case.
>

The attached patch containst only OpenDocument-v1.2-specific rnc files.

> 2. IANAL and I am anxious to DTRT.
>
>    Does it suffice if I just include the copyright info from the rng
>    file or do I also need to copy copyright info from the formal
>    spec. (See attachments) If both 1.1 and 1.2 schemas is under included
>    do I need to include for each of the instances.
>
> The spec is here:
> http://docs.oasis-open.org/office/v1.2/OpenDocument-v1.2.html
>
> RNG files are here:
> http://docs.oasis-open.org/office/v1.2/cs01/OpenDocument-v1.2-cs01-schema.rng
> http://docs.oasis-open.org/office/v1.2/cs01/OpenDocument-v1.2-cs01-manifest-schema.rng
>
> OASIS IPR policy is here:
> http://www.oasis-open.org/policies-guidelines/ipr

Hope I have DTRT. 

The attached diffs were created through non-version-controlled copies of
latest files. The date is in IST (UTC +5:30).

Hope the diffs are in order.


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: OpenDocument-v1.2.diff --]
[-- Type: text/x-patch, Size: 234922 bytes --]

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

[-- Attachment #3: Type: text/plain, Size: 5 bytes --]


-- 

^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: [PATCH] OpenDocument schema files
  2011-06-19 14:06     ` [PATCH] OpenDocument schema files Jambunathan K
@ 2011-06-19 14:19       ` Jambunathan K
  2011-06-19 16:23       ` Eli Zaretskii
  2011-06-19 16:23       ` Eli Zaretskii
  2 siblings, 0 replies; 35+ messages in thread
From: Jambunathan K @ 2011-06-19 14:19 UTC (permalink / raw)
  To: Chong Yidong; +Cc: emacs-devel

[-- Attachment #1: Type: text/plain, Size: 1975 bytes --]


Here comes the unit test instructions. (My bad! I should have attached
this with the PATCH)

0. Apply the previous patch

1. Open the attached hand-created test.odt file in archive mode (Note:
   .odt files are zip files)

2. You are likely to see a bunch of xml file as shown below.

--8<---------------cut here---------------start------------->8---
M Filemode      Length  Date         Time      File
- ----------  --------  -----------  --------  -----------------------
  [snip]
  -rw-rw-rw-      3008  19-Jun-2011  13:07:44  content.xml
  -rw-rw-rw-       532  19-Jun-2011  13:07:44  manifest.rdf
  -rw-rw-rw-     11100  19-Jun-2011  13:07:44  styles.xml
  -rw-rw-rw-      1127  19-Jun-2011  13:07:44  meta.xml
  [snip]
  -rwx------      8855  19-Jun-2011  18:40:04  settings.xml
  -rw-rw-rw-      1989  19-Jun-2011  13:07:44  META-INF/manifest.xml
- ----------  --------  -----------  --------  -----------------------
--8<---------------cut here---------------end--------------->8---

3. Visit those xml files in nxml-mode
4. Make sure auto-validation is on.

--8<---------------cut here---------------start------------->8---
(eval-after-load 'rng-nxml
  '(setq rng-nxml-auto-validate-flag t))
--8<---------------cut here---------------end--------------->8---

5. Use C-c C-s C-w or M-x rng-what-schema and ensure that the right
schemas are picked up for validation.

--8<---------------cut here---------------start------------->8---
Using schema c:/Program Files/emacs-24.0.50/etc/schema/OpenDocument-v1.2-cs01-schema.Using schema c:/Program Files/emacs-24.0.50/etc/schema/OpenDocument-v1.2-cs01-manifest-schema.rnc
--8<---------------cut here---------------end--------------->8---

6. Use C-c C-n or M-x rng-next-error and  ensure that things are OK.
   - Currently manifest.xml reports 

--8<---------------cut here---------------start------------->8---
      Missing attribute "manifest:version"
--8<---------------cut here---------------end--------------->8---


[-- Attachment #2: test.odt --]
[-- Type: application/zip, Size: 8832 bytes --]

[-- Attachment #3: Type: text/plain, Size: 17 bytes --]



Jambunathan K.

^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: [PATCH] OpenDocument schema files
  2011-06-19 14:06     ` [PATCH] OpenDocument schema files Jambunathan K
  2011-06-19 14:19       ` Jambunathan K
@ 2011-06-19 16:23       ` Eli Zaretskii
  2011-06-19 18:53         ` Jambunathan K
  2011-06-19 16:23       ` Eli Zaretskii
  2 siblings, 1 reply; 35+ messages in thread
From: Eli Zaretskii @ 2011-06-19 16:23 UTC (permalink / raw)
  To: Jambunathan K; +Cc: cyd, emacs-devel

> From: Jambunathan K <kjambunathan@gmail.com>
> Date: Sun, 19 Jun 2011 19:36:34 +0530
> Cc: emacs-devel@gnu.org
> 
> + 	* schema/OpenDocument-v1.2-cs01-schema.rnc: Added.
> + 	* schema/OpenDocument-v1.2-cs01-manifest-schema.rnc: Added.

The name of these two files will clash on 8+3 filesystems.  Please
rename one or both.  Thanks.



^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: [PATCH] OpenDocument schema files
  2011-06-19 14:06     ` [PATCH] OpenDocument schema files Jambunathan K
  2011-06-19 14:19       ` Jambunathan K
  2011-06-19 16:23       ` Eli Zaretskii
@ 2011-06-19 16:23       ` Eli Zaretskii
  2 siblings, 0 replies; 35+ messages in thread
From: Eli Zaretskii @ 2011-06-19 16:23 UTC (permalink / raw)
  To: Jambunathan K; +Cc: cyd, emacs-devel

> From: Jambunathan K <kjambunathan@gmail.com>
> Date: Sun, 19 Jun 2011 19:36:34 +0530
> Cc: emacs-devel@gnu.org
> 
> + 	* schema/OpenDocument-v1.2-cs01-schema.rnc: Added.
> + 	* schema/OpenDocument-v1.2-cs01-manifest-schema.rnc: Added.

The name of these two files will clash on 8+3 filesystems.  Please
rename one or both.  Thanks.



^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: [PATCH] OpenDocument schema files
  2011-06-19 16:23       ` Eli Zaretskii
@ 2011-06-19 18:53         ` Jambunathan K
  2011-07-12 12:27           ` Jambunathan K
  0 siblings, 1 reply; 35+ messages in thread
From: Jambunathan K @ 2011-06-19 18:53 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: cyd, emacs-devel

[-- Attachment #1: Type: text/plain, Size: 442 bytes --]

Eli Zaretskii <eliz@gnu.org> writes:

>> From: Jambunathan K <kjambunathan@gmail.com>
>> Date: Sun, 19 Jun 2011 19:36:34 +0530
>> Cc: emacs-devel@gnu.org
>> 
>> + 	* schema/OpenDocument-v1.2-cs01-schema.rnc: Added.
>> + 	* schema/OpenDocument-v1.2-cs01-manifest-schema.rnc: Added.
>
> The name of these two files will clash on 8+3 filesystems.  Please
> rename one or both.  Thanks.
>
>

Second attempt. See attached patch. 

Jambunathan K.


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: OpenDocument-v1.2-Attempt-2.diff --]
[-- Type: text/x-patch, Size: 234774 bytes --]

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

[-- Attachment #3: Type: text/plain, Size: 7 bytes --]




-- 

^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: [ELPA Submission] OpenDocumentText exporter for Orgmode
  2011-06-14 20:05   ` Jambunathan K
  2011-06-14 21:09     ` Jambunathan K
  2011-06-19 14:06     ` [PATCH] OpenDocument schema files Jambunathan K
@ 2011-06-24 16:01     ` Bastien
  2 siblings, 0 replies; 35+ messages in thread
From: Bastien @ 2011-06-24 16:01 UTC (permalink / raw)
  To: Chong Yidong; +Cc: emacs-devel

Hi Chong and Jambunathan,

Jambunathan K <kjambunathan@gmail.com> writes:

>> Also, could you explain in more detail whether/when this work is
>> slated to become part of org-mode?  
>
> AFAICS, Bastien is in favor of inclusion (pending a review, ofcourse). I
> believe that the only thing that is slowing things down is the Life
> itself with it's non-negotiable demands.

Here is the plan I suggest:

- For Org 7.6 (planned early next week): include org-odt.el and related
  files in Org/contrib/ - this directory doesn't go to Emacs trunk, but
  there go files we want hardcore Orgers to test and improve.

- For Org 7.7: work on integrating the ODT exporter to Org's core.

Apologies to Jambunathan for the delayed work on this.  I will now have
more time to make sure this change happens.

Also Stefan had a great suggestion: it's always easier to review small
patches, especially when life goes a bit crazy.

Thanks!

-- 
 Bastien



^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: [ELPA Submission] OpenDocumentText exporter for Orgmode
  2011-06-18 19:55           ` Stefan Monnier
@ 2011-06-25 22:38             ` Jambunathan K
  2011-07-01 18:09               ` Jambunathan K
  0 siblings, 1 reply; 35+ messages in thread
From: Jambunathan K @ 2011-06-25 22:38 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: Bastien Guerry, Chong Yidong, emacs-devel

Stefan Monnier <monnier@iro.umontreal.ca> writes:

>> I hope you would consider my request of having the org-odt tarball in
>> GNU archives. The advantage would be that more people could discover it
>> and test drive it.

> So I'd urge you to work with the Org guys so as to get the needed
> changes accepted quickly, and if adding the remaining file doesn't suit
> them, we can definitely distribute it as a separate GNU ELPA package.

Based on your feedback, I am making available a new
org-odt-20110626.tar. This package is dependent on org-20110626.tar or
later.

Update your package-archives as below

--8<---------------cut here---------------start------------->8---
(("gnu" . "http://elpa.gnu.org/packages/")
 ("jambu" . "http://repo.or.cz/w/org-mode/org-jambu.git/blob_plain/HEAD:/packages/"))--8<---------------cut here---------------end--------------->8---


The package has just 3 files:
1. org-lparse.el 
2. org-html.el
3. org-odt.el

All three files are new files.

As Bastien indicated in this thread, all the above files will NOT make
it to Emacs proper during the Org-7.6 merge. It may be part of Org-7.7
release which (going by Org's release cycle) is atleast another 3-6
months far away.

The intention of this tarball is to make the OpenDocumentExporter
available for wider audience. The package will disappear once the above
changes get incorporated in to the regular org-YYYYMMDD.tar builds.

README is here: 
http://repo.or.cz/w/org-mode/org-jambu.git/blob_plain/HEAD:/packages/README.html

Tarball is here:
http://repo.or.cz/w/org-mode/org-jambu.git/blob_plain/HEAD:/packages/org-odt-20110626.tar

Known Issues:
http://lists.gnu.org/archive/html/bug-gnu-emacs/2011-06/msg00330.html

Let me know what you think.

Jambunathan K.

-- 



^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: [ELPA Submission] OpenDocumentText exporter for Orgmode
  2011-06-25 22:38             ` Jambunathan K
@ 2011-07-01 18:09               ` Jambunathan K
  2011-07-04 15:52                 ` Stefan Monnier
  0 siblings, 1 reply; 35+ messages in thread
From: Jambunathan K @ 2011-07-01 18:09 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: Bastien Guerry, Chong Yidong, emacs-devel


Has a decision been made on this? May I know what has been decided?

If the odt exporter could be made available on GNU ELPA, I can update
the info doc of Orgmode-7.6 to contain a referece to
http://elpa.gnu.org/packages/.

If there are unanswered questions I would be happy to answer them.

Jambunathan K.

>

> Stefan Monnier <monnier@iro.umontreal.ca> writes:
>
>>> I hope you would consider my request of having the org-odt tarball in
>>> GNU archives. The advantage would be that more people could discover it
>>> and test drive it.
>
>> So I'd urge you to work with the Org guys so as to get the needed
>> changes accepted quickly, and if adding the remaining file doesn't suit
>> them, we can definitely distribute it as a separate GNU ELPA package.
>
> Based on your feedback, I am making available a new
> org-odt-20110626.tar. This package is dependent on org-20110626.tar or
> later.
>
> Update your package-archives as below
>
> --8<---------------cut here---------------start------------->8---
> (("gnu" . "http://elpa.gnu.org/packages/")
>  ("jambu"
> . "http://repo.or.cz/w/org-mode/org-jambu.git/blob_plain/HEAD:/packages/"))--8<---------------cut
> here---------------end--------------->8---
>
>
> The package has just 3 files:
> 1. org-lparse.el 
> 2. org-html.el
> 3. org-odt.el
>
> All three files are new files.
>

> As Bastien indicated in this thread, all the above files will NOT make
> it to Emacs proper during the Org-7.6 merge. It may be part of Org-7.7
> release which (going by Org's release cycle) is atleast another 3-6
> months far away.
>
> The intention of this tarball is to make the OpenDocumentExporter
> available for wider audience. The package will disappear once the above
> changes get incorporated in to the regular org-YYYYMMDD.tar builds.

> README is here: 
> http://repo.or.cz/w/org-mode/org-jambu.git/blob_plain/HEAD:/packages/README.html
>
> Tarball is here:
> http://repo.or.cz/w/org-mode/org-jambu.git/blob_plain/HEAD:/packages/org-odt-20110626.tar
>
> Known Issues:
> http://lists.gnu.org/archive/html/bug-gnu-emacs/2011-06/msg00330.html
>
> Let me know what you think.
>
> Jambunathan K.

-- 



^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: [ELPA Submission] OpenDocumentText exporter for Orgmode
  2011-07-01 18:09               ` Jambunathan K
@ 2011-07-04 15:52                 ` Stefan Monnier
  2011-07-05 10:11                   ` Bastien
  0 siblings, 1 reply; 35+ messages in thread
From: Stefan Monnier @ 2011-07-04 15:52 UTC (permalink / raw)
  To: emacs-devel

> Has a decision been made on this? May I know what has been decided?

As I had said before, such a tar file is perfectly fine, so feel free to
install it in the GNU ELPA (tho it seems you don't have the required access
rights, so could someone else do that?).

OTOH if it'll be included in Org-7.7 (likely to be released in GNU ELPA
before Emacs-24.1 gets released), I don't know how important it is to
include it in GNU ELPA now.


        Stefan



^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: [ELPA Submission] OpenDocumentText exporter for Orgmode
  2011-07-04 15:52                 ` Stefan Monnier
@ 2011-07-05 10:11                   ` Bastien
  2011-07-05 21:05                     ` Richard Stallman
  0 siblings, 1 reply; 35+ messages in thread
From: Bastien @ 2011-07-05 10:11 UTC (permalink / raw)
  To: Stefan Monnier, Jambunathan K.; +Cc: emacs-devel

Stefan Monnier <monnier@iro.umontreal.ca> writes:

>> Has a decision been made on this? May I know what has been decided?
>
> As I had said before, such a tar file is perfectly fine, so feel free to
> install it in the GNU ELPA (tho it seems you don't have the required access
> rights, so could someone else do that?).

I can take care of this.

Jambunathan, can you (privately) send me the relevant files I need to
add to ELPA?

> OTOH if it'll be included in Org-7.7 (likely to be released in GNU ELPA
> before Emacs-24.1 gets released), I don't know how important it is to
> include it in GNU ELPA now.

IMHO, there is no harm in adding it now to ELPA and removing it later,
when Org 7.7 makes its way to Emacs.

-- 
 Bastien



^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: [ELPA Submission] OpenDocumentText exporter for Orgmode
  2011-07-05 10:11                   ` Bastien
@ 2011-07-05 21:05                     ` Richard Stallman
  2011-07-08  9:52                       ` Bastien
  0 siblings, 1 reply; 35+ messages in thread
From: Richard Stallman @ 2011-07-05 21:05 UTC (permalink / raw)
  To: Bastien; +Cc: emacs-devel, monnier, kjambunathan

    >
    > As I had said before, such a tar file is perfectly fine, so feel free to
    > install it in the GNU ELPA (tho it seems you don't have the required access
    > rights, so could someone else do that?).

    I can take care of this.

    Jambunathan, can you (privately) send me the relevant files I need to
    add to ELPA?

Is this an instance of confusing "GNU ELPA" and "ELPA"?
It looks that way to me, but I can't be sure.


-- 
Dr Richard Stallman
President, Free Software Foundation
51 Franklin St
Boston MA 02110
USA
www.fsf.org  www.gnu.org
Skype: No way! That's nonfree (freedom-denying) software.
  Use free telephony http://directory.fsf.org/category/tel/



^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: [ELPA Submission] OpenDocumentText exporter for Orgmode
  2011-07-05 21:05                     ` Richard Stallman
@ 2011-07-08  9:52                       ` Bastien
  2011-07-08 18:31                         ` Richard Stallman
  0 siblings, 1 reply; 35+ messages in thread
From: Bastien @ 2011-07-08  9:52 UTC (permalink / raw)
  To: rms; +Cc: emacs-devel, monnier, kjambunathan

Richard Stallman <rms@gnu.org> writes:

>     >
>     > As I had said before, such a tar file is perfectly fine, so feel free to
>     > install it in the GNU ELPA (tho it seems you don't have the required access
>     > rights, so could someone else do that?).
>
>     I can take care of this.
>
>     Jambunathan, can you (privately) send me the relevant files I need to
>     add to ELPA?
>
> Is this an instance of confusing "GNU ELPA" and "ELPA"?
> It looks that way to me, but I can't be sure.

I meant "GNU ELPA".

-- 
 Bastien



^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: [ELPA Submission] OpenDocumentText exporter for Orgmode
  2011-07-08  9:52                       ` Bastien
@ 2011-07-08 18:31                         ` Richard Stallman
  2011-07-08 18:38                           ` Bastien
  2011-07-08 18:59                           ` Stefan Monnier
  0 siblings, 2 replies; 35+ messages in thread
From: Richard Stallman @ 2011-07-08 18:31 UTC (permalink / raw)
  To: Bastien; +Cc: kjambunathan, monnier, emacs-devel

    >     Jambunathan, can you (privately) send me the relevant files I need to
    >     add to ELPA?
    >
    > Is this an instance of confusing "GNU ELPA" and "ELPA"?
    > It looks that way to me, but I can't be sure.

    I meant "GNU ELPA".

I thought so.  Thus, this is another instance of a person
who uses this list and is confused anyway.

Stefan, isn't this enough to convince you to take steps
to eliminate the confusion?

-- 
Dr Richard Stallman
President, Free Software Foundation
51 Franklin St
Boston MA 02110
USA
www.fsf.org  www.gnu.org
Skype: No way! That's nonfree (freedom-denying) software.
  Use free telephony http://directory.fsf.org/category/tel/



^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: [ELPA Submission] OpenDocumentText exporter for Orgmode
  2011-07-08 18:31                         ` Richard Stallman
@ 2011-07-08 18:38                           ` Bastien
  2011-07-08 18:59                           ` Stefan Monnier
  1 sibling, 0 replies; 35+ messages in thread
From: Bastien @ 2011-07-08 18:38 UTC (permalink / raw)
  To: rms; +Cc: kjambunathan, monnier, emacs-devel

Richard Stallman <rms@gnu.org> writes:

>     >     Jambunathan, can you (privately) send me the relevant files I need to
>     >     add to ELPA?
>     >
>     > Is this an instance of confusing "GNU ELPA" and "ELPA"?
>     > It looks that way to me, but I can't be sure.
>
>     I meant "GNU ELPA".
>
> I thought so.  Thus, this is another instance of a person
> who uses this list and is confused anyway.

Well, meaning is always contextual.  I used "ELPA" for "GNU ELPA"
because "GNU ELPA" was in Stefan's quoted text -- so there was no
possible confusion here.

But I agree there can be a confusion in other contexts.

-- 
 Bastien



^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: [ELPA Submission] OpenDocumentText exporter for Orgmode
  2011-07-08 18:31                         ` Richard Stallman
  2011-07-08 18:38                           ` Bastien
@ 2011-07-08 18:59                           ` Stefan Monnier
  2011-07-09  1:02                             ` Richard Stallman
  1 sibling, 1 reply; 35+ messages in thread
From: Stefan Monnier @ 2011-07-08 18:59 UTC (permalink / raw)
  To: rms; +Cc: Bastien, kjambunathan, emacs-devel

>>> Jambunathan, can you (privately) send me the relevant files I need to
>>> add to ELPA?
>> Is this an instance of confusing "GNU ELPA" and "ELPA"?
>> It looks that way to me, but I can't be sure.
>     I meant "GNU ELPA".
> I thought so.  Thus, this is another instance of a person
> who uses this list and is confused anyway.

I don't see any confusion.  He clearly knows which ELPA he's talking
about, and in this context it was indeed very clear which ELPA
was meant.

> Stefan, isn't this enough to convince you to take steps
> to eliminate the confusion?

No.


        Stefan



^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: [ELPA Submission] OpenDocumentText exporter for Orgmode
  2011-07-08 18:59                           ` Stefan Monnier
@ 2011-07-09  1:02                             ` Richard Stallman
  2011-07-09  2:41                               ` Chong Yidong
  2011-07-09  3:05                               ` Jambunathan K
  0 siblings, 2 replies; 35+ messages in thread
From: Richard Stallman @ 2011-07-09  1:02 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: bzg, kjambunathan, emacs-devel

    >>> Jambunathan, can you (privately) send me the relevant files I need to
    >>> add to ELPA?
    >> Is this an instance of confusing "GNU ELPA" and "ELPA"?
    >> It looks that way to me, but I can't be sure.
    >     I meant "GNU ELPA".
    > I thought so.  Thus, this is another instance of a person
    > who uses this list and is confused anyway.

    I don't see any confusion.  He clearly knows which ELPA he's talking
    about, and in this context it was indeed very clear which ELPA
    was meant.

He meant GNU ELPA but he said the name of Tom's archive.
You could tell from the context which one he meant,
but if you need to tell from the context, that is proof
that the names are not clear.



-- 
Dr Richard Stallman
President, Free Software Foundation
51 Franklin St
Boston MA 02110
USA
www.fsf.org  www.gnu.org
Skype: No way! That's nonfree (freedom-denying) software.
  Use free telephony http://directory.fsf.org/category/tel/



^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: [ELPA Submission] OpenDocumentText exporter for Orgmode
  2011-07-09  1:02                             ` Richard Stallman
@ 2011-07-09  2:41                               ` Chong Yidong
  2011-07-09 14:37                                 ` Richard Stallman
  2011-07-09 19:57                                 ` PJ Weisberg
  2011-07-09  3:05                               ` Jambunathan K
  1 sibling, 2 replies; 35+ messages in thread
From: Chong Yidong @ 2011-07-09  2:41 UTC (permalink / raw)
  To: rms; +Cc: bzg, emacs-devel, Stefan Monnier, kjambunathan

Richard Stallman <rms@gnu.org> writes:

> He meant GNU ELPA but he said the name of Tom's archive.  You could
> tell from the context which one he meant, but if you need to tell from
> the context, that is proof that the names are not clear.

All the other alternatives are lousy; that's life.



^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: [ELPA Submission] OpenDocumentText exporter for Orgmode
  2011-07-09  1:02                             ` Richard Stallman
  2011-07-09  2:41                               ` Chong Yidong
@ 2011-07-09  3:05                               ` Jambunathan K
  2011-07-09 14:37                                 ` Richard Stallman
  1 sibling, 1 reply; 35+ messages in thread
From: Jambunathan K @ 2011-07-09  3:05 UTC (permalink / raw)
  To: rms; +Cc: bzg, Stefan Monnier, emacs-devel


I think it would be a good idea to capture the package admission/purging
policies of "GNU ELPA" (GNU/ELPA?) in a publicly accessible manner at
http://elpa.gnu.org landing page or http://elpa.gnu.org/packages.

Let a note be added in BOLD letters saying that Emacs official archives
should always be referred to fully qualfied as "GNU ELPA" in much the
same way that GNU/Linux is referred to.

Let's not beat Bastien even after he has unequivocally stated his
intent.

Jambunathan K.






^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: [ELPA Submission] OpenDocumentText exporter for Orgmode
  2011-07-09  2:41                               ` Chong Yidong
@ 2011-07-09 14:37                                 ` Richard Stallman
  2011-07-09 18:31                                   ` Chong Yidong
  2011-07-09 19:57                                 ` PJ Weisberg
  1 sibling, 1 reply; 35+ messages in thread
From: Richard Stallman @ 2011-07-09 14:37 UTC (permalink / raw)
  To: Chong Yidong; +Cc: bzg, emacs-devel, monnier, kjambunathan

    > He meant GNU ELPA but he said the name of Tom's archive.  You could
    > tell from the context which one he meant, but if you need to tell from
    > the context, that is proof that the names are not clear.

    All the other alternatives are lousy; that's life.

Several good alternatives have been suggested here,
including REL and REEL.

Do you have any objective reasons to reject them?

-- 
Dr Richard Stallman
President, Free Software Foundation
51 Franklin St
Boston MA 02110
USA
www.fsf.org  www.gnu.org
Skype: No way! That's nonfree (freedom-denying) software.
  Use free telephony http://directory.fsf.org/category/tel/



^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: [ELPA Submission] OpenDocumentText exporter for Orgmode
  2011-07-09  3:05                               ` Jambunathan K
@ 2011-07-09 14:37                                 ` Richard Stallman
  0 siblings, 0 replies; 35+ messages in thread
From: Richard Stallman @ 2011-07-09 14:37 UTC (permalink / raw)
  To: Jambunathan K; +Cc: bzg, monnier, emacs-devel

    Let's not beat Bastien even after he has unequivocally stated his
    intent.

I don't think anyone means to criticize Bastien.
I cited his message to show the general tendency to confusion
caused by these similar names.

-- 
Dr Richard Stallman
President, Free Software Foundation
51 Franklin St
Boston MA 02110
USA
www.fsf.org  www.gnu.org
Skype: No way! That's nonfree (freedom-denying) software.
  Use free telephony http://directory.fsf.org/category/tel/



^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: [ELPA Submission] OpenDocumentText exporter for Orgmode
  2011-07-09 14:37                                 ` Richard Stallman
@ 2011-07-09 18:31                                   ` Chong Yidong
  2011-07-10  0:40                                     ` Richard Stallman
  0 siblings, 1 reply; 35+ messages in thread
From: Chong Yidong @ 2011-07-09 18:31 UTC (permalink / raw)
  To: rms; +Cc: bzg, emacs-devel, monnier, kjambunathan

Richard Stallman <rms@gnu.org> writes:

>     > He meant GNU ELPA but he said the name of Tom's archive.  You could
>     > tell from the context which one he meant, but if you need to tell from
>     > the context, that is proof that the names are not clear.
>
>     All the other alternatives are lousy; that's life.
>
> Several good alternatives have been suggested here,
> including REL and REEL.
>
> Do you have any objective reasons to reject them?

As I explained in a previous email, "Emacs Lisp Package Archive" is the
natural name to use when referring to archives compatible with
package.el, which internally refers to `packages' and `archives' in its
many functions, variables, and documentation; nor is it reasonable to
rename all these functions and variables, because it is good to maintain
compatibility with existing users of Tom's original package.el.

Given that ELPA is the natural term for archives compatible with
package.el, it does not make sense for us to name our archive something
completely different---and less descriptive.



^ permalink raw reply	[flat|nested] 35+ messages in thread

* [ELPA Submission] OpenDocumentText exporter for Orgmode
  2011-07-09  2:41                               ` Chong Yidong
  2011-07-09 14:37                                 ` Richard Stallman
@ 2011-07-09 19:57                                 ` PJ Weisberg
  1 sibling, 0 replies; 35+ messages in thread
From: PJ Weisberg @ 2011-07-09 19:57 UTC (permalink / raw)
  To: Chong Yidong
  Cc: bzg@altern.org, kjambunathan@gmail.com, rms@gnu.org,
	Stefan Monnier, emacs-devel@gnu.org

On Friday, July 8, 2011, Chong Yidong <cyd@stupidchicken.com> wrote:
> Richard Stallman <rms@gnu.org> writes:
>
>> He meant GNU ELPA but he said the name of Tom's archive.  You could
>> tell from the context which one he meant, but if you need to tell from
>> the context, that is proof that the names are not clear.
>
> All the other alternatives are lousy; that's life.

I have a feeling that not too long after Emacs 24 ships with support
for GNU ELPA built in, people will be calling them "elpa" and "Tom's
original elpa".

GNU ELPA, Tom's ELPA, and Marmalade (http://marmalade-repo.org/) all
seem to be instances of the same type of thing.  I don't know what you
would call that thing, other than an "Emacs-lisp package archive".

-- 

-PJ



^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: [ELPA Submission] OpenDocumentText exporter for Orgmode
  2011-07-09 18:31                                   ` Chong Yidong
@ 2011-07-10  0:40                                     ` Richard Stallman
  2011-07-11  4:18                                       ` Stefan Monnier
  0 siblings, 1 reply; 35+ messages in thread
From: Richard Stallman @ 2011-07-10  0:40 UTC (permalink / raw)
  To: Chong Yidong; +Cc: bzg, emacs-devel, monnier, kjambunathan

    Given that ELPA is the natural term for archives compatible with
    package.el, it does not make sense for us to name our archive something
    completely different---and less descriptive.

There are many natural generic terms for such archives.
ELPA has the problem of being the name of one of them
which is not ours.

If Tom were to rename his to TELPA, the problem would go away.
Would you like to join me in asking him to do this?


-- 
Dr Richard Stallman
President, Free Software Foundation
51 Franklin St
Boston MA 02110
USA
www.fsf.org  www.gnu.org
Skype: No way! That's nonfree (freedom-denying) software.
  Use free telephony http://directory.fsf.org/category/tel/



^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: [ELPA Submission] OpenDocumentText exporter for Orgmode
  2011-07-10  0:40                                     ` Richard Stallman
@ 2011-07-11  4:18                                       ` Stefan Monnier
  2011-07-11 15:19                                         ` Richard Stallman
  0 siblings, 1 reply; 35+ messages in thread
From: Stefan Monnier @ 2011-07-11  4:18 UTC (permalink / raw)
  To: rms; +Cc: bzg, Chong Yidong, kjambunathan, emacs-devel

> ELPA has the problem of being the name of one of them
> which is not ours.

ELPA was the name of the only one there was back when there was
only one.  Nowadays there are several (beside Tom's and GNU's).


        Stefan



^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: [ELPA Submission] OpenDocumentText exporter for Orgmode
  2011-07-11  4:18                                       ` Stefan Monnier
@ 2011-07-11 15:19                                         ` Richard Stallman
  0 siblings, 0 replies; 35+ messages in thread
From: Richard Stallman @ 2011-07-11 15:19 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: bzg, cyd, kjambunathan, emacs-devel

    ELPA was the name of the only one there was back when there was
    only one.  Nowadays there are several (beside Tom's and GNU's).

ELPA is a fine generic name, as long as it isn't also the name of
a specific one of them.

Has Tom stopped using just "ELPA" as the name of his?


-- 
Dr Richard Stallman
President, Free Software Foundation
51 Franklin St
Boston MA 02110
USA
www.fsf.org  www.gnu.org
Skype: No way! That's nonfree (freedom-denying) software.
  Use free telephony http://directory.fsf.org/category/tel/



^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: [PATCH] OpenDocument schema files
  2011-06-19 18:53         ` Jambunathan K
@ 2011-07-12 12:27           ` Jambunathan K
  2011-07-12 14:54             ` Bastien
  0 siblings, 1 reply; 35+ messages in thread
From: Jambunathan K @ 2011-07-12 12:27 UTC (permalink / raw)
  To: emacs-devel

Jambunathan K <kjambunathan@gmail.com> writes:

> Eli Zaretskii <eliz@gnu.org> writes:
>
>>> From: Jambunathan K <kjambunathan@gmail.com>
>>> Date: Sun, 19 Jun 2011 19:36:34 +0530
>>> Cc: emacs-devel@gnu.org
>>> 
>>> + 	* schema/OpenDocument-v1.2-cs01-schema.rnc: Added.
>>> + 	* schema/OpenDocument-v1.2-cs01-manifest-schema.rnc: Added.
>>
>> The name of these two files will clash on 8+3 filesystems.  Please
>> rename one or both.  Thanks.
>>
>>
>
> Second attempt. See attached patch. 

Ping.

Did anyone get a chance to review these changes closely? 

> Jambunathan K.

-- 



^ permalink raw reply	[flat|nested] 35+ messages in thread

* Re: [PATCH] OpenDocument schema files
  2011-07-12 12:27           ` Jambunathan K
@ 2011-07-12 14:54             ` Bastien
  0 siblings, 0 replies; 35+ messages in thread
From: Bastien @ 2011-07-12 14:54 UTC (permalink / raw)
  To: emacs-devel

Jambunathan K <kjambunathan@gmail.com> writes:

> Did anyone get a chance to review these changes closely? 

Stefan suggested to add this to GNU ELPA, I proposed to do it.

Can you send me the relevant files?

-- 
 Bastien



^ permalink raw reply	[flat|nested] 35+ messages in thread

end of thread, other threads:[~2011-07-12 14:54 UTC | newest]

Thread overview: 35+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-06-13 20:25 [ELPA Submission] OpenDocumentText exporter for Orgmode Jambunathan K
2011-06-14 15:50 ` Chong Yidong
2011-06-14 20:05   ` Jambunathan K
2011-06-14 21:09     ` Jambunathan K
2011-06-18  3:15       ` Stefan Monnier
2011-06-18  5:22         ` Jambunathan K
2011-06-18 16:11           ` Chong Yidong
2011-06-18 19:55           ` Stefan Monnier
2011-06-25 22:38             ` Jambunathan K
2011-07-01 18:09               ` Jambunathan K
2011-07-04 15:52                 ` Stefan Monnier
2011-07-05 10:11                   ` Bastien
2011-07-05 21:05                     ` Richard Stallman
2011-07-08  9:52                       ` Bastien
2011-07-08 18:31                         ` Richard Stallman
2011-07-08 18:38                           ` Bastien
2011-07-08 18:59                           ` Stefan Monnier
2011-07-09  1:02                             ` Richard Stallman
2011-07-09  2:41                               ` Chong Yidong
2011-07-09 14:37                                 ` Richard Stallman
2011-07-09 18:31                                   ` Chong Yidong
2011-07-10  0:40                                     ` Richard Stallman
2011-07-11  4:18                                       ` Stefan Monnier
2011-07-11 15:19                                         ` Richard Stallman
2011-07-09 19:57                                 ` PJ Weisberg
2011-07-09  3:05                               ` Jambunathan K
2011-07-09 14:37                                 ` Richard Stallman
2011-06-19 14:06     ` [PATCH] OpenDocument schema files Jambunathan K
2011-06-19 14:19       ` Jambunathan K
2011-06-19 16:23       ` Eli Zaretskii
2011-06-19 18:53         ` Jambunathan K
2011-07-12 12:27           ` Jambunathan K
2011-07-12 14:54             ` Bastien
2011-06-19 16:23       ` Eli Zaretskii
2011-06-24 16:01     ` [ELPA Submission] OpenDocumentText exporter for Orgmode Bastien

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).