---
title: "Export citations to DOCX"
source: https://dev.pageseeder.com/guide/publishing/ant_api/extensions/export_citations_to_docx.html
description: "Guide for exporting PageSeeder citations to DOCX format using properties fragments in bibliography documents, with XSLT post-processing to transform PSML into OOXML for Microsoft Word compatibility."
last_updated: 2026-08-11T16:08:44+10:00
tokens: ~4239
---

# Export citations to DOCX

To export citations stored in PageSeeder using the [DOCX export Ant task](task_export-docx.md), each citation must be in a properties fragment inside a single bibliography document.

## PSML model

The recommended model has xrefs from the bibliography document to source documents in a library which contain the details of each source. In this way, the sources can be defined once and used by many different publications.

### Example bibliography document

The example below contains the following properties, but any properties could be used:

- `link-text` – The text that appears in the citation reference.
- `description` – A temporary description that can be used until a proper source document is created.
- `source` – An xref to the source details document. It must have `type="alternate"` so that the details can be transcluded into the bibliography when exporting.

```psml
<document type="bibliography" level="portable">
  <section id="title">
    <fragment id="0">
      <heading level="1">Bibliography</heading>
    </fragment>
  </section>
  <section id="content" fragmenttype="citation">
    <properties-fragment id="1" type="citation">
      <property name="link-text"
                title="Link text"
                value="Jacobson, 1992" />
      <property name="description"
                title="Description"
                datatype="markdown">
        <markdown>Object Oriented Software Engineering: A Use
                  Case Driven Approach 1st Edition
                  by Ivar Jacobson
        </markdown>
      </property>
      <property name="source"
                title="Source"
                datatype="xref">
        <xref frag="default"
              uriid="61107"
              documenttype="source">Object Oriented Software Engineering
        </xref>
      </property>
    </properties-fragment>
    <properties-fragment id="2" type="citation">
      <property name="link-text"
                      title="Link text"
                      value="Wikipedia" />
      <property name="description"
                      title="Description"
                      datatype="markdown">
        <markdown>Object-oriented design</markdown>
      </property>
      <property name="source"
                title="Source"
                datatype="xref">
        <xref frag="default"
              uriid="61108"
              documenttype="source">Object-oriented design
        </xref>
      </property>
    </properties-fragment>
  </section>
</document>
```

### Example source document

This example contains the following properties, but any properties could be used:

- `first-name` – The given/other name of an author.
- `middle-name` – The middle name of an author.
- `last-name` – The family name of an author.
- `title` – The title of the book.
- `year` – The year published.
- `publisher` – The publisher.

```xml
<document type="source" level="portable">
  <section id="authors" title="Authors" fragmenttype="author">
    <properties-fragment id="2" type="author">
      <property name="first-name"
                title="First name"
                value="Ivar" />
      <property name="middle-name"
                title="Middle name"
                value="" />
      <property name="last-name"
                title="Last name"
                value="Jacobson" />
    </properties-fragment>
  </section>
  <section id="details" title="Details">
    <properties-fragment id="1" type="book">
      <property name="title"
                title="Title"
                value="Object Oriented Software Engineering:
                       A Use Case Driven Approach" />
      <property name="year"
                title="Year"
                value="1992" />
      <property name="publisher"
                title="Publisher"
                value="Addison-Wesley Professional" />
    </properties-fragment>
  </section>
</document>
```

## Post-processing

The DOCX export Ant task includes the PSML properties for citation sources in the `item1.xml` file inside the `.docx`. This PSML must then be transformed into OOXML so that the sources can be read by Microsoft Word. This can be done by running an XSLT style sheet in the Ant `build.xml`.

For a full example of post-processing, see [How to configure publications](../../../../get_started/tutorials/how_to_configure_publications.md).

### Example `build.xml`

The `<param name="expanded" value="true"/>` outputs the `.docx` in unzipped format so it can be post-processed. It is then zipped at another time.

```xml
<project name="Report publication export"
         xmlns:ps="antlib:com.pageseeder.publishapi.ant"
         xmlns:psd="antlib:org.pageseeder.docx.ant">
  <target name="create-consolidated-docx"
          description="Create Word Document"> ...
    <psd:export-docx
         src="${process}/${ps.config.default.uri.filename.no.ext}.psml"
         dest="${expanded}"
         working="${working}/docx"
         config="word-export-config.xml"
         wordTemplate="word-export-template.docx">
      <param name="expanded" value="true"/>
    </psd:export-docx>

    <echo>DocX post-transform</echo>
    <xslt in="${expanded}/customXml/item1.xml"
          out="${working}/item1.xml"
          style="docx-citation-transform.xsl"/>
    <copy todir="${expanded}/customXml"
          file="${working}/item1.xml"
          overwrite="true"/>

    <echo>Zipping</echo>
    <zip 
      destfile="${working}/${ps.config.default.uri.filename.no.ext}.docx"
      basedir="${expanded}"/>
      ...
  </target>
</project>
```

### Example `docx-citation-transform.xsl`

This XSL must produce an XML that follows the OOXML bibliography schema (see following).

```xml

<xsl:stylesheet version="2.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:b="http://schemas.openxmlformats.org/officeDocument/2006/bibliography"
  exclude-result-prefixes="#all">

  <xsl:template match="/b:Sources">
    <xsl:copy>
      <xsl:copy-of select="@*" />
      <xsl:apply-templates />
    </xsl:copy>
  </xsl:template>

  <xsl:template match="properties-fragment[.//xref]">
    <b:Source>
      <b:Tag>
        <xsl:value-of select="@id" />
      </b:Tag>

      <b:SourceType>
        <xsl:choose>
          <xsl:when test=".//properties-fragment[@type='book']">
                         Book
          </xsl:when>
          <xsl:when
             test=".//properties-fragment[@type='website']">
                  InternetSite
          </xsl:when>
          <xsl:when
            test=".//properties-fragment[@type='periodical-article']">
                  ArticleInAPeriodical
          </xsl:when>
          <xsl:otherwise>Misc</xsl:otherwise>
        </xsl:choose>
      </b:SourceType>
      <b:Author>
        <xsl:if 
           test=".//properties-fragment[@type='author']">
          <b:Author>
            <b:NameList>
              <xsl:apply-templates 
                 select=".//properties-fragment[@type='author']" />
            </b:NameList>
          </b:Author>
        </xsl:if>
      </b:Author>
      <xsl:apply-templates
         select=".//properties-fragment[@type='book' or
                @type='website' or
                @type='periodical-article' or
                @type='misc']/property" />
    </b:Source>
  </xsl:template>

  <xsl:template match="properties-fragment[@type='author']">
    <b:Person>
      <xsl:apply-templates   mode="author" />
    </b:Person>
  </xsl:template>

  <xsl:template match="property[@name='first-name']"
                mode="author">
    <b:First>
      <xsl:value-of  select="@value" />
    </b:First>
  </xsl:template>
  <xsl:template match="property[@name='middle-name']"
                mode="author">
    <b:Middle>
      <xsl:value-of select="@value" />
    </b:Middle>
  </xsl:template>

  <xsl:template match="property[@name='last-name']"
                mode="author">
    <b:Last>
      <xsl:value-of select="@value" />
    </b:Last>
  </xsl:template>

  <xsl:template match="property[@name='title']">
    <b:Title>
      <xsl:value-of select="@value" />
    </b:Title>
  </xsl:template>

  <xsl:template match="property[@name='year']">
    <b:Year>
      <xsl:value-of select="@value" />
    </b:Year>
  </xsl:template>

  <xsl:template match="property[@name='publisher']">
    <b:Publisher>
      <xsl:value-of select="@value" />
    </b:Publisher>
  </xsl:template>
</xsl:stylesheet>
```

### Example `item1.xml` after transform

```xml

<b:Sources
  xmlns:b="http://schemas.openxmlformats.org/officeDocument/2006/bibliography"
  xmlns="http://schemas.openxmlformats.org/officeDocument/2006/bibliography"
  SelectedStyle="\APA.XSL"
  StyleName="APA">
  <b:Source>
    <b:Tag>61105-1</b:Tag>
    <b:SourceType>Book</b:SourceType>
    <b:Author>
      <b:Author>
        <b:NameList>
          <b:Person>
            <b:First>Ivar</b:First>
            <b:Last>Jacobson</b:Last>
          </b:Person>
        </b:NameList>
      </b:Author>
    </b:Author>
    <b:Title>Object Oriented Software Engineering:
             A Use Case Driven Approach</b:Title>
    <b:Year>1992</b:Year>
    <b:Publisher>Addison-Wesley Professional</b:Publisher>
  </b:Source>
</b:Sources>
```

## OOXML bibliography schema

```xml

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  xmlns="http://purl.oclc.org/ooxml/officeDocument/bibliography"
  xmlns:s="http://purl.oclc.org/ooxml/officeDocument/sharedTypes"
  targetNamespace="http://purl.oclc.org/ooxml/officeDocument/bibliography"
  elementFormDefault="qualified">
  <xsd:import namespace="http://purl.oclc.org/ooxml/officeDocument/sharedTypes"
              schemaLocation="shared-commonSimpleTypes.xsd"/>
  <xsd:simpleType name="ST_SourceType">
    <xsd:restriction base="s:ST_String">
      <xsd:enumeration value="ArticleInAPeriodical"/>
      <xsd:enumeration value="Book"/>
      <xsd:enumeration value="BookSection"/>
      <xsd:enumeration value="JournalArticle"/>
      <xsd:enumeration value="ConferenceProceedings"/>
      <xsd:enumeration value="Report"/>
      <xsd:enumeration value="SoundRecording"/>
      <xsd:enumeration value="Performance"/>
      <xsd:enumeration value="Art"/>
      <xsd:enumeration value="DocumentFromInternetSite"/>
      <xsd:enumeration value="InternetSite"/>
      <xsd:enumeration value="Film"/>
      <xsd:enumeration value="Interview"/>
      <xsd:enumeration value="Patent"/>
      <xsd:enumeration value="ElectronicSource"/>
      <xsd:enumeration value="Case"/>
      <xsd:enumeration value="Misc"/>
    </xsd:restriction>
  </xsd:simpleType>
  <xsd:complexType name="CT_NameListType">
    <xsd:sequence>
      <xsd:element name="Person"
                   type="CT_PersonType"
                   minOccurs="1"
                   maxOccurs="unbounded"/>
    </xsd:sequence>
  </xsd:complexType>
  <xsd:complexType name="CT_PersonType">
    <xsd:sequence>
      <xsd:element name="Last"
                   type="s:ST_String"
                   minOccurs="0"
                   maxOccurs="unbounded"/>
      <xsd:element name="First"
                   type="s:ST_String"
                   minOccurs="0"
                   maxOccurs="unbounded"/>
      <xsd:element name="Middle"
                   type="s:ST_String"
                   minOccurs="0"
                   maxOccurs="unbounded"/>
    </xsd:sequence>
  </xsd:complexType>
  <xsd:complexType name="CT_NameType">
    <xsd:sequence>
      <xsd:element name="NameList"
                   type="CT_NameListType"
                   minOccurs="1"
                   maxOccurs="1"/>
    </xsd:sequence>
  </xsd:complexType>
  <xsd:complexType name="CT_NameOrCorporateType">
    <xsd:sequence>
      <xsd:choice minOccurs="0"
                  maxOccurs="1">
        <xsd:element name="NameList"
                     type="CT_NameListType"
                     minOccurs="1"
                     maxOccurs="1"/>
        <xsd:element name="Corporate"
                     minOccurs="1"
                     maxOccurs="1"
                     type="s:ST_String"/>
      </xsd:choice>
    </xsd:sequence>
  </xsd:complexType>
  <xsd:complexType name="CT_AuthorType">
    <xsd:sequence>
      <xsd:choice minOccurs="0" maxOccurs="unbounded">
        <xsd:element name="Artist" type="CT_NameType"/>
        <xsd:element name="Author" type="CT_NameOrCorporateType"/>
        <xsd:element name="BookAuthor" type="CT_NameType"/>
        <xsd:element name="Compiler" type="CT_NameType"/>
        <xsd:element name="Composer" type="CT_NameType"/>
        <xsd:element name="Conductor" type="CT_NameType"/>
        <xsd:element name="Counsel" type="CT_NameType"/>
        <xsd:element name="Director" type="CT_NameType"/>
        <xsd:element name="Editor" type="CT_NameType"/>
        <xsd:element name="Interviewee" type="CT_NameType"/>
        <xsd:element name="Interviewer" type="CT_NameType"/>
        <xsd:element name="Inventor" type="CT_NameType"/>
        <xsd:element name="Performer" type="CT_NameOrCorporateType"/>
        <xsd:element name="ProducerName" type="CT_NameType"/>
        <xsd:element name="Translator" type="CT_NameType"/>
        <xsd:element name="Writer" type="CT_NameType"/>
      </xsd:choice>
    </xsd:sequence>
  </xsd:complexType>
  <xsd:complexType name="CT_SourceType">
    <xsd:sequence>
      <xsd:choice minOccurs="0" maxOccurs="unbounded">
        <xsd:element name="AbbreviatedCaseNumber" type="s:ST_String"/>
        <xsd:element name="AlbumTitle" type="s:ST_String"/>
        <xsd:element name="Author" type="CT_AuthorType"/>
        <xsd:element name="BookTitle" type="s:ST_String"/>
        <xsd:element name="Broadcaster" type="s:ST_String"/>
        <xsd:element name="BroadcastTitle" type="s:ST_String"/>
        <xsd:element name="CaseNumber" type="s:ST_String"/>
        <xsd:element name="ChapterNumber" type="s:ST_String"/>
        <xsd:element name="City" type="s:ST_String"/>
        <xsd:element name="Comments" type="s:ST_String"/>
        <xsd:element name="ConferenceName" type="s:ST_String"/>
        <xsd:element name="CountryRegion" type="s:ST_String"/>
        <xsd:element name="Court" type="s:ST_String"/>
        <xsd:element name="Day" type="s:ST_String"/>
        <xsd:element name="DayAccessed" type="s:ST_String"/>
        <xsd:element name="Department" type="s:ST_String"/>
        <xsd:element name="Distributor" type="s:ST_String"/>
        <xsd:element name="Edition" type="s:ST_String"/>
        <xsd:element name="Guid" type="s:ST_String"/>
        <xsd:element name="Institution" type="s:ST_String"/>
        <xsd:element name="InternetSiteTitle" type="s:ST_String"/>
        <xsd:element name="Issue" type="s:ST_String"/>
        <xsd:element name="JournalName" type="s:ST_String"/>
        <xsd:element name="LCID" type="s:ST_Lang"/>
        <xsd:element name="Medium" type="s:ST_String"/>
        <xsd:element name="Month" type="s:ST_String"/>
        <xsd:element name="MonthAccessed" type="s:ST_String"/>
        <xsd:element name="NumberVolumes" type="s:ST_String"/>
        <xsd:element name="Pages" type="s:ST_String"/>
        <xsd:element name="PatentNumber" type="s:ST_String"/>
        <xsd:element name="PeriodicalTitle" type="s:ST_String"/>
        <xsd:element name="ProductionCompany" type="s:ST_String"/>
        <xsd:element name="PublicationTitle" type="s:ST_String"/>
        <xsd:element name="Publisher" type="s:ST_String"/>
        <xsd:element name="RecordingNumber" type="s:ST_String"/>
        <xsd:element name="RefOrder" type="s:ST_String"/>
        <xsd:element name="Reporter" type="s:ST_String"/>
        <xsd:element name="SourceType" type="ST_SourceType"/>
        <xsd:element name="ShortTitle" type="s:ST_String"/>
        <xsd:element name="StandardNumber" type="s:ST_String"/>
        <xsd:element name="StateProvince" type="s:ST_String"/>
        <xsd:element name="Station" type="s:ST_String"/>
        <xsd:element name="Tag" type="s:ST_String"/>
        <xsd:element name="Theater" type="s:ST_String"/>
        <xsd:element name="ThesisType" type="s:ST_String"/>
        <xsd:element name="Title" type="s:ST_String"/>
        <xsd:element name="Type" type="s:ST_String"/>
        <xsd:element name="URL" type="s:ST_String"/>
        <xsd:element name="Version" type="s:ST_String"/>
        <xsd:element name="Volume" type="s:ST_String"/>
        <xsd:element name="Year" type="s:ST_String"/>
        <xsd:element name="YearAccessed" type="s:ST_String"/>
      </xsd:choice>
    </xsd:sequence>
  </xsd:complexType>
  <xsd:element name="Sources" type="CT_Sources"/>
  <xsd:complexType name="CT_Sources">
    <xsd:sequence>
      <xsd:element name="Source"
                   type="CT_SourceType"
                   minOccurs="0"
                   maxOccurs="unbounded"/>
    </xsd:sequence>
    <xsd:attribute name="SelectedStyle" type="s:ST_String"/>
    <xsd:attribute name="StyleName" type="s:ST_String"/>
    <xsd:attribute name="URI" type="s:ST_String"/>
  </xsd:complexType>
</xsd:schema>
```

