Monday, June 22, 2015

DITA OT PDF Customization - Tables with Alternate Row Background Colors

Share to Facebook Share to Twitter Email This Share on Google Plus Share on Tumblr

Based on this forum thread I will try to give some steps in which you can create your own DITA Open Toolkit PDF customization folder for customizing a table to have alternate row background colors.

  1. First of all you need to know the XSLT template that you need to override.
    • You can open a DITA topic which has a table inside it and select in the Outline view the table row. The Attributes view will show you its @class attribute value which is - topic/row .
    • Use the Find/Replace in Files tool to search in the PDF plugin folder (for example DITA-OT-DIR/plugins/org.dita.pdf2/) for the string topic/row.
    • In the XSLT stylesheet DITA-OT-DIR/plugins/org.dita.pdf2/xsl/fo/tables.xsl you will find a template which matches all rows from a table body:
          <xsl:template match="*[contains(@class, ' topic/tbody ')]/*[contains(@class, ' topic/row ')]">
              <fo:table-row xsl:use-attribute-sets="tbody.row">
                  <xsl:call-template name="commonattributes"/>
                  <xsl:apply-templates/>
              </fo:table-row>
          </xsl:template>
      That is the template which you will need to overwrite in your customization.
  2. Copy the entire folder DITA-OT-DIR/plugins/org.dita.pdf2/Customization to an external location. For example in my case I copied it to my Desktop.
  3. Renamed in that copied folder the catalog.xml.orig file to catalog.xml, edit it and uncomment the line:
      <uri name="cfg:fo/xsl/custom.xsl" uri="fo/xsl/custom.xsl"/>
    This custom catalog file will be automatically used to contribute in the PDF publishing process with high priority the XSLT stylesheet located in Customization/fo/xsl/custom.xsl.
  4. Rename in the Customization/fo/xsl folder the custom.xsl.orig file to custom.xsl. This stylesheet will contain all your template overrides.
  5. Overwrite in the custom.xsl the original template like:
        <xsl:template match="*[contains(@class, ' topic/tbody ')]/*[contains(@class, ' topic/row ')]">
            <fo:table-row xsl:use-attribute-sets="tbody.row">
                <xsl:choose>
                    <xsl:when test="(count(preceding-sibling::*[contains(@class, ' topic/row ')]) mod 2) = 0">
                        <!-- Even row, light blue -->
                        <xsl:attribute name="background-color">rgb(210, 222, 253)</xsl:attribute>
                    </xsl:when>
                    <xsl:otherwise>
                        <!-- Odd row, white -->
                        <xsl:attribute name="background-color">white</xsl:attribute>
                    </xsl:otherwise>
                </xsl:choose>
                <xsl:call-template name="commonattributes"/>
                <xsl:apply-templates/>
            </fo:table-row>
        </xsl:template>
  6. If you want the table frame border colors to have a custom color you can override some attribute sets defined in the DITA-OT-DIR/plugins/org.dita.pdf2/cfg/fo/attrs/tables-attr.xsl:
        <xsl:attribute-set name="table__tableframe__top" use-attribute-sets="common.border__top">
            <xsl:attribute name="border-top-color">blue</xsl:attribute>
        </xsl:attribute-set>
        <xsl:attribute-set name="table__tableframe__bottom" use-attribute-sets="common.border__bottom">
            <xsl:attribute name="border-bottom-color">blue</xsl:attribute>
        </xsl:attribute-set>
        <xsl:attribute-set name="table__tableframe__right" use-attribute-sets="common.border__right">
            <xsl:attribute name="border-right-color">blue</xsl:attribute>
        </xsl:attribute-set>
        <xsl:attribute-set name="table__tableframe__left" use-attribute-sets="common.border__left">
            <xsl:attribute name="border-left-color">blue</xsl:attribute>
        </xsl:attribute-set>ou
  7. Edit your PDF transformation scenario and set the parameter customization.dir to point to your customization folder.
  8. Publish and enjoy :)

If you want to create a DITA Open Toolkit plugin to achieve the same result you can use the dita.xsl.xslfo plugin extension to contribute your own XSLT stylesheet to the publishing process:
http://blog.oxygenxml.com/2013/12/creating-simple-dita-open-toolkit.html

3 comments:

  1. Anonymous4:24 PM

    Awesome article!
    Bogdan

    ReplyDelete
  2. Anonymous7:54 AM

    Great! It works!

    ReplyDelete