<?xml version="1.0" encoding="UTF-8"?> | |
<!--*********************************************************** | |
* | |
* Licensed to the Apache Software Foundation (ASF) under one | |
* or more contributor license agreements. See the NOTICE file | |
* distributed with this work for additional information | |
* regarding copyright ownership. The ASF licenses this file | |
* to you under the Apache License, Version 2.0 (the | |
* "License"); you may not use this file except in compliance | |
* with the License. You may obtain a copy of the License at | |
* | |
* http://www.apache.org/licenses/LICENSE-2.0 | |
* | |
* Unless required by applicable law or agreed to in writing, | |
* software distributed under the License is distributed on an | |
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | |
* KIND, either express or implied. See the License for the | |
* specific language governing permissions and limitations | |
* under the License. | |
* | |
***********************************************************--> | |
<!-- | |
For further documentation and updates visit http://xml.openoffice.org/odf2xhtml | |
--> | |
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" xmlns:config="urn:oasis:names:tc:opendocument:xmlns:config:1.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dom="http://www.w3.org/2001/xml-events" xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d: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:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" xmlns:math="http://www.w3.org/1998/Math/MathML" xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:ooo="http://openoffice.org/2004/office" xmlns:oooc="http://openoffice.org/2004/calc" xmlns:ooow="http://openoffice.org/2004/writer" xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:xforms="http://www.w3.org/2002/xforms" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" exclude-result-prefixes="chart config dc dom dr3d draw fo form math meta number office ooo oooc ooow script style svg table text xforms xlink xsd xsi"> | |
<!-- *** Properties with a 'fo:' prefix *** --> | |
<xsl:template match="@fo:background-color"> | |
<xsl:text>background-color:</xsl:text> | |
<xsl:value-of select="."/> | |
<xsl:text>; </xsl:text> | |
</xsl:template> | |
<xsl:template match="@fo:border | @fo:border-top | @fo:border-bottom | @fo:border-left | @fo:border-right"> | |
<xsl:variable name="borderType" select="substring-after(name(), ':')"/> | |
<xsl:choose> | |
<xsl:when test=". = 'none'"> | |
<xsl:value-of select="$borderType"/> | |
<xsl:text>-style:none; </xsl:text> | |
</xsl:when> | |
<xsl:otherwise> | |
<xsl:variable name="borderWidth" select="substring-before(., ' ')"/> | |
<xsl:variable name="borderStyle" select="substring-before(substring-after(., ' '), ' ')"/> | |
<xsl:variable name="borderColor" select="substring-after(substring-after(., ' '), ' ')"/> | |
<!-- More information at template 'round-up-border-width' --> | |
<xsl:variable name="borderWidthFixed"> | |
<xsl:call-template name="round-up-border-width"> | |
<xsl:with-param name="borderWidth" select="$borderWidth"/> | |
<xsl:with-param name="multiplier"> | |
<xsl:choose> | |
<xsl:when test="$borderStyle = 'double'">3</xsl:when> | |
<xsl:otherwise>1</xsl:otherwise> | |
</xsl:choose> | |
</xsl:with-param> | |
</xsl:call-template> | |
</xsl:variable> | |
<xsl:value-of select="$borderType"/> | |
<xsl:text>-width:</xsl:text> | |
<xsl:value-of select="$borderWidthFixed"/> | |
<xsl:text>; </xsl:text> | |
<xsl:value-of select="$borderType"/> | |
<xsl:text>-style:</xsl:text> | |
<xsl:value-of select="$borderStyle"/> | |
<xsl:text>; </xsl:text> | |
<xsl:value-of select="$borderType"/> | |
<xsl:text>-color:</xsl:text> | |
<xsl:value-of select="$borderColor"/> | |
<xsl:text>; </xsl:text> | |
</xsl:otherwise> | |
</xsl:choose> | |
</xsl:template> | |
<!-- NOTE: Still there have to be placed a <br clear='all' /> to disable the flow!!!!--> | |
<xsl:template match="@fo:clear"> | |
<xsl:text>clear:both; </xsl:text> | |
</xsl:template> | |
<!-- text-shadow is a CSS2 feature and yet not common used in user-agents --> | |
<xsl:template match="@fo:color |@svg:font-family |@fo:font-size |@fo:font-style |@fo:font-weight |@fo:text-indent |@fo:text-shadow"> | |
<xsl:value-of select="substring-after(name(), ':')"/> | |
<xsl:text>:</xsl:text> | |
<xsl:value-of select="."/> | |
<xsl:text>; </xsl:text> | |
</xsl:template> | |
<!-- Maps fo:margin as well fo:margin-top, fo:margin-bottom, fo:padding-left, fo:margin-right --> | |
<!-- Maps fo:padding as well fo:padding-top, fo:padding-bottom, fo:padding-left, fo:padding-right --> | |
<xsl:template match="@fo:letter-spacing | @fo:line-height | @fo:width |@fo:margin | @fo:margin-top | @fo:margin-bottom | @fo:margin-left | @fo:margin-right | @fo:padding | @fo:padding-top | @fo:padding-bottom | @fo:padding-left | @fo:padding-right"> | |
<xsl:value-of select="substring-after(name(), ':')"/> | |
<xsl:text>:</xsl:text> | |
<!-- Map once erroneusly used inch shortage 'inch' to CSS shortage 'in' --> | |
<xsl:choose> | |
<xsl:when test="contains(., 'inch')"> | |
<xsl:value-of select="substring-before(.,'ch')"/> | |
</xsl:when> | |
<xsl:otherwise> | |
<xsl:value-of select="."/> | |
</xsl:otherwise> | |
</xsl:choose> | |
<xsl:text>; </xsl:text> | |
</xsl:template> | |
<xsl:template match="@fo:text-align"> | |
<!-- 'important' is necessary as table cell value alignment is decided by runtime over the valuetype | |
Otherwise a table cell style-class would always be outnumbered by the run-time alignment value --> | |
<xsl:choose> | |
<xsl:when test="contains(., 'start')"> | |
<xsl:choose> | |
<xsl:when test="parent::*/@style:writing-mode and contains(parent::*/@style:writing-mode, 'rl')"> | |
<xsl:text>text-align:right ! important; </xsl:text> | |
</xsl:when> | |
<xsl:otherwise> | |
<xsl:text>text-align:left ! important; </xsl:text> | |
</xsl:otherwise> | |
</xsl:choose> | |
</xsl:when> | |
<xsl:when test="contains(., 'end')"> | |
<xsl:choose> | |
<xsl:when test="parent::*/@style:writing-mode and contains(parent::*/@style:writing-mode, 'rl')"> | |
<xsl:text>text-align:left ! important;</xsl:text> | |
</xsl:when> | |
<xsl:otherwise> | |
<xsl:text>text-align:right ! important; </xsl:text> | |
</xsl:otherwise> | |
</xsl:choose> | |
</xsl:when> | |
<xsl:otherwise> | |
<xsl:text>text-align:</xsl:text> | |
<xsl:value-of select="."/> | |
<xsl:text> ! important; </xsl:text> | |
</xsl:otherwise> | |
</xsl:choose> | |
</xsl:template> | |
<xsl:template match="@style:vertical-align"> | |
<xsl:choose> | |
<xsl:when test="contains(., 'bottom')"> | |
<xsl:text>vertical-align:bottom; </xsl:text> | |
</xsl:when> | |
<xsl:when test="contains(., 'middle')"> | |
<xsl:text>vertical-align:middle; </xsl:text> | |
</xsl:when> | |
<xsl:otherwise> | |
<xsl:text>vertical-align:top; </xsl:text> | |
</xsl:otherwise> | |
</xsl:choose> | |
</xsl:template> | |
<!-- *** Properties with a 'style:' prefix *** --> | |
<!-- NOTE: Can 'inside' | 'from-inside' better be handled: | |
<!ATTLIST * style:horizontal-pos (from-left|left|center|right|from-inside|inside|outside)#IMPLIED>--> | |
<xsl:template match="@style:horizontal-pos"> | |
<xsl:choose> | |
<xsl:when test=".='left'"> | |
<xsl:text>text-align:left; </xsl:text> | |
</xsl:when> | |
<xsl:when test=". = 'right'"> | |
<xsl:text>text-align:right; </xsl:text> | |
</xsl:when> | |
<xsl:when test=".='center'"> | |
<xsl:text>text-align:center; </xsl:text> | |
</xsl:when> | |
<!-- NOTE: currently other values are not used. | |
If the property value is from-left or from-inside, | |
the svg:x attribute associated with the frame element specifies | |
the horizontal position of the frame. | |
Otherwise the svg:x attribute is ignored for text documents. | |
--> | |
</xsl:choose> | |
</xsl:template> | |
<xsl:template match="@style:column-width"> | |
<xsl:text>width:</xsl:text> | |
<xsl:choose> | |
<!-- changing the distance measure: inch to in --> | |
<xsl:when test="contains(., 'inch')"> | |
<xsl:value-of select="substring-before(.,'ch')"/> | |
</xsl:when> | |
<xsl:otherwise> | |
<xsl:value-of select="."/> | |
</xsl:otherwise> | |
</xsl:choose> | |
<xsl:text>; </xsl:text> | |
</xsl:template> | |
<xsl:template match="@style:text-underline-style"> | |
<xsl:text>text-decoration:</xsl:text> | |
<xsl:choose> | |
<!-- changing the distance measure: inch to in --> | |
<xsl:when test=".='none'"> | |
<xsl:text>none ! important</xsl:text> | |
</xsl:when> | |
<xsl:otherwise> | |
<xsl:text>underline</xsl:text> | |
</xsl:otherwise> | |
</xsl:choose> | |
<xsl:text>; </xsl:text> | |
</xsl:template> | |
<xsl:template match="@style:font-name"> | |
<xsl:param name="globalData" /> | |
<xsl:text>font-family:</xsl:text> | |
<xsl:variable name="content" select="."/> | |
<xsl:variable name="quote">'</xsl:variable> | |
<xsl:variable name="fontName" select="$globalData/office:font-face-decls/style:font-face[@style:name=$content]/@svg:font-family" /> | |
<xsl:value-of select="translate($fontName, $quote, '')"/> | |
<xsl:text>; </xsl:text> | |
</xsl:template> | |
<xsl:template match="@style:row-height"> | |
<xsl:text>height:</xsl:text> | |
<xsl:choose> | |
<!-- changing the distance measure: inch to in --> | |
<xsl:when test="contains(., 'inch')"> | |
<xsl:value-of select="substring-before(.,'ch')"/> | |
</xsl:when> | |
<xsl:otherwise> | |
<xsl:value-of select="."/> | |
</xsl:otherwise> | |
</xsl:choose> | |
<xsl:text>; </xsl:text> | |
</xsl:template> | |
<xsl:template match="@svg:strikethrough-position"> | |
<xsl:if test="not(.='none')"> | |
<xsl:text>text-decoration:line-through; </xsl:text> | |
</xsl:if> | |
</xsl:template> | |
<xsl:template match="@style:text-position"> | |
<xsl:if test="contains(., 'sub')"> | |
<xsl:text>vertical-align:sub; </xsl:text> | |
<xsl:if test="contains(., '%')"> | |
<xsl:text>font-size:</xsl:text> | |
<xsl:value-of select="substring-after(., 'sub ')"/> | |
<xsl:text>;</xsl:text> | |
</xsl:if> | |
</xsl:if> | |
<xsl:if test="contains(., 'super')"> | |
<xsl:text>vertical-align:super; </xsl:text> | |
<xsl:if test="contains(., '%')"> | |
<xsl:text>font-size:</xsl:text> | |
<xsl:value-of select="substring-after(., 'super ')"/> | |
<xsl:text>;</xsl:text> | |
</xsl:if> | |
</xsl:if> | |
</xsl:template> | |
<xsl:template match="@style:vertical-pos"> | |
<xsl:choose> | |
<xsl:when test=".='from-top'"> | |
<xsl:text>vertical-align:top; </xsl:text> | |
</xsl:when> | |
<xsl:otherwise> | |
<xsl:text>vertical-align:</xsl:text> | |
<xsl:value-of select="."/> | |
<xsl:text>; </xsl:text> | |
</xsl:otherwise> | |
</xsl:choose> | |
</xsl:template> | |
<xsl:template match="@style:width"> | |
<xsl:text>width:</xsl:text> | |
<xsl:choose> | |
<!-- changing the distance measure: inch to in --> | |
<xsl:when test="contains(., 'inch')"> | |
<xsl:value-of select="substring-before(.,'ch')"/> | |
</xsl:when> | |
<xsl:otherwise> | |
<xsl:value-of select="."/> | |
</xsl:otherwise> | |
</xsl:choose> | |
<xsl:text>; </xsl:text> | |
</xsl:template> | |
<xsl:template match="@style:wrap"> | |
<xsl:choose> | |
<xsl:when test=".='left'"> | |
<xsl:text>float:right; </xsl:text> | |
</xsl:when> | |
<xsl:when test=".='right'"> | |
<xsl:text>float:left; </xsl:text> | |
</xsl:when> | |
</xsl:choose> | |
</xsl:template> | |
<xsl:template match="@style:writing-mode"> | |
<xsl:text>writing-mode:</xsl:text> | |
<xsl:value-of select="."/> | |
<xsl:text>; </xsl:text> | |
</xsl:template> | |
<!-- *** Properties with a no 'fo:' or 'style:' prefix *** --> | |
<xsl:template match="@table:align"> | |
<xsl:choose> | |
<xsl:when test=".='left'"> | |
<!-- Note: problems with meeting minutes example | |
<xsl:text>float:right; </xsl:text> --></xsl:when> | |
<xsl:when test=".='right'"> | |
<!-- Note: problems with meeting minutes example | |
<xsl:text>float:left; </xsl:text> --></xsl:when> | |
<xsl:otherwise> | |
<xsl:text>float:none; </xsl:text> | |
</xsl:otherwise> | |
</xsl:choose> | |
</xsl:template> | |
<xsl:template match="style:background-image"> | |
<xsl:text>background-image:url(</xsl:text> | |
<xsl:value-of select="@xlink:href"/> | |
<xsl:text>); </xsl:text> | |
<xsl:choose> | |
<xsl:when test="@style:repeat = 'repeat'"> | |
<xsl:text>background-repeat:repeat; </xsl:text> | |
</xsl:when> | |
<xsl:otherwise> | |
<xsl:text>background-repeat:no-repeat; </xsl:text> | |
</xsl:otherwise> | |
</xsl:choose> | |
</xsl:template> | |
<!-- Changing border width measure to cm and enlarging border-width to the Mozilla browser(1.7) | |
visible minimum width | |
- 0.0133cm for solid style | |
- 0.0399cm for double style | |
as there are three border lines painted --> | |
<xsl:template name="round-up-border-width"> | |
<xsl:param name="borderWidth"/> | |
<xsl:param name="multiplier"/> | |
<xsl:variable name="borderWidthByCentimeter"> | |
<xsl:call-template name="convert2cm"> | |
<xsl:with-param name="value" select="$borderWidth"/> | |
</xsl:call-template> | |
</xsl:variable> | |
<xsl:variable name="minimalBorderWidth" select="0.0133 * $multiplier"/> | |
<xsl:choose> | |
<xsl:when test="number($borderWidthByCentimeter) < $minimalBorderWidth"> | |
<xsl:value-of select="$minimalBorderWidth"/> | |
<xsl:text>cm</xsl:text> | |
</xsl:when> | |
<xsl:otherwise> | |
<xsl:value-of select="$borderWidthByCentimeter"/> | |
<xsl:text>cm</xsl:text> | |
</xsl:otherwise> | |
</xsl:choose> | |
</xsl:template> | |
</xsl:stylesheet> | |