[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message]

Re: XSL to ODF/OOXML

Subject: Re: XSL to ODF/OOXML
From: Steve <subsume@xxxxxxxxx>
Date: Fri, 27 Apr 2007 15:13:24 -0400
Re:  XSL to ODF/OOXML
Interestingly, I was consindering emailing you after stumbling upon this:

http://www.biglist.com/lists/xsl-list/archives/200703/msg00360.html

On 4/27/07, Nic James Ferrier <nferrier@xxxxxxxxxxxxxxxxxxxx> wrote:
"Joe Fawcett" <joefawcett@xxxxxxxxxxx> writes:

>> I'm scouring the internet looking for leads on creating ODF/OOXML with
>> XSL transforms. I'm not really finding a whole lot, other than command
>> line programs which accomplish as much.
>>
>> I have a website with lots of reports and, ideally, I'd like to have
>> an 'export to Word' feature. Is this just another XSL transform that
>> requires me learning the appropriate output schema or is there
>> something additional that needs to be done?
>>
>> Also, I already have HTML versions of the reports I need (nothing too
>> complicated). I'm wondering if I can use the XHTML output as my source
>> XML and have one stylesheet that converts all of my documents into the
>> appropriate format? Or am I reaching for the philosopher's stone too
>> soon?

I have an XSLT to convert HTML to ODF.

Here it is:

  <?xml version="1.0" encoding="utf-8"?>
  <xsl:stylesheet  version="1.0"
                   xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                   xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0"
                   xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0"
                   xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0"
                   xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0"
                   xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0"
                   xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0"
                   xmlns:xlink="http://www.w3.org/1999/xlink"
                   xmlns:dc="http://purl.org/dc/elements/1.1/"
                   xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0"
                   xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0"
                   xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0"
                   xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0"
                   xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0"
                   xmlns:math="http://www.w3.org/1998/Math/MathML"
                   xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0"
                   xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0"
                   xmlns:ooo="http://openoffice.org/2004/office"
                   xmlns:ooow="http://openoffice.org/2004/writer"
                   xmlns:oooc="http://openoffice.org/2004/calc"
                   xmlns:dom="http://www.w3.org/2001/xml-events"
                   xmlns:xforms="http://www.w3.org/2002/xforms"
                   xmlns:xsd="http://www.w3.org/2001/XMLSchema"
                   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

      <!--
           Copyright (C) 2006 by Tapsell-Ferrier Limited

           This program is free software; you can redistribute it and/or modify
           it under the terms of the GNU General Public License as published by
           the Free Software Foundation; either version 2, or (at your option)
           any later version.

           This program is distributed in the hope that it will be useful,
           but WITHOUT ANY WARRANTY; without even the implied warranty of
           MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
           GNU General Public License for more details.

           You should have received a copy of the GNU General Public License
           along with this program; see the file COPYING.  If not, write to the
           Free Software Foundation, Inc.,   51 Franklin Street, Fifth Floor,
           Boston, MA  02110-1301  USA
        -->

<xsl:output method="xml" indent="yes"/>

      <xsl:template match="/html">
          <office:document-content office:version="1.0">
              <office:scripts/>
              <office:font-face-decls>
                  <style:font-face style:name="StarSymbol" svg:font-family="StarSymbol" style:font-charset="x-symbol"/>
                  <style:font-face style:name="DejaVu Sans1" svg:font-family="'DejaVu Sans'" style:font-pitch="variable"/>
                  <style:font-face style:name="DejaVu Serif" svg:font-family="'DejaVu Serif'" style:font-family-generic="roman" style:font-pitch="variable"/>
                  <style:font-face style:name="DejaVu Sans" svg:font-family="'DejaVu Sans'" style:font-family-generic="swiss" style:font-pitch="variable"/>
              </office:font-face-decls>
              <office:automatic-styles>
                  <style:style style:name="Table1" style:family="table">
                      <style:table-properties style:width="6.925in" table:align="margins"/>
                  </style:style>
                  <style:style style:name="Table1.A" style:family="table-column">
                      <style:table-column-properties style:column-width="3.4625in" style:rel-column-width="32767*"/>
                  </style:style>
                  <style:style style:name="Table1.A1" style:family="table-cell">
                      <style:table-cell-properties fo:padding="0.0382in" fo:border-left="0.0007in solid #000000" fo:border-right="none" fo:border-top="0.0007in solid #000000" fo:border-bottom="0.0007in solid #000000"/>
                  </style:style>
                  <style:style style:name="Table1.B1" style:family="table-cell">
                      <style:table-cell-properties fo:padding="0.0382in" fo:border="0.0007in solid #000000"/>
                  </style:style>
                  <style:style style:name="Table1.A2" style:family="table-cell">
                      <style:table-cell-properties fo:padding="0.0382in" fo:border-left="0.0007in solid #000000" fo:border-right="none" fo:border-top="none" fo:border-bottom="0.0007in solid #000000"/>
                  </style:style>
                  <style:style style:name="Table1.B2" style:family="table-cell">
                      <style:table-cell-properties fo:padding="0.0382in" fo:border-left="0.0007in solid #000000" fo:border-right="0.0007in solid #000000" fo:border-top="none" fo:border-bottom="0.0007in solid #000000"/>
                  </style:style>
                  <style:style style:name="Table2" style:family="table">
                      <style:table-properties style:width="6.925in" table:align="margins"/>
                  </style:style>
                  <style:style style:name="Table2.A" style:family="table-column">
                      <style:table-column-properties style:column-width="3.4625in" style:rel-column-width="32767*"/>
                  </style:style>
                  <style:style style:name="Table2.A1" style:family="table-cell">
                      <style:table-cell-properties fo:padding="0.0382in" fo:border-left="0.0007in solid #000000" fo:border-right="none" fo:border-top="0.0007in solid #000000" fo:border-bottom="0.0007in solid #000000"/>
                  </style:style>
                  <style:style style:name="Table2.B1" style:family="table-cell">
                      <style:table-cell-properties fo:padding="0.0382in" fo:border="0.0007in solid #000000"/>
                  </style:style>
                  <style:style style:name="Table2.A2" style:family="table-cell">
                      <style:table-cell-properties fo:padding="0.0382in" fo:border-left="0.0007in solid #000000" fo:border-right="none" fo:border-top="none" fo:border-bottom="0.0007in solid #000000"/>
                  </style:style>
                  <style:style style:name="Table2.B2" style:family="table-cell">
                      <style:table-cell-properties fo:padding="0.0382in" fo:border-left="0.0007in solid #000000" fo:border-right="0.0007in solid #000000" fo:border-top="none" fo:border-bottom="0.0007in solid #000000"/>
                  </style:style>
                  <style:style style:name="P1" style:family="paragraph" style:parent-style-name="Table_20_Heading">
                      <style:paragraph-properties fo:text-align="start" style:justify-single-word="false"/>
                      <style:text-properties fo:font-style="normal" fo:font-weight="normal" style:font-style-asian="normal" style:font-weight-asian="normal" style:font-style-complex="normal" style:font-weight-complex="normal"/>
                  </style:style>
                  <style:style style:name="P2" style:family="paragraph" style:parent-style-name="Standard" style:list-style-name="L1"/>
                  <style:style style:name="P3" style:family="paragraph" style:parent-style-name="Standard" style:list-style-name="L2"/>
                  <text:list-style style:name="L1">
                      <text:list-level-style-bullet text:level="1" text:style-name="Bullet_20_Symbols" style:num-suffix="." text:bullet-char="&#x25CF;">
                          <style:list-level-properties text:space-before="0.25in" text:min-label-width="0.25in"/>
                          <style:text-properties style:font-name="StarSymbol"/>
                      </text:list-level-style-bullet>
                      <text:list-level-style-bullet text:level="2" text:style-name="Bullet_20_Symbols" style:num-suffix="." text:bullet-char="&#x25CB;">
                          <style:list-level-properties text:space-before="0.5in" text:min-label-width="0.25in"/>
                          <style:text-properties style:font-name="StarSymbol"/>
                      </text:list-level-style-bullet>
                      <text:list-level-style-bullet text:level="3" text:style-name="Bullet_20_Symbols" style:num-suffix="." text:bullet-char="&#x25A0;">
                          <style:list-level-properties text:space-before="0.75in" text:min-label-width="0.25in"/>
                          <style:text-properties style:font-name="StarSymbol"/>
                      </text:list-level-style-bullet>
                      <text:list-level-style-bullet text:level="4" text:style-name="Bullet_20_Symbols" style:num-suffix="." text:bullet-char="&#x25CF;">
                          <style:list-level-properties text:space-before="1in" text:min-label-width="0.25in"/>
                          <style:text-properties style:font-name="StarSymbol"/>
                      </text:list-level-style-bullet>
                      <text:list-level-style-bullet text:level="5" text:style-name="Bullet_20_Symbols" style:num-suffix="." text:bullet-char="&#x25CB;">
                          <style:list-level-properties text:space-before="1.25in" text:min-label-width="0.25in"/>
                          <style:text-properties style:font-name="StarSymbol"/>
                      </text:list-level-style-bullet>
                      <text:list-level-style-bullet text:level="6" text:style-name="Bullet_20_Symbols" style:num-suffix="." text:bullet-char="&#x25A0;">
                          <style:list-level-properties text:space-before="1.5in" text:min-label-width="0.25in"/>
                          <style:text-properties style:font-name="StarSymbol"/>
                      </text:list-level-style-bullet>
                      <text:list-level-style-bullet text:level="7" text:style-name="Bullet_20_Symbols" style:num-suffix="." text:bullet-char="&#x25CF;">
                          <style:list-level-properties text:space-before="1.75in" text:min-label-width="0.25in"/>
                          <style:text-properties style:font-name="StarSymbol"/>
                      </text:list-level-style-bullet>
                      <text:list-level-style-bullet text:level="8" text:style-name="Bullet_20_Symbols" style:num-suffix="." text:bullet-char="&#x25CB;">
                          <style:list-level-properties text:space-before="2in" text:min-label-width="0.25in"/>
                          <style:text-properties style:font-name="StarSymbol"/>
                      </text:list-level-style-bullet>
                      <text:list-level-style-bullet text:level="9" text:style-name="Bullet_20_Symbols" style:num-suffix="." text:bullet-char="&#x25A0;">
                          <style:list-level-properties text:space-before="2.25in" text:min-label-width="0.25in"/>
                          <style:text-properties style:font-name="StarSymbol"/>
                      </text:list-level-style-bullet>
                      <text:list-level-style-bullet text:level="10" text:style-name="Bullet_20_Symbols" style:num-suffix="." text:bullet-char="&#x25CF;">
                          <style:list-level-properties text:space-before="2.5in" text:min-label-width="0.25in"/>
                          <style:text-properties style:font-name="StarSymbol"/>
                      </text:list-level-style-bullet>
                  </text:list-style>
                  <text:list-style style:name="L2">
                      <text:list-level-style-bullet text:level="1" text:style-name="Bullet_20_Symbols" style:num-suffix="." text:bullet-char="&#x25CF;">
                          <style:list-level-properties text:space-before="0.25in" text:min-label-width="0.25in"/>
                          <style:text-properties style:font-name="StarSymbol"/>
                      </text:list-level-style-bullet>
                      <text:list-level-style-bullet text:level="2" text:style-name="Bullet_20_Symbols" style:num-suffix="." text:bullet-char="&#x25CB;">
                          <style:list-level-properties text:space-before="0.5in" text:min-label-width="0.25in"/>
                          <style:text-properties style:font-name="StarSymbol"/>
                      </text:list-level-style-bullet>
                      <text:list-level-style-bullet text:level="3" text:style-name="Bullet_20_Symbols" style:num-suffix="." text:bullet-char="&#x25A0;">
                          <style:list-level-properties text:space-before="0.75in" text:min-label-width="0.25in"/>
                          <style:text-properties style:font-name="StarSymbol"/>
                      </text:list-level-style-bullet>
                      <text:list-level-style-bullet text:level="4" text:style-name="Bullet_20_Symbols" style:num-suffix="." text:bullet-char="&#x25CF;">
                          <style:list-level-properties text:space-before="1in" text:min-label-width="0.25in"/>
                          <style:text-properties style:font-name="StarSymbol"/>
                      </text:list-level-style-bullet>
                      <text:list-level-style-bullet text:level="5" text:style-name="Bullet_20_Symbols" style:num-suffix="." text:bullet-char="&#x25CB;">
                          <style:list-level-properties text:space-before="1.25in" text:min-label-width="0.25in"/>
                          <style:text-properties style:font-name="StarSymbol"/>
                      </text:list-level-style-bullet>
                      <text:list-level-style-bullet text:level="6" text:style-name="Bullet_20_Symbols" style:num-suffix="." text:bullet-char="&#x25A0;">
                          <style:list-level-properties text:space-before="1.5in" text:min-label-width="0.25in"/>
                          <style:text-properties style:font-name="StarSymbol"/>
                      </text:list-level-style-bullet>
                      <text:list-level-style-bullet text:level="7" text:style-name="Bullet_20_Symbols" style:num-suffix="." text:bullet-char="&#x25CF;">
                          <style:list-level-properties text:space-before="1.75in" text:min-label-width="0.25in"/>
                          <style:text-properties style:font-name="StarSymbol"/>
                      </text:list-level-style-bullet>
                      <text:list-level-style-bullet text:level="8" text:style-name="Bullet_20_Symbols" style:num-suffix="." text:bullet-char="&#x25CB;">
                          <style:list-level-properties text:space-before="2in" text:min-label-width="0.25in"/>
                          <style:text-properties style:font-name="StarSymbol"/>
                      </text:list-level-style-bullet>
                      <text:list-level-style-bullet text:level="9" text:style-name="Bullet_20_Symbols" style:num-suffix="." text:bullet-char="&#x25A0;">
                          <style:list-level-properties text:space-before="2.25in" text:min-label-width="0.25in"/>
                          <style:text-properties style:font-name="StarSymbol"/>
                      </text:list-level-style-bullet>
                      <text:list-level-style-bullet text:level="10" text:style-name="Bullet_20_Symbols" style:num-suffix="." text:bullet-char="&#x25CF;">
                          <style:list-level-properties text:space-before="2.5in" text:min-label-width="0.25in"/>
                          <style:text-properties style:font-name="StarSymbol"/>
                      </text:list-level-style-bullet>
                  </text:list-style>
              </office:automatic-styles>
              <xsl:apply-templates select="body"/>
          </office:document-content>
      </xsl:template>

      <xsl:template match="body">
          <office:body>
              <office:text>
                  <office:forms form:automatic-focus="false" form:apply-design-mode="false"/>
                  <text:sequence-decls>
                      <text:sequence-decl text:display-outline-level="0" text:name="Illustration"/>
                      <text:sequence-decl text:display-outline-level="0" text:name="Table"/>
                      <text:sequence-decl text:display-outline-level="0" text:name="Text"/>
                      <text:sequence-decl text:display-outline-level="0" text:name="Drawing"/>
                  </text:sequence-decls>
                  <xsl:apply-templates select="node()"/>
              </office:text>
          </office:body>
      </xsl:template>

      <xsl:template match="h1">
          <text:h text:style-name="Heading_20_1"><xsl:apply-templates select="node()"/></text:h>
      </xsl:template>

      <xsl:template match="h2">
          <text:h text:style-name="Heading_20_2"><xsl:apply-templates select="node()"/></text:h>
      </xsl:template>

      <xsl:template match="h3">
          <text:h text:style-name="Heading_20_3"><xsl:apply-templates select="node()"/></text:h>
      </xsl:template>

      <xsl:template match="h4">
          <text:h text:style-name="Heading_20_4"><xsl:apply-templates select="node()"/></text:h>
      </xsl:template>


<xsl:template match="p"> <text:p text:style-name="Standard"><xsl:apply-templates select="node()"/></text:p> </xsl:template>


<xsl:template match="table"> <table:table table:name="Table1" table:style-name="Table1"> <table:table-column table:style-name="Table1.A" table:number-columns-repeated="2"/> <!-- FIXME: should not do this... instead simply apply on node() and have template matches for tr[th] --> <xsl:for-each select="tr[th]"> <table:table-header-rows> <table:table-row> <xsl:apply-templates select="th|td"/> </table:table-row> </table:table-header-rows> </xsl:for-each> <xsl:for-each select="tr[td]"> <table:table-row> <xsl:apply-templates select="td"/> </table:table-row> </xsl:for-each> </table:table> </xsl:template>

      <xsl:template match="th|td">
          <table:table-cell table:style-name="Table1.A1" office:value-type="string">
              <xsl:call-template name="text_applyer"/>
          </table:table-cell>
      </xsl:template>

      <xsl:template match="ul">
          <text:list text:style-name="L1">
              <!-- FIXME: should not do this...
                   instead simply apply on node() and have template matches for li -->
              <xsl:for-each select="li">
                  <text:list-item><xsl:call-template name="text_applyer"/></text:list-item>
              </xsl:for-each>
          </text:list>
      </xsl:template>

      <xsl:template name="text_applyer">
          <xsl:choose>
              <xsl:when test="text()"><text:p text:style-name="Standard"><xsl:value-of select="."/></text:p>
              </xsl:when>
              <xsl:otherwise><xsl:apply-templates select="node()"/></xsl:otherwise>
          </xsl:choose>
      </xsl:template>

      <xsl:template match="p">
          <text:p text:style-name="Standard"><xsl:apply-templates select="node()"/></text:p>
          <text:p text:style-name="Standard"></text:p>
      </xsl:template>

</xsl:stylesheet>

I normally use it with a Makefile ruleset like this:

  doc.odt: doc/content.xml
          bash -c 'cd doc ; zip -r ../doc.odt *'


doc/content.xml: html2oo.xslt doc.html xsltproc --html html2oo.xslt doc.html > doc/content.xml

  doc:
          [ -d doc ] || ( mkdir doc ; unzip -d doc doc.odt )


-- Nic Ferrier http://www.tapsellferrier.co.uk

Current Thread

PURCHASE STYLUS STUDIO ONLINE TODAY!

Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced!

Buy Stylus Studio Now

Cast Your Vote

We need your help – Vote for DataDirect XML Products!

  • Best SOA or XML site

Winners and finalists announced at SOA World Conference in November.

Download The World's Best XML IDE!

Accelerate XML development with our award-winning XML IDE - Download a free trial today!

Don't miss another message! Subscribe to this list today.
Email
First Name
Last Name
Company
Subscribe in XML format
RSS 2.0
Atom 0.3
Site Map | Privacy Policy | Terms of Use | Trademarks
Free Stylus Studio XML Training:
W3C Member
Stylus Studio® and DataDirect XQuery™are products from DataDirect Technologies, is a registered trademark of Progress Software Corporation, in the U.S. and other countries. © 2004-2007 All Rights Reserved.