Publishing

Publishing PageSeeder data to print, the Web or both

Microsoft Word docx Import Config

Overview

The word-import-config provides a way to modify the conversion handling of Word docx files to PSML. It is suitable for developers or technically-minded end-users. To change the file requires some familiarity with XML syntax and a solid understanding of Microsoft Word. Depending on the desired workflow, using a modified config will require elevated permission or very little permission.

The default version of the file is located here and can be accessed through the Toolbox option under the Dev tab. This requires System Admin rights.

/WEB-INF/template/default/document/docx/upload/word-import-config.xml

While not all properties of Word's docx file format are accommodated by the Import Config, there is ample processing capability within Microsoft Word itself. The areas that are best leveraged by the Import Config are the following:

  • hierarchical document structure – as expressed by Word heading levels, outline levels, sections, numbered lists and paragraphs.

  • semantics – captured in paragraph, character styles, list styles, table styles, bookmarks, document types and various IDs.

  • linking – although links can arguably be both structure and semantics, PageSeeder's unique linking capabilities are worth mentioning separately. The import config can process Word's cross references into PageSeeder XRefs, it will also build multi-level links from the references document to the component documents.

There are also aspects of Word documents that are not currently imported into PageSeeder. Anywhere the following markup is meaningful, search and replace it with something that the import config can process:

  • fonts / typefaces – good typography should always be applauded, but dependencies on operating systems, applications and devices combined with a spectrum of licensing options means that the only way to import typographical information is when it is attached to styles, not set directly.
    • style settings – be aware that the actual settings of any styles, such as font specifications, are not imported into PageSeeder, only the style name.
  • measurements – tab stops, margins, indents, column widths, line spacing, borders or the many other measurements in Word are not imported into PageSeeder. Exceptions include table widths and image size.
  • headers / footers – in the Word package, headers and footers are hard to reconcile with the rest of the document. If they have been used to represent structure in a document, move the header and footer into the body of the document before importing. 
  • macros – no Word macro code will work on PageSeeder. However, if macros are required when the document is exported, include them in the template. Be aware that some virus checkers or firewalls may be configured to block macro-enabled Word files, in which case the user may be required to manage the document extension.
  • content controls – where a forms-based user interface is required in PageSeeder, the templates must be created separately, not imported.
  • fields – some field data such as bookmarks and cross-references are automatically imported and some fields such as Index entries can be supported with additional configuration. However, by default the majority of Word field data are discarded. 
  • security – PageSeeder has a rich, role and group-based, permission model that provides different levels of access to files. These must be separately set through the PageSeeder interface, not read as part of the import process.

Using the Word Import Config file

To override the PageSeeder default config in PageSeeder, follow the steps below:

  1. Login to PageSeeder and select a project or group.
  2. Select the Developer Perspective from the top left of the page.
  3. To change the config for yourself ONLY click the Upload document icon and drop/browse a docx file. Click Options next to it, then Import/Preview and click Edit config. This is available to group managers only.
  4. To change the config for everyone in the project select Document config under the Dev menu and follow the steps below. This is available to project managers and administrators only.
  5. Click on the Publish configurations link at the top right of the page.
  6. Click create below word-import-config.xml under Media types.

 

Note

When editing this config file in PageSeeder pressing ctrl-space will display autocomplete options to make editing easier.

 

Note

For anyone that does not have Manager or Administrator permissions, the config file can be passed to PageSeeder by uploading a word-import-config.xml along with the docx document.

See Import Microsoft Word docx Ant task for further information.

Background

Commonly referred to as 'dock-ex', the format for storing Microsoft Word document is rich and comprehensive.  PSML, the format of PageSeeder documents, is deliberately designed to be simpler than docx without compromising the quality of the final document. This is accomplished by moving complexity out of the file format and into the PageSeeder development environment.

This shift makes the system easier to learn for end users and makes it easier to control for developers. That means developers don't have to spend as much time coding to prevent problems and more time coding features.  s users damaging their documents from doing things to their This makes both stakeholders more productive. more productive and much faster are getting started. By providing a well designed development environment, PageSeeder makes developers productive and innovative. However, in between users and developers are legacy documents. Processing legacy documents can require considerable attention and who is best placed to fix the documents (developers or users) is not always clear. 

The Word Import Config has been designed so that technically confident users can customize the and developers. 

However, before configuring the import function, it is important to understand how Word files work. 

  • the starting point for this is to become familiar with Microsoft's Open XML and Open Packaging Conventions . A handy tool for this is the OpenXML viewer for Google's Chrome browser. It is free to download from here .
  • secondly, it is important to understand how the Word files have been formatted regarding the consistency and comprehensiveness of styles  and other aspects of Word.

Once that information is understood, converting docx files to PageSeeder will be much easier.

Finally, nine times out of ten the best return on investment is to clean up the Word document in Word.

Configurable Components

For an in-progress additional document to this page, see  Word Import Config Schema.

This document covers the primary markup that is converted from Word. These components are as follows:

  • <split> – tells PageSeeder where to split the Word file into documents and editable fragments.
  • <lists> – configures how lists are handled.
  • <styles> – converts the implied semantics and structure of Word styles into PageSeeder instructions.

Note

Word style names in the import config refer to the style ID which is not the same as the style name that appears in the Word user interface. Style IDs are usually the same as the style name but with the spaces removed (e.g. name "List Number 2" has ID "ListNumber2").

Store – <split>

This element controls the point at which the Word file is split into component documents and within these where the content is split into editable fragments.  Splitting for both of these objects (documents and fragments) can be controlled by three different Word constructs: Sections Breaks, Outline Levels and Paragraph Styles.

<split>
    <!-- <main>...</main> --> 
    <document select="true">
      <!-- <sectionbreak select="evenPage" /> -->
      Values accepted: evenPage,oddPage,  -->
      <outlinelevel select="0" />
      <outlinelevel select="1" />
      <!-- Values accepted: outlineLevel[0-5], -->
      <wordstyle  select="Heading1" />
      <wordstyle  select="Heading2" />
      <!-- Values accepted: name of style available in word file, -->
    </document>
    <section select="true">     
      <!-- <sectionbreak select="evenPage" /> -->
      Values accepted: continuous, evenPage, oddPage,  -->
      <outlinelevel select="0" />
      <outlinelevel select="1" />
      <outlinelevel select="2" />
      <outlinelevel select="3" />      
      <!-- Values accepted: outlineLevel[0-5], -->
      <wordstyle  select="Heading1" />
      <wordstyle  select="Heading2" />
      <wordstyle  select="Heading3" />
      <wordstyle  select="Heading4" />
      <!-- Values accepted: name of style available in word file,  -->
    </section>
    <!-- <mathml/> -->
    <!-- <footnotes/> -->  
    <!-- <endnotes/> --> 
  </split>

The default values for the <split> element are printed in the example above.

Splitting a Word file into a references document plus component documents means that in the Import Config file, the @select attribute of the <document> element must be set as follows:

 <document select="true">

To split the content of the component documents into fragments means the @select attribute of <section> must be set as follows:

<section select="true">

Any other attribute value on either element will prevent the split rules from being processed.

After these decision have been made, the following markup in the docx file can be used to determine the transformation to PSML.

The document root

<main>

When importing a docx file, the root PSML file can be either a single file or it can be a a references document. The single PSML file is only appropriate for simple, small source documents. The options for this document can be set as follows:

<main>
  <type>references</type>
  <label>production,test</label>
</main>
  • <type> – determines the PSML document type.
  • <label> – will be the list of labels to be applied to that document

The title of the main PSML document is taken from the Word document title property (dc:title) if it exists, otherwise it is the filename without the extension.

<mathml>

This option will generate mathml files for any mathml objects that might exist inside of the word document.

<mathml select="true" 
        output="generate-files" 
        convert-to-mml="true"/>

The attributes for <mathml> are:

  • @select – to enable generation of mathml content, select must be set to "true", otherwise, mathml content will be ignored.
  • @output – If value is "generate-files" each mathml object will be placed in a separate file, under a mathml folder. If value is "generate-fragments", each mathml object will be placed in a fragment inside it's own document with the path mathml/mathml-[n].psml (requires pso-docx version 0.7.8 or later).
  • @convert-to-mml  – if "true", then mathml objects will be converted to the original math ml. If "false", the objects will retain the Office Open mathml syntax (always "true" for "generate-fragments" option).
<footnotes>

This option will generate footnote files for any footnotes referenced inside the Word document.

<footnotes select="true" 
           output="generate-files"/>

The attributes for <footnotes> are:

  • @select  "true" or "false"  To enable generation of footnote content, select must be set to "true", otherwise, footnotes content will be ignored.
  • @output – if "generate-files" is selected, each footnote reference will be placed in a separate file under footnotes folder. If "generate-fragments" is selected then each footnote will be placed in a fragment inside the footnotes/footnotes.psml file
<endnotes>

This option will generate endnote files for any endnotes referenced inside the Word document.

<endnotes select="true" 
           output="generate-files"/>

The options for endnotes are:

  • @select – to enable generation of endnote content, select must be set to "true", otherwise, endnotes content will be ignored.
  • @output – if "generate-files" is selected, each endnote reference will be placed in a separate file, under endnotes folder. If "generate-fragments" is selected each endnote will be placed in a fragment inside the endnotes/endnotes.psml file.

The component documents

Component documents are the nodes or leaves of references documents. The import process creates these through the <document> element in the import config.

<document>

If the value of @select="true" then the following options are supported:

<document    select="true"
    use-real-titles="true">

The title of each component PSML document is based on the first paragraph of it's content. It will use the numbering format applied to the paragraph style, plus the content of the paragraph, up to a maximum value of 249 characters.

  • @use-real-titles="true" – this option generates a filename for each component using the component document title above. The regular expression processing the filenames converts all special characters ([\W] to underscores and the resulting format is:
[Numbering format][Paragraph content].psml

Splitting a single Word document into multiple PSML documents on  import can be done with the options:

<sectionbreak>

Section Breaks  in the docx format can have the following values "evenPage", "oddPage", "continuous", "nextColumn" or "nextPage". These values are mirrored in the import-config, but using these to split a Word document requires a <sectionbreak> declaration for each. In the example below, both " evenPage" and " oddPage" are individually expressed.

<split>
    <document select="true">
      <sectionbreak select="evenPage" />
      <sectionbreak select="oddPage" />
    </document>
</split>
<outlinelevel>

This value is most often identified with Word's default heading levels 1-9, but outline levels can be applied to any Word style. When using <outlinelevel> to split, be careful of ambiguity or unexpected results if multiple styles share a level. The level is expressed as follows:

[0-5]

Also, be aware that while Word levels go up to nine (9), PageSeeder levels only go up to six (6), with zero (0) being the first level.

These have to be enumerated each time. Splitting at levels "0" and "1" levels requires the following:

<split>
    <document select="true">
      <outlinelevel select="0" />
      <outlinelevel select="1" />
    </document>
  </split>
<wordstyle>

For Word styles "Heading1" and "Heading2" to split the content on import requires the following:

<split>
    <document select="true">     
      <wordstyle  select="Heading1"  >
        <label>Private,Public</label>
        <type>contract</type>
        <level value="0"/>
      </wordstyle>
      <wordstyle  select="Heading2" />
    </document>
  </split>

Splitting with <wordstyle> is a special case. It will also accept the following <label>, <type> and <level> options:

  • <label> – applies labels to that specific document. The labels can be multiple and be in a comma separated list,
  • <type> – specifies the PSML document type,
  • <level> – indents the XRef in the references document. This controls the heading levels in the target document. 
manual splitting – <splitstyle>

Sometimes users will need to process documents that are simply not rich enough to meet the requirements. When this happens, it may be easier to manually designate where the document should split rather than use existing styles or structure. 

This is what "splittingStyle1" was designed for. Essentially this is non-standard, disposable style name with a specific role of marking where the document should be split. Through the import-config, It can be invoked as follows:

<split>
    <document select="true">     
      <splitstyle select="splittingStyle1"/>
    </document>
  </split>

<splitstyle> use cases could be splitting a document after every ten pages. Or a splitting a document where the use of styles has been inconsistent. In these circumstances, the task of manually placing the styles could be preferable to dealing with an imprecise conversion or the side-effects of processing poor quality markup. 

Managing fragments

How fragments are created through the import config is as follows:

<section>

A Word document can be imported to PSML and split into multiple fragments by first using @select="true". The following markup determines what triggers the creation of a fragment.

<sectionbreak>

Section Breaks  in docx can have the following values 'evenPage', 'oddPage', 'continuous', 'nextColumn' or 'nextPage'.

<split>
    <section select="true">
      <sectionbreak select="evenPage" />
      <sectionbreak select="oddPage" />
    </section>
</split>

These values are mirrored in the import-config, but using these to split a Word document requires a <sectionbreak> declaration for each. In the example below, both "evenPage" and "oddPage" are individually expressed. 

<outlinelevel>

can contain any number valid against this regular expression.

[0-5]

These declarations have to be enumerated each time. So to split at both "2" and "3" levels requires the following:

<split>
    <section select="true">
      <outlinelevel select="2" />
      <outlinelevel select="3" />
    </section>
  </split>

Also, be aware that while Word levels go up to nine (9), PageSeeder levels only go up to six (6), with zero (0) being the first level.

<wordstyle>

Using, for example, both 'Heading3' and 'Heading4' Word styles to split the content on import, would be expressed as follows:

<split>
    <section select="true">     
      <wordstyle  select="Heading3"  >
        <type>definition</type>
      </wordstyle>
      <wordstyle  select="Heading4" />
    </section >
  </split>

<wordstyle> is a special case of splitting as it also accepts <type> option:

  • <type>: specifies what @type the psml fragment will have.
manual splitting – <splitstyle>

Sometimes users will need to process documents that are simply not rich enough the requirements. When this happens, it may be easier to manually designate where the document should split rather than using styles or structure. 

This is what "splittingStyle1" was designed for. Essentially this is non-standard, disposable style name with a specific role of marking where the document should be split. Through the import-config, It can be invoked as follows:

<split>
    <section select="true">     
      <splitstyle select="splittingStyle1"/>
    </section>
  </split>

<splitstyle> use cases could be splitting a document after every ten pages. Or a splitting a document where the use of styles has been inconsistent. In these circumstances, the task of manually placing the styles could be preferable to dealing with an imprecise conversion or the side-effects of processing poor quality markup. 

Order and organize – <lists>

Provides options for interpreting Word lists, numbered headings and paragraphs, plus any numbering added to the documents.

<lists>
      <add-numbering-to-document-titles select="true"/>
      <convert-to-list-roles select="false"/>
           <!-- generate numbered attribute to
                   paragraphs for lists -->
      <convert-to-numbered-paragraphs select="true">
        <level value="1" output="prefix"/>
           <!-- attach prefix or numbering or inline=[label]
                    or text -->
        <level value="2" output="prefix"/>
        <level value="3" output="prefix"/>
        <level value="4" output="numbering"/>
        <level value="5" output="numbering"/>
        <level value="6" output="inline=level6"/>
      </convert-to-numbered-paragraphs>

      <convert-manual-numbering select="true">
        <value match="^[\(|\[|\{][a-z]+[\)|\]|\}]">
          <inline label="numbering-lowercase" />
        </value>        
        <value match="^[\(|\[|\{][A-Z]+[\)|\]|\}]">
          <prefix/>
        </value>
        <value match="^[\(|\[|\{][ivx]+[\)|\]|\}]">
          <list role="numbering-roman"/>
        </value>
      </convert-manual-numbering>
  </lists>

<add-numbering-to-document-titles>

to add numbering to the titles of each of the split documents, the @select attribute must be set to 'true'. With any other value, numbers will not be added.

<add-numbering-to-document-titles select="true"/>

<convert-to-list-roles>

allows lists to contain a @role attribute set with the value of the Word paragraph style. To invoke the @select attribute must be set to "true". By default it is set to "false".

<convert-to-list-roles select="false"/>

A use case for list roles is to mimic the List Styles feature of Word. In List Styles, the Level 1 style restarts the numbering for all levels below. This functionality can be replicated in PageSeeder using the list role.

<convert-to-numbered-paragraphs>

Is used to control the conversion of  numbered paragraph styles to numbered paragraphs or lists in PageSeeder. To convert to numbered paragraphs the @select attribute must be set to "true". If it contains any other value it will convert to <list> or <nlist> depending on the type of numbered value.

<convert-to-numbered-paragraphs select="true">

The conversion to numbered paragraphs uses the following @output values for each of the list levels:

  • numbering – to generate numbered paragraphs;

  • prefix – to generate a prefix with the value of the current numbering value for each of the Word numbered paragraphs;

  • inline=[labelname] – use this option to wrap the paragraph number from Word in an inline label. 

  • text – to put in the paragraph content the current numbering value for each of the Word numbered paragraphs;

<convert-to-numbered-paragraphs select="true">
        <-- prefix or numbering or inline=[label] or text -->
        <level value="1" output="prefix"/>
        <level value="2" output="prefix"/>
        <level value="3" output="text"/>
        <level value="4" output="numbering"/>
        <level value="5" output="numbering"/>
        <level value="6" output="inline=level6"/>
</convert-to-numbered-paragraphs>

In the preceding example, level 1 and 2 are transformed into prefix, level 3 is transformed into text, levels 4 and 5 are transformed into numbered paragraphs and level 6 is transformed into an inline label, with name "level6".

<convert-manual-numbering>

Controls non-automated numbering values that can exist in the Word file. To convert manual numbered values from paragraphs the @select attribute must be set to "true". If it contains any other value it will not use this calculation.

<convert-manual-numbering select="true">

The <value> element contains a @match attribute, that has to follow the normal conventions of XSLT regular expressions ( www.w3.org/TR/xslt20/#regular-expressions ).

It accepts 3 options:

  • <prefix/> – generates a @prefix attribute with the value of the current numbering value for each of the Word paragraphs containing the regular expression value;

  • <inline label="[numbering-format]" /> – to generate an <inline> element with content equal to the current numbering value for each of the Word paragraphs containing the regular expression value;

  • <list role="[list role]"/> – to generate a <list> element from Word paragraphs containing the regular expression value; (still in beta version).

<convert-manual-numbering select="true">
        <value match="^[\(|\[|\{][a-z]+[\)|\]|\}]">
          <inline label="numbering-lowercase" />
        </value>
        <value match="^[\(|\[|\{][A-Z]+[\)|\]|\}]">
          <prefix/>
        </value>
        <value match="^[\(|\[|\{][ivx]+[\)|\]|\}]">
          <list role="numbering-roman"/>
        </value>
        <value match="Part&#160;[A-Z0-9]+">
          <prefix />
         </value>
        <value match="Note:\s*">
           <prefix />
        </value>
        <value match="\s*[0-9]+[A-Z]*$">
           <prefix />
        </value>
</convert-manual-numbering>

Values that match the following regular expression will be output in an <inline> element with an attribute of @label="numbering-lowercase".

^[\(|\[|\{][a-z]+[\)|\]|\}]

Values that match the following regular expression will be output as the value of a @prefix attribute in a <para> element. 

^[\(|\[|\{][A-Z]+[\)|\]|\}]

Values that match the following regular expression will be converted into a list with @role ="numbering-roman".

^[\(|\[|\{][ivx]+[\)|\]|\}]

Any number of <value> elements can be added, as long as the @match attribute is a valid regular expression (check www.w3.org/TR/xslt20/#regular-expressions )

Semantics and formatting – <styles>

Contains the settings for general transformations of docx to PSML. These are the <ignore>, <default> and <wordstyle> .

<styles>
        <ignore>
            <wordstyle value="TOC1" />
            <wordstyle value="TOC2" />
            <wordstyle value="TOC3" />
            <wordstyle value="TOC4" />
        </ignore>
        <default>
            <paragraphStyles value="block" />
            <!-- possible values: 'para' or 'block' -->
            <characterStyles value="inline" />
            <!-- possible values: 'none' or 'inlineLabel' -->
            <smart-tag keep="true" />
            <!--  possible values: 'false' or 'true' -->
        </default>

        <!-- Values accepted: name of style available in word file -->
        <wordstyle name="Heading1" psmlelement="heading">
            <level value="1" />
        </wordstyle>

        <wordstyle name="Heading2" psmlelement="para">
        </wordstyle>

        <wordstyle name="Heading3" psmlelement="inline">
            <label value="Heading3" />
        </wordstyle>

        <wordstyle name="Heading4" psmlelement="block">
            <label value="Heading4" />
        </wordstyle>

        <wordstyle name="Heading5" psmlelement="heading">
            <level value="5" />
            <label type="block" value="Heading5" />
        </wordstyle>

        <wordstyle name="Heading6" psmlelement="heading">
            <level value="6" />
        </wordstyle>

    </styles>

<ignore>

determines which content should not be processed. For example, the Word Table of Contents paragraphs can often be discarded. To do this use something like the following:

        <ignore>
            <wordstyle value="TOC1" />
            <wordstyle value="TOC2" />
            <wordstyle value="TOC3" />
            <wordstyle value="TOC4" />
        </ignore>

<default>

defines settings for the following:

<paragraphStyles>

Defines a mapping for a paragraph style not mapped by <wordstyle> or <lists> where @value supports the following: 

  • "para" – transform all un-mapped Word paragraph styles to a PSML <para> element.

  • "block" – transform all un-mapped Word paragraph styles to a PSML <block> element with a label equal to the Word paragraph style ID (note: the ID is different from Word paragraph style name).

<characterStyles>

Defines general rule for any character style not mapped with <wordstyle>.  @value supports the following:

  • "none" – strips the markup for un-mapped Word character styles.

  • "inline" – transforms un-mapped Word character styles to a PSML <inline> element with a label equal to the Word character style ID (note: the ID is different from Word character style name).

<smart-tag>

Word  smart tag  information can be either discarded or captured in PageSeeder as an inline label, with a value equal to that of the smart tag. To do this, the @keep attribute must be set to "true". With any other value, the smart-tag markup will be discarded. 

<wordstyle>

These rules transform Word paragraph or character styles into PSML elements. Example PSML elements include:

  • <para>
  • <heading>
  • <monospace>
  • <preformat>
  • <caption>
  • <block>
  • <inline>

Consider the following example:

 <wordstyle name="Heading1" psmlelement="heading">
   <level value="1" />
 </wordstyle>

 <wordstyle name="Heading2" psmlelement="para">
 </wordstyle>

 <wordstyle name="Heading3" psmlelement="inline">
   <label value="Heading3" />
 </wordstyle>
 
 <wordstyle name="Heading4" psmlelement="block">
   <label value="Heading4" />
 </wordstyle>

 <wordstyle name="Heading5" psmlelement="heading">
    <level value="5" />
    <label type="block" value="Section_highlight" />
 </wordstyle>

 <wordstyle name="HTMLCode" psmlelement="monospace"/>

 <wordstyle name="HTMLPreformatted" psmlelement="preformat"/>

 <wordstyle name="TableCaption" psmlelement="caption" table="default"/>

Given the rules expressed in the code above:

  • Word paragraphs with a style ID of "Heading1" are transformed to <heading> element with an attribute @level="1";

  • Word paragraphs with style ID "Heading2" are transformed to <para>;

  • Word paragraphs with style ID  "Heading3" are transformed to <inline> element with an attribute @label="Heading3";

  • Word paragraphs with style ID  "Heading4" are transformed to <block> element with an attribute @label="Heading4"; and

  • Word paragraphs with style ID  "Heading5" are transformed to <heading> element with an attribute @level="5" wrapped in a <block> element with attribute @label="Section_highlight".

  • Word paragraphs with style ID  "Strong" are transformed to <monospace> element;

  • Word paragraphs with style ID  "HTMLpreformat" are transformed to <preformat> element;

  • Word paragraphs with style ID  "TableCaption" are transformed to <caption> element for all tables.

@psmlelement
"heading"

Possible child elements are:

<wordstyle name="Heading1" psmlelement="heading">
  <level value="1" />          
  <label type="block" value="heading1">          
</wordstyle>
  • <level> with attribute @value ranging from "1" to "6"

  • <label> with attributes:

    • @type with values "block" or "inline".

    • @value with value of  a "[valid label name]".

"para"

Possible child elements are:

<wordstyle name="paragraph1" psmlelement="para">
  <indent value="1" /> 
  <label type="block" value="para1"/>
  <numbering select="true" value="inline"/>
</wordstyle>
<wordstyle name="paragraph2" psmlelement="para">
  <indent value="2" /> 
  <label type="inline" value="para2"/>
  <numbering select="true" value="prefix"/>
</wordstyle>
<wordstyle name="paragraph3" psmlelement="para">
  <indent value="3" /> 
  <numbering select="true" value="inline">
    <label value="num3"/>
  </numbering>
</wordstyle>
  • <indent> with attribute:

    • @value with values of "1" to "6"

  • <label> with attributes of:

    • @type with values of "block" or "inline".

    • @value with value of a "[valid label name]".

  • <numbering> with attributes of:

    • @select with values of "true" or "false".

    • @value with value of:

      • "inline": wrap number in an inline label specified by nested <label value="[valid label name]"> element.

      • "text": include number in paragraph text.

      • "prefix": insert number in @prefix attribute.

      • "numbering": add @numbered="true".

"caption"

Should have a @table attribute with value "default" meaning it applies to all tables or the value of a specific table style ID to which it should apply.

Created on , last edited on