1<?xml version="1.0" encoding="UTF-8"?>
2<!--***********************************************************
3 *
4 * Licensed to the Apache Software Foundation (ASF) under one
5 * or more contributor license agreements.  See the NOTICE file
6 * distributed with this work for additional information
7 * regarding copyright ownership.  The ASF licenses this file
8 * to you under the Apache License, Version 2.0 (the
9 * "License"); you may not use this file except in compliance
10 * with the License.  You may obtain a copy of the License at
11 *
12 *   http://www.apache.org/licenses/LICENSE-2.0
13 *
14 * Unless required by applicable law or agreed to in writing,
15 * software distributed under the License is distributed on an
16 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17 * KIND, either express or implied.  See the License for the
18 * specific language governing permissions and limitations
19 * under the License.
20 *
21 ***********************************************************-->
22
23
24<xsl:stylesheet version="1.0"
25	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
26	xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0"
27	xmlns:config="urn:oasis:names:tc:opendocument:xmlns:config:1.0"
28	xmlns:dc="http://purl.org/dc/elements/1.1/"
29	xmlns:dom="http://www.w3.org/2001/xml-events"
30	xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0"
31	xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0"
32	xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0"
33	xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0"
34	xmlns:math="http://www.w3.org/1998/Math/MathML"
35	xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0"
36	xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0"
37	xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0"
38	xmlns:ooo="http://openoffice.org/2004/office"
39	xmlns:oooc="http://openoffice.org/2004/calc"
40	xmlns:ooow="http://openoffice.org/2004/writer"
41	xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0"
42	xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0"
43	xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0"
44	xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0"
45	xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0"
46	xmlns:xlink="http://www.w3.org/1999/xlink"
47	xmlns:xt="http://www.jclark.com/xt"
48	xmlns:common="http://exslt.org/common"
49	xmlns:xalan="http://xml.apache.org/xalan"
50	xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:c="urn:schemas-microsoft-com:office:component:spreadsheet" xmlns:html="http://www.w3.org/TR/REC-html40" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:x2="http://schemas.microsoft.com/office/excel/2003/xml" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
51	exclude-result-prefixes="chart config dc dom dr3d draw fo form math meta number office ooo oooc ooow script style svg table text xlink xt common xalan">
52
53	<xsl:variable name="namespace-html" select="'http://www.w3.org/TR/REC-html40'" />
54
55	<xsl:template match="@table:style-name | @table:default-cell-style-name">
56		<xsl:if test="not(name() = 'Default')">
57			<xsl:attribute name="ss:StyleID">
58				<xsl:value-of  select="." />
59			</xsl:attribute>
60		</xsl:if>
61	</xsl:template>
62
63	<xsl:key match="table:table-cell" name="getCellByStyle" use="@table:style-name"/>
64	<xsl:template match="@table:style-name" mode="table-row">
65		<!-- only row styles used by cells are exported,
66			as usual row style properties are already written as row attributes -->
67		<xsl:if test="key('getCellByStyle', '.')">
68			<xsl:attribute name="ss:StyleID">
69				<xsl:value-of  select="." />
70			</xsl:attribute>
71		</xsl:if>
72	</xsl:template>
73
74	<xsl:template name="style-and-contents">
75		<xsl:param name="cellStyleName" />
76
77		<!-- WorkAround of Excel2003 issue:
78			Styles from the CellStyle will not be inherited to HTML content (e.g. Colour style).
79		-->
80		<xsl:choose>
81			<xsl:when test="@text:style-name">
82				<xsl:variable name="styles">
83					<xsl:copy-of select="key('styles', @text:style-name)/*" />
84					<xsl:copy-of select="key('styles', $cellStyleName)/*" />
85				</xsl:variable>
86				<xsl:choose>
87					<xsl:when test="function-available('xalan:nodeset')">
88						<xsl:call-template name="create-nested-format-tags">
89							<xsl:with-param name="styles" select="xalan:nodeset($styles)" />
90							<xsl:with-param name="cellStyleName" select="$cellStyleName" />
91						</xsl:call-template>
92					</xsl:when>
93					<xsl:when test="function-available('xt:node-set')">
94						<xsl:call-template name="create-nested-format-tags">
95							<xsl:with-param name="styles" select="xt:node-set($styles)" />
96							<xsl:with-param name="cellStyleName" select="$cellStyleName" />
97						</xsl:call-template>
98					</xsl:when>
99					<xsl:when test="function-available('common:node-set')">
100						<xsl:call-template name="create-nested-format-tags">
101							<xsl:with-param name="styles" select="common:node-set($styles)" />
102							<xsl:with-param name="cellStyleName" select="$cellStyleName" />
103						</xsl:call-template>
104					</xsl:when>
105					<xsl:otherwise>
106						<xsl:message terminate="yes">The required node-set function was not found!</xsl:message>
107					</xsl:otherwise>
108				</xsl:choose>
109			</xsl:when>
110			<xsl:when test="@table:style-name">
111				<xsl:variable name="styles">
112					<xsl:copy-of select="key('styles', @text:style-name)/*" />
113					<xsl:copy-of select="key('styles', $cellStyleName)/*" />
114				</xsl:variable>
115
116				<xsl:choose>
117					<xsl:when test="function-available('xalan:nodeset')">
118						<xsl:call-template name="create-nested-format-tags">
119							<xsl:with-param name="styles" select="xalan:nodeset($styles)" />
120							<xsl:with-param name="cellStyleName" select="$cellStyleName" />
121						</xsl:call-template>
122					</xsl:when>
123					<xsl:when test="function-available('xt:node-set')">
124						<xsl:call-template name="create-nested-format-tags">
125							<xsl:with-param name="styles" select="xt:node-set($styles)" />
126							<xsl:with-param name="cellStyleName" select="$cellStyleName" />
127						</xsl:call-template>
128					</xsl:when>
129					<xsl:when test="function-available('common:node-set')">
130						<xsl:call-template name="create-nested-format-tags">
131							<xsl:with-param name="styles" select="common:node-set($styles)" />
132							<xsl:with-param name="cellStyleName" select="$cellStyleName" />
133						</xsl:call-template>
134					</xsl:when>
135					<xsl:otherwise>
136						<xsl:message terminate="yes">The required node-set function was not found!</xsl:message>
137					</xsl:otherwise>
138				</xsl:choose>
139			</xsl:when>
140			<xsl:otherwise>
141				<xsl:apply-templates>
142					<xsl:with-param name="cellStyleName" select="$cellStyleName" />
143				</xsl:apply-templates>
144			</xsl:otherwise>
145		</xsl:choose>
146	</xsl:template>
147
148
149	<!-- *********************************** -->
150	<!-- *** creating nested format tags *** -->
151	<!-- *********************************** -->
152
153	<!-- Bold -->
154	<xsl:template name="create-nested-format-tags">
155		<xsl:param name="styles" />
156		<xsl:param name="cellStyleName" />
157
158		<xsl:choose>
159			<xsl:when test="$styles/*/@fo:font-weight = 'bold' or $styles/*/@fo:font-weight = 'bolder'">
160				<xsl:element namespace="{$namespace-html}" name="B">
161					<xsl:call-template name="italic">
162						<xsl:with-param name="styles" select="$styles" />
163						<xsl:with-param name="cellStyleName" select="$cellStyleName" />
164					</xsl:call-template>
165				</xsl:element>
166			</xsl:when>
167			<xsl:otherwise>
168				<xsl:call-template name="italic">
169					<xsl:with-param name="styles" select="$styles" />
170					<xsl:with-param name="cellStyleName" select="$cellStyleName" />
171				</xsl:call-template>
172			</xsl:otherwise>
173		</xsl:choose>
174	</xsl:template>
175
176
177	<!-- Italic -->
178	<xsl:template name="italic">
179		<xsl:param name="styles" />
180		<xsl:param name="cellStyleName" />
181
182		<xsl:choose>
183			<xsl:when test="$styles/*/@fo:font-style = 'italic' or $styles/*/@fo:font-style = 'oblique'">
184				<xsl:element namespace="{$namespace-html}" name="I">
185					<xsl:call-template name="underline">
186						<xsl:with-param name="styles" select="$styles" />
187						<xsl:with-param name="cellStyleName" select="$cellStyleName" />
188					</xsl:call-template>
189				</xsl:element>
190			</xsl:when>
191			<xsl:otherwise>
192				<xsl:call-template name="underline">
193					<xsl:with-param name="styles" select="$styles" />
194					<xsl:with-param name="cellStyleName" select="$cellStyleName" />
195				</xsl:call-template>
196			</xsl:otherwise>
197		</xsl:choose>
198	</xsl:template>
199
200
201	<!-- Underline -->
202	<xsl:template name="underline">
203		<xsl:param name="styles" />
204		<xsl:param name="cellStyleName" />
205
206		<xsl:choose>
207			<xsl:when test="$styles/*/@style:text-underline-type and not($styles/*/@style:text-underline-type = 'none')">
208				<xsl:element namespace="{$namespace-html}" name="U">
209					<xsl:call-template name="strikethrough">
210						<xsl:with-param name="styles" select="$styles" />
211						<xsl:with-param name="cellStyleName" select="$cellStyleName" />
212					</xsl:call-template>
213				</xsl:element>
214			</xsl:when>
215			<xsl:otherwise>
216				<xsl:call-template name="strikethrough">
217					<xsl:with-param name="styles" select="$styles" />
218					<xsl:with-param name="cellStyleName" select="$cellStyleName" />
219				</xsl:call-template>
220			</xsl:otherwise>
221		</xsl:choose>
222
223	</xsl:template>
224
225
226	<!-- strikethrough -->
227	<xsl:template name="strikethrough">
228		<xsl:param name="styles" />
229		<xsl:param name="cellStyleName" />
230
231		<xsl:choose>
232			<xsl:when test="$styles/*/@style:text-line-through-style and not($styles/*/@style:text-line-through-style = 'none')">
233				<xsl:element namespace="{$namespace-html}" name="S">
234					<xsl:call-template name="super-subscript">
235						<xsl:with-param name="styles" select="$styles" />
236						<xsl:with-param name="cellStyleName" select="$cellStyleName" />
237					</xsl:call-template>
238				</xsl:element>
239			</xsl:when>
240			<xsl:otherwise>
241				<xsl:call-template name="super-subscript">
242					<xsl:with-param name="styles" select="$styles" />
243					<xsl:with-param name="cellStyleName" select="$cellStyleName" />
244				</xsl:call-template>
245			</xsl:otherwise>
246		</xsl:choose>
247	</xsl:template>
248
249
250
251	<!-- superscript & subscript -->
252	<xsl:template name="super-subscript">
253		<xsl:param name="styles" />
254		<xsl:param name="cellStyleName" />
255
256		<xsl:choose>
257			<xsl:when test="$styles/*/@style:text-position">
258				<xsl:variable name="textPosition" select="number(substring-before($styles/*/@style:text-position, '% '))" />
259				<xsl:choose>
260					<xsl:when test="$textPosition &gt; 0">
261						<xsl:element namespace="{$namespace-html}" name="Sup">
262							<xsl:call-template name="align">
263								<xsl:with-param name="styles" select="$styles" />
264								<xsl:with-param name="cellStyleName" select="$cellStyleName" />
265							</xsl:call-template>
266						</xsl:element>
267					</xsl:when>
268					<xsl:when test="$textPosition &lt; 0">
269						<xsl:element namespace="{$namespace-html}" name="Sub">
270							<xsl:call-template name="align">
271								<xsl:with-param name="styles" select="$styles" />
272								<xsl:with-param name="cellStyleName" select="$cellStyleName" />
273							</xsl:call-template>
274						</xsl:element>
275					</xsl:when>
276					<xsl:otherwise>
277						<xsl:call-template name="align">
278							<xsl:with-param name="styles" select="$styles" />
279							<xsl:with-param name="cellStyleName" select="$cellStyleName" />
280						</xsl:call-template>
281					</xsl:otherwise>
282				</xsl:choose>
283			</xsl:when>
284			<xsl:otherwise>
285				<xsl:call-template name="align">
286					<xsl:with-param name="styles" select="$styles" />
287					<xsl:with-param name="cellStyleName" select="$cellStyleName" />
288				</xsl:call-template>
289			</xsl:otherwise>
290		</xsl:choose>
291	</xsl:template>
292
293
294	<!-- Alignment - normally called by strikethrough, but no DIV elements in HTML -->
295	<xsl:template name="align">
296		<xsl:param name="styles" />
297		<xsl:param name="cellStyleName" />
298
299		<xsl:choose>
300			<xsl:when test="$styles/*/@fo:font-align">
301				<xsl:element namespace="{$namespace-html}" name="DIV">
302					<xsl:attribute name="html:style">
303						 <xsl:choose>
304							<xsl:when test="$styles/*/@fo:font-align = 'start'">
305								<xsl:text>text-align:left;</xsl:text>
306							</xsl:when>
307							<xsl:when test="$styles/*/@fo:font-align = 'end'">
308								<xsl:text>text-align:right;</xsl:text>
309							</xsl:when>
310							<xsl:otherwise>
311								<xsl:text>text-align:center;</xsl:text>
312							</xsl:otherwise>
313						 </xsl:choose>
314					</xsl:attribute>
315					<xsl:call-template name="font">
316						<xsl:with-param name="styles" select="$styles" />
317						<xsl:with-param name="cellStyleName" select="$cellStyleName" />
318					</xsl:call-template>
319				</xsl:element>
320			</xsl:when>
321			<xsl:otherwise>
322				<xsl:call-template name="font">
323					<xsl:with-param name="styles" select="$styles" />
324					<xsl:with-param name="cellStyleName" select="$cellStyleName" />
325				</xsl:call-template>
326			</xsl:otherwise>
327		</xsl:choose>
328	</xsl:template>
329
330
331	<!-- Font (size and color)  -->
332	<xsl:template name="font">
333		<xsl:param name="styles" />
334		<xsl:param name="cellStyleName" />
335
336		<xsl:choose>
337			<xsl:when test="$styles/*/@style:font-name or
338							$styles/*/@fo:font-size or
339							$styles/*/@fo:color">
340				<xsl:element namespace="{$namespace-html}" name="Font">
341					<xsl:if test="$styles/*/@style:font-name">
342						<xsl:attribute name="html:Face">
343							 <xsl:value-of select="$styles/*/@style:font-name" />
344						</xsl:attribute>
345					</xsl:if>
346					<xsl:if test="$styles/*/@fo:color">
347						<xsl:attribute name="html:Color">
348							 <xsl:value-of select="$styles/*/@fo:color" />
349						</xsl:attribute>
350					</xsl:if>
351					<xsl:if test="$styles/*/@fo:font-size">
352						<!-- WORKAROUND TO EXCEL2003 issue where nested FONT elements with size attributes result in unloadable documents -->
353						<!-- Only create size attribute if parent do not have already one -->
354
355						<!--<xsl:choose>
356							<xsl:when test="not(key('styles', parent::*/@text:style-name)/*/@fo:font-size)"> -->
357						<xsl:if test="not(key('styles', parent::*/@text:style-name)/*/@fo:font-size)">
358							<xsl:attribute name="html:Size">
359								<xsl:call-template name="convert2pt">
360									<xsl:with-param name="value" select="$styles/*/@fo:font-size" />
361									<xsl:with-param name="cellStyleName" select="$cellStyleName" />
362								</xsl:call-template>
363							</xsl:attribute>
364						</xsl:if>
365						<!--</xsl:when>
366							<xsl:otherwise>
367								<xsl:message>Due Excel issue we have to neglect size from @text:style-name '<xsl:value-of select="@text:style-name"/>'!</xsl:message>
368							</xsl:otherwise>
369						</xsl:choose>-->
370					</xsl:if>
371					<!-- get the embedded content -->
372					<xsl:apply-templates>
373						<xsl:with-param name="cellStyleName" select="$cellStyleName" />
374					</xsl:apply-templates>
375				</xsl:element>
376			</xsl:when>
377			<xsl:otherwise>
378				<!-- get the embedded content -->
379				<xsl:apply-templates>
380					<xsl:with-param name="cellStyleName" select="$cellStyleName" />
381				</xsl:apply-templates>
382			</xsl:otherwise>
383		</xsl:choose>
384	</xsl:template>
385
386</xsl:stylesheet>
387