Publishing

Publishing PageSeeder data to print, the Web or both

Export citations to docx

To export citations stored in PageSeeder using the docx export Ant task 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 will appear 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.
<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

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

  • first-name: The first name of an author.
  • middle-name: The middle name of an author.
  • last-name: The last name of an author.
  • title: The title of the book.
  • year: The year published.
  • publisher: The publisher.
<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 will include 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 stylesheet in the Ant build.xml.

For a full example of post-processing see How to configure auto-numbering, equations, footnotes, endnotes and citations.

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 later.

<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 below).

<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

<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

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

Created on , last edited on