1cdf0e10cSrcweir<?xml version="1.0" encoding="UTF-8"?>
2*1e519d8dSAndrew Rist<!--***********************************************************
3*1e519d8dSAndrew Rist *
4*1e519d8dSAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one
5*1e519d8dSAndrew Rist * or more contributor license agreements.  See the NOTICE file
6*1e519d8dSAndrew Rist * distributed with this work for additional information
7*1e519d8dSAndrew Rist * regarding copyright ownership.  The ASF licenses this file
8*1e519d8dSAndrew Rist * to you under the Apache License, Version 2.0 (the
9*1e519d8dSAndrew Rist * "License"); you may not use this file except in compliance
10*1e519d8dSAndrew Rist * with the License.  You may obtain a copy of the License at
11*1e519d8dSAndrew Rist *
12*1e519d8dSAndrew Rist *   http://www.apache.org/licenses/LICENSE-2.0
13*1e519d8dSAndrew Rist *
14*1e519d8dSAndrew Rist * Unless required by applicable law or agreed to in writing,
15*1e519d8dSAndrew Rist * software distributed under the License is distributed on an
16*1e519d8dSAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17*1e519d8dSAndrew Rist * KIND, either express or implied.  See the License for the
18*1e519d8dSAndrew Rist * specific language governing permissions and limitations
19*1e519d8dSAndrew Rist * under the License.
20*1e519d8dSAndrew Rist *
21*1e519d8dSAndrew Rist ***********************************************************-->
22cdf0e10cSrcweir
23cdf0e10cSrcweir
24cdf0e10cSrcweir<xsl:stylesheet version="1.0"
25cdf0e10cSrcweir	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
26cdf0e10cSrcweir	xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0"
27cdf0e10cSrcweir	xmlns:config="urn:oasis:names:tc:opendocument:xmlns:config:1.0"
28cdf0e10cSrcweir	xmlns:dc="http://purl.org/dc/elements/1.1/"
29cdf0e10cSrcweir	xmlns:dom="http://www.w3.org/2001/xml-events"
30cdf0e10cSrcweir	xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0"
31cdf0e10cSrcweir	xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0"
32cdf0e10cSrcweir	xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0"
33cdf0e10cSrcweir	xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0"
34cdf0e10cSrcweir	xmlns:math="http://www.w3.org/1998/Math/MathML"
35cdf0e10cSrcweir	xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0"
36cdf0e10cSrcweir	xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0"
37cdf0e10cSrcweir	xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0"
38cdf0e10cSrcweir	xmlns:ooo="http://openoffice.org/2004/office"
39cdf0e10cSrcweir	xmlns:oooc="http://openoffice.org/2004/calc"
40cdf0e10cSrcweir	xmlns:ooow="http://openoffice.org/2004/writer"
41cdf0e10cSrcweir	xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0"
42cdf0e10cSrcweir	xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0"
43cdf0e10cSrcweir	xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0"
44cdf0e10cSrcweir	xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0"
45cdf0e10cSrcweir	xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0"
46cdf0e10cSrcweir	xmlns:xlink="http://www.w3.org/1999/xlink"
47cdf0e10cSrcweir	xmlns:xt="http://www.jclark.com/xt"
48cdf0e10cSrcweir	xmlns:common="http://exslt.org/common"
49cdf0e10cSrcweir	xmlns:xalan="http://xml.apache.org/xalan"
50cdf0e10cSrcweir	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"
51cdf0e10cSrcweir	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">
52cdf0e10cSrcweir
53cdf0e10cSrcweir
54cdf0e10cSrcweir	<!-- ************** -->
55cdf0e10cSrcweir	<!-- *** Table  *** -->
56cdf0e10cSrcweir	<!-- ************** -->
57cdf0e10cSrcweir
58cdf0e10cSrcweir	<!-- check existence of default cell style -->
59cdf0e10cSrcweir	<xsl:variable name="firstDefaultCellStyle" select="descendant::table:table-column/@table:default-cell-style-name" />
60cdf0e10cSrcweir
61cdf0e10cSrcweir
62cdf0e10cSrcweir	<xsl:template match="table:table" name="table:table">
63cdf0e10cSrcweir		<xsl:element name="Table">
64cdf0e10cSrcweir			<xsl:apply-templates select="@table:style-name" />
65cdf0e10cSrcweir
66cdf0e10cSrcweir			<!-- find all columns in the table -->
67cdf0e10cSrcweir			<xsl:variable name="columnNodes" select="descendant::table:table-column" />
68cdf0e10cSrcweir			<!-- calculate the overall column amount -->
69cdf0e10cSrcweir			<xsl:variable name="maxColumnNo">
70cdf0e10cSrcweir				<xsl:choose>
71cdf0e10cSrcweir					<xsl:when test="$columnNodes/@table:number-columns-repeated">
72cdf0e10cSrcweir						<xsl:value-of select="count($columnNodes)
73cdf0e10cSrcweir											+ number(sum($columnNodes/@table:number-columns-repeated))
74cdf0e10cSrcweir											- count($columnNodes/@table:number-columns-repeated)" />
75cdf0e10cSrcweir					</xsl:when>
76cdf0e10cSrcweir					<xsl:otherwise>
77cdf0e10cSrcweir						<xsl:value-of select="count($columnNodes)"/>
78cdf0e10cSrcweir					</xsl:otherwise>
79cdf0e10cSrcweir				</xsl:choose>
80cdf0e10cSrcweir			</xsl:variable>
81cdf0e10cSrcweir			<!-- create columns -->
82cdf0e10cSrcweir			<xsl:apply-templates select="$columnNodes[1]">
83cdf0e10cSrcweir				<xsl:with-param name="columnNodes"  select="$columnNodes" />
84cdf0e10cSrcweir				<xsl:with-param name="maxColumnNo"  select="$maxColumnNo" />
85cdf0e10cSrcweir			</xsl:apply-templates>
86cdf0e10cSrcweir
87cdf0e10cSrcweir			<!-- create rows -->
88cdf0e10cSrcweir			<xsl:choose>
89cdf0e10cSrcweir				<xsl:when test="not($columnNodes/@table:number-columns-repeated)">
90cdf0e10cSrcweir					<xsl:call-template name="optimized-row-handling">
91cdf0e10cSrcweir						<xsl:with-param name="rowNodes"  		select="descendant::table:table-row" />
92cdf0e10cSrcweir						<xsl:with-param name="columnNodes"      select="$columnNodes" />
93cdf0e10cSrcweir					</xsl:call-template>
94cdf0e10cSrcweir				</xsl:when>
95cdf0e10cSrcweir				<xsl:otherwise>
96cdf0e10cSrcweir					<!-- To be able to match from a cell to the corresponding column to match @table:default-cell-style-name,
97cdf0e10cSrcweir						the repeated columns are being resolved by copying them in a helper variable -->
98cdf0e10cSrcweir					<xsl:variable name="columnNodes-RTF">
99cdf0e10cSrcweir						<xsl:for-each select="$columnNodes">
100cdf0e10cSrcweir							<xsl:call-template name="adding-column-styles-entries" />
101cdf0e10cSrcweir						</xsl:for-each>
102cdf0e10cSrcweir					</xsl:variable>
103cdf0e10cSrcweir					<xsl:choose>
104cdf0e10cSrcweir						<xsl:when test="function-available('xalan:nodeset')">
105cdf0e10cSrcweir							<xsl:call-template name="optimized-row-handling">
106cdf0e10cSrcweir								<xsl:with-param name="rowNodes"  		select="descendant::table:table-row" />
107cdf0e10cSrcweir								<xsl:with-param name="columnNodes"      select="xalan:nodeset($columnNodes-RTF)" />
108cdf0e10cSrcweir							</xsl:call-template>
109cdf0e10cSrcweir						</xsl:when>
110cdf0e10cSrcweir						<xsl:when test="function-available('common:node-set')">
111cdf0e10cSrcweir							<xsl:call-template name="optimized-row-handling">
112cdf0e10cSrcweir								<xsl:with-param name="rowNodes"  		select="descendant::table:table-row" />
113cdf0e10cSrcweir								<xsl:with-param name="columnNodes"      select="common:node-set($columnNodes-RTF)" />
114cdf0e10cSrcweir							</xsl:call-template>
115cdf0e10cSrcweir						</xsl:when>
116cdf0e10cSrcweir						<xsl:when test="function-available('xt:node-set')">
117cdf0e10cSrcweir							<xsl:call-template name="optimized-row-handling">
118cdf0e10cSrcweir								<xsl:with-param name="rowNodes"  		select="descendant::table:table-row" />
119cdf0e10cSrcweir								<xsl:with-param name="columnNodes"      select="xt:node-set($columnNodes-RTF)" />
120cdf0e10cSrcweir							</xsl:call-template>
121cdf0e10cSrcweir						</xsl:when>
122cdf0e10cSrcweir					</xsl:choose>
123cdf0e10cSrcweir				</xsl:otherwise>
124cdf0e10cSrcweir			</xsl:choose>
125cdf0e10cSrcweir		</xsl:element>
126cdf0e10cSrcweir	</xsl:template>
127cdf0e10cSrcweir
128cdf0e10cSrcweir
129cdf0e10cSrcweir	<!-- **************** -->
130cdf0e10cSrcweir	<!-- *** Columns  *** -->
131cdf0e10cSrcweir	<!-- **************** -->
132cdf0e10cSrcweir
133cdf0e10cSrcweir	<xsl:template match="table:table-column">
134cdf0e10cSrcweir		<xsl:param name="columnNodes"  />
135cdf0e10cSrcweir		<xsl:param name="currentColumnNumber" select="1" />
136cdf0e10cSrcweir		<xsl:param name="setIndex" select="false()" />
137cdf0e10cSrcweir		<xsl:param name="maxColumnNo" />
138cdf0e10cSrcweir
139cdf0e10cSrcweir		<xsl:element name="Column">
140cdf0e10cSrcweir			<xsl:if test="@table:visibility = 'collapse' or @table:visibility = 'filter'">
141cdf0e10cSrcweir				<xsl:attribute name="ss:Hidden">1</xsl:attribute>
142cdf0e10cSrcweir			</xsl:if>
143cdf0e10cSrcweir
144cdf0e10cSrcweir			<xsl:if test="@table:number-columns-repeated">
145cdf0e10cSrcweir				<xsl:attribute name="ss:Span">
146cdf0e10cSrcweir					<xsl:value-of select="@table:number-columns-repeated - 1" />
147cdf0e10cSrcweir				</xsl:attribute>
148cdf0e10cSrcweir			</xsl:if>
149cdf0e10cSrcweir
150cdf0e10cSrcweir		   <xsl:if test="$setIndex">
151cdf0e10cSrcweir				<xsl:attribute name="ss:Index">
152cdf0e10cSrcweir					<xsl:value-of select="$currentColumnNumber" />
153cdf0e10cSrcweir				</xsl:attribute>
154cdf0e10cSrcweir			</xsl:if>
155cdf0e10cSrcweir
156cdf0e10cSrcweir			<xsl:choose>
157cdf0e10cSrcweir				<xsl:when test="@style:use-optimal-column-width = 'true'">
158cdf0e10cSrcweir					<xsl:attribute name="ss:AutoFitWidth">1</xsl:attribute>
159cdf0e10cSrcweir				</xsl:when>
160cdf0e10cSrcweir				<xsl:otherwise>
161cdf0e10cSrcweir					<xsl:variable name="width" select="key('styles', @table:style-name)/style:table-column-properties/@style:column-width" />
162cdf0e10cSrcweir					<xsl:if test="$width">
163cdf0e10cSrcweir						<xsl:attribute name="ss:Width">
164cdf0e10cSrcweir							<!-- using the absolute width in point -->
165cdf0e10cSrcweir							<xsl:call-template name="convert2pt">
166cdf0e10cSrcweir								<xsl:with-param name="value" select="$width" />
167cdf0e10cSrcweir							</xsl:call-template>
168cdf0e10cSrcweir						</xsl:attribute>
169cdf0e10cSrcweir					</xsl:if>
170cdf0e10cSrcweir				</xsl:otherwise>
171cdf0e10cSrcweir			</xsl:choose>
172cdf0e10cSrcweir
173cdf0e10cSrcweir			<xsl:if test="@table:number-columns-repeated">
174cdf0e10cSrcweir				<xsl:attribute name="ss:Span">
175cdf0e10cSrcweir					<xsl:value-of select="@table:number-columns-repeated - 1" />
176cdf0e10cSrcweir				</xsl:attribute>
177cdf0e10cSrcweir			</xsl:if>
178cdf0e10cSrcweir		</xsl:element>
179cdf0e10cSrcweir
180cdf0e10cSrcweir		<xsl:variable name="columnNumber">
181cdf0e10cSrcweir			<xsl:choose>
182cdf0e10cSrcweir				<xsl:when test="@table:number-columns-repeated">
183cdf0e10cSrcweir					<xsl:value-of select="$currentColumnNumber + @table:number-columns-repeated"/>
184cdf0e10cSrcweir				</xsl:when>
185cdf0e10cSrcweir				<xsl:otherwise>
186cdf0e10cSrcweir					<xsl:value-of select="$currentColumnNumber"/>
187cdf0e10cSrcweir			   </xsl:otherwise>
188cdf0e10cSrcweir		   </xsl:choose>
189cdf0e10cSrcweir	   </xsl:variable>
190cdf0e10cSrcweir		<xsl:if test="$columnNumber &lt; $maxColumnNo">
191cdf0e10cSrcweir			<xsl:variable name="nextColumnNodes" select="$columnNodes[position() != 1]" />
192cdf0e10cSrcweir			<xsl:choose>
193cdf0e10cSrcweir				<xsl:when test="@table:number-columns-repeated">
194cdf0e10cSrcweir					<xsl:apply-templates select="$nextColumnNodes[1]">
195cdf0e10cSrcweir						<xsl:with-param name="columnNodes"   		select="$nextColumnNodes" />
196cdf0e10cSrcweir						<xsl:with-param name="currentColumnNumber"  select="$columnNumber" />
197cdf0e10cSrcweir						<xsl:with-param name="maxColumnNo"   		select="$maxColumnNo" />
198cdf0e10cSrcweir						<xsl:with-param name="setIndex"      		select="true()" />
199cdf0e10cSrcweir					</xsl:apply-templates>
200cdf0e10cSrcweir				</xsl:when>
201cdf0e10cSrcweir				<xsl:otherwise>
202cdf0e10cSrcweir					<xsl:apply-templates select="$nextColumnNodes[1]">
203cdf0e10cSrcweir						<xsl:with-param name="columnNodes"   		select="$nextColumnNodes" />
204cdf0e10cSrcweir						<xsl:with-param name="currentColumnNumber"  select="$columnNumber + 1" />
205cdf0e10cSrcweir						<xsl:with-param name="maxColumnNo"   		select="$maxColumnNo" />
206cdf0e10cSrcweir					</xsl:apply-templates>
207cdf0e10cSrcweir				</xsl:otherwise>
208cdf0e10cSrcweir			</xsl:choose>
209cdf0e10cSrcweir		</xsl:if>
210cdf0e10cSrcweir	</xsl:template>
211cdf0e10cSrcweir
212cdf0e10cSrcweir	<!-- current node is a table:table-column -->
213cdf0e10cSrcweir	<xsl:template name="adding-column-styles-entries">
214cdf0e10cSrcweir		<xsl:choose>
215cdf0e10cSrcweir			<xsl:when test="not(@table:number-columns-repeated and @table:number-columns-repeated > 1)">
216cdf0e10cSrcweir				<!-- writes an entry of a column in the columns-variable -->
217cdf0e10cSrcweir				<xsl:copy-of select="." />
218cdf0e10cSrcweir			</xsl:when>
219cdf0e10cSrcweir			<xsl:otherwise>
220cdf0e10cSrcweir				<!-- repeated colums will be written explicit several times in the variable-->
221cdf0e10cSrcweir				<xsl:call-template name="repeat-adding-table-column">
222cdf0e10cSrcweir					<xsl:with-param name="numberColumnsRepeated"  select="@table:number-columns-repeated" />
223cdf0e10cSrcweir				</xsl:call-template>
224cdf0e10cSrcweir			</xsl:otherwise>
225cdf0e10cSrcweir		</xsl:choose>
226cdf0e10cSrcweir	 </xsl:template>
227cdf0e10cSrcweir
228cdf0e10cSrcweir
229cdf0e10cSrcweir	<!-- current node is a table:table-column -->
230cdf0e10cSrcweir	<!-- dublicates column elements in case of column-repeated attribute  -->
231cdf0e10cSrcweir	<xsl:template name="repeat-adding-table-column">
232cdf0e10cSrcweir		<xsl:param name="table:table-column" />
233cdf0e10cSrcweir		<xsl:param name="numberColumnsRepeated" />
234cdf0e10cSrcweir
235cdf0e10cSrcweir		<xsl:choose>
236cdf0e10cSrcweir			<xsl:when test="$numberColumnsRepeated > 1">
237cdf0e10cSrcweir				<!-- writes an entry of a column in the columns-variable -->
238cdf0e10cSrcweir				<xsl:copy-of select="." />
239cdf0e10cSrcweir				<!-- repeat calling this method until all elements written out -->
240cdf0e10cSrcweir				<xsl:call-template name="repeat-adding-table-column">
241cdf0e10cSrcweir					<xsl:with-param name="numberColumnsRepeated"    select="$numberColumnsRepeated - 1" />
242cdf0e10cSrcweir				</xsl:call-template>
243cdf0e10cSrcweir			</xsl:when>
244cdf0e10cSrcweir			<xsl:otherwise>
245cdf0e10cSrcweir				<!-- writes an entry of a column in the columns-variable -->
246cdf0e10cSrcweir				<xsl:copy-of select="." />
247cdf0e10cSrcweir			</xsl:otherwise>
248cdf0e10cSrcweir		</xsl:choose>
249cdf0e10cSrcweir	</xsl:template>
250cdf0e10cSrcweir
251cdf0e10cSrcweir
252cdf0e10cSrcweir	<!-- ************* -->
253cdf0e10cSrcweir	<!-- *** Rows  *** -->
254cdf0e10cSrcweir	<!-- ************* -->
255cdf0e10cSrcweir
256cdf0e10cSrcweir
257cdf0e10cSrcweir	<!-- Recursions are much faster when the stack size is small 	-->
258cdf0e10cSrcweir	<xsl:template name="optimized-row-handling">
259cdf0e10cSrcweir		<xsl:param name="rowNodes" />
260cdf0e10cSrcweir		<xsl:param name="columnNodes"  />
261cdf0e10cSrcweir		<xsl:param name="offset" select="0"/>
262cdf0e10cSrcweir		<xsl:param name="threshold" select="10"/>
263cdf0e10cSrcweir
264cdf0e10cSrcweir		<xsl:variable name="rowCount" select="count($rowNodes)"/>
265cdf0e10cSrcweir		<xsl:choose>
266cdf0e10cSrcweir			<xsl:when test="$rowCount &lt;= $threshold">
267cdf0e10cSrcweir				<xsl:apply-templates select="$rowNodes[1]">
268cdf0e10cSrcweir					<xsl:with-param name="rowNodes" select="$rowNodes" />
269cdf0e10cSrcweir					<xsl:with-param name="offset" select="$offset" />
270cdf0e10cSrcweir					<xsl:with-param name="columnNodes" select="$columnNodes" />
271cdf0e10cSrcweir				</xsl:apply-templates>
272cdf0e10cSrcweir			</xsl:when>
273cdf0e10cSrcweir			<xsl:otherwise>
274cdf0e10cSrcweir				<xsl:variable name="rowCountHalf" select="floor($rowCount div 2)"/>
275cdf0e10cSrcweir				<xsl:variable name="rowNodesSetA" select="$rowNodes[position() &lt;= $rowCountHalf]"/>
276cdf0e10cSrcweir				<xsl:variable name="rowNodesSetB" select="$rowNodes[position() &gt; $rowCountHalf]"/>
277cdf0e10cSrcweir				<!-- to keep track of the rownumber, the repeteated rows have to kept into accounts -->
278cdf0e10cSrcweir				<xsl:variable name="rowsCreatedByRepetition">
279cdf0e10cSrcweir				<xsl:choose>
280cdf0e10cSrcweir					<xsl:when test="$rowNodesSetA/@table:number-rows-repeated">
281cdf0e10cSrcweir						<xsl:value-of select="number(sum($rowNodesSetA/@table:number-rows-repeated))
282cdf0e10cSrcweir											- count($rowNodesSetA/@table:number-rows-repeated)" />
283cdf0e10cSrcweir					</xsl:when>
284cdf0e10cSrcweir					<xsl:otherwise>0</xsl:otherwise>
285cdf0e10cSrcweir					</xsl:choose>
286cdf0e10cSrcweir				</xsl:variable>
287cdf0e10cSrcweir				<xsl:choose>
288cdf0e10cSrcweir					<xsl:when test="$rowCountHalf &gt; $threshold">
289cdf0e10cSrcweir						<xsl:call-template name="optimized-row-handling">
290cdf0e10cSrcweir							<xsl:with-param name="rowNodes" select="$rowNodesSetA"/>
291cdf0e10cSrcweir							<xsl:with-param name="offset" select="$offset" />
292cdf0e10cSrcweir							<xsl:with-param name="columnNodes" select="$columnNodes" />
293cdf0e10cSrcweir						</xsl:call-template>
294cdf0e10cSrcweir						<xsl:call-template name="optimized-row-handling">
295cdf0e10cSrcweir							<xsl:with-param name="rowNodes" select="$rowNodesSetB"/>
296cdf0e10cSrcweir							<xsl:with-param name="offset" select="$offset + $rowCountHalf + $rowsCreatedByRepetition" />
297cdf0e10cSrcweir							<xsl:with-param name="columnNodes" select="$columnNodes" />
298cdf0e10cSrcweir						</xsl:call-template>
299cdf0e10cSrcweir					</xsl:when>
300cdf0e10cSrcweir					<xsl:otherwise>
301cdf0e10cSrcweir						<xsl:apply-templates select="$rowNodesSetA[1]">
302cdf0e10cSrcweir							<xsl:with-param name="rowNodes" select="$rowNodesSetA"/>
303cdf0e10cSrcweir							<xsl:with-param name="offset" select="$offset" />
304cdf0e10cSrcweir							<xsl:with-param name="columnNodes" select="$columnNodes" />
305cdf0e10cSrcweir						</xsl:apply-templates>
306cdf0e10cSrcweir						<xsl:apply-templates select="$rowNodesSetB[1]">
307cdf0e10cSrcweir							<xsl:with-param name="rowNodes" select="$rowNodesSetB" />
308cdf0e10cSrcweir							<xsl:with-param name="offset" select="$offset + $rowCountHalf + $rowsCreatedByRepetition" />
309cdf0e10cSrcweir							<xsl:with-param name="columnNodes" select="$columnNodes" />
310cdf0e10cSrcweir						</xsl:apply-templates>
311cdf0e10cSrcweir					</xsl:otherwise>
312cdf0e10cSrcweir				</xsl:choose>
313cdf0e10cSrcweir			</xsl:otherwise>
314cdf0e10cSrcweir		</xsl:choose>
315cdf0e10cSrcweir	</xsl:template>
316cdf0e10cSrcweir
317cdf0e10cSrcweir	<!--
318cdf0e10cSrcweir		Rows as "table:table-row" might be grouped in
319cdf0e10cSrcweir		"table:table-header-rows" or "table:table-row-group"
320cdf0e10cSrcweir		This row-tree will be traversed providing each Row with it's
321cdf0e10cSrcweir		calculatedRowPosition and earlierRowNumber.
322cdf0e10cSrcweir		By this repeated empty rows might be neglected in the spreadsheetml output,
323cdf0e10cSrcweir		as the following row will notice the 'gap' and provide @ss:Index,
324cdf0e10cSrcweir		which results in filling up the gap by a row without style and content.
325cdf0e10cSrcweir
326cdf0e10cSrcweir		In Excel created rows by ss:Index are 'default' rows.
327cdf0e10cSrcweir	-->
328cdf0e10cSrcweir	<xsl:template match="table:table-row">
329cdf0e10cSrcweir		<xsl:param name="earlierRowNumber" select="0" />
330cdf0e10cSrcweir		<xsl:param name="offset" />
331cdf0e10cSrcweir		<xsl:param name="calculatedRowPosition" select="$offset + 1" />
332cdf0e10cSrcweir		<xsl:param name="rowNodes" />
333cdf0e10cSrcweir		<xsl:param name="columnNodes"  />
334cdf0e10cSrcweir
335cdf0e10cSrcweir		<xsl:choose>
336cdf0e10cSrcweir			<xsl:when test="@table:number-rows-repeated &gt; 1">
337cdf0e10cSrcweir				<xsl:call-template name="write-table-row">
338cdf0e10cSrcweir					<xsl:with-param name="earlierRowNumber"  select="$earlierRowNumber" />
339cdf0e10cSrcweir					<xsl:with-param name="calculatedRowPosition"  select="$calculatedRowPosition" />
340cdf0e10cSrcweir					<xsl:with-param name="columnNodes" select="$columnNodes" />
341cdf0e10cSrcweir				</xsl:call-template>
342cdf0e10cSrcweir				<xsl:if test="@table:number-rows-repeated &gt; 2 and (table:table-cell/@office:value-type or $firstDefaultCellStyle != '')">
343cdf0e10cSrcweir					<!-- In case a cell is being repeated, the cell will be created
344cdf0e10cSrcweir					in a variabel, which is as many times given out, as being repeated -->
345cdf0e10cSrcweir					<xsl:variable name="tableRow">
346cdf0e10cSrcweir						<xsl:call-template name="write-table-row">
347cdf0e10cSrcweir							<xsl:with-param name="columnNodes" select="$columnNodes" />
348cdf0e10cSrcweir						</xsl:call-template>
349cdf0e10cSrcweir					</xsl:variable>
350cdf0e10cSrcweir					<xsl:call-template name="optimized-row-repeating">
351cdf0e10cSrcweir						<xsl:with-param name="tableRow"     select="$tableRow" />
352cdf0e10cSrcweir						<xsl:with-param name="repetition"   select="@table:number-rows-repeated - 1" />
353cdf0e10cSrcweir						<xsl:with-param name="columnNodes" select="$columnNodes" />
354cdf0e10cSrcweir				   </xsl:call-template>
355cdf0e10cSrcweir			   </xsl:if>
356cdf0e10cSrcweir			</xsl:when>
357cdf0e10cSrcweir			<xsl:otherwise>
358cdf0e10cSrcweir				<xsl:call-template name="write-table-row">
359cdf0e10cSrcweir					<xsl:with-param name="earlierRowNumber"  select="$earlierRowNumber" />
360cdf0e10cSrcweir					<xsl:with-param name="calculatedRowPosition"  select="$calculatedRowPosition" />
361cdf0e10cSrcweir					<xsl:with-param name="columnNodes" select="$columnNodes" />
362cdf0e10cSrcweir				</xsl:call-template>
363cdf0e10cSrcweir			</xsl:otherwise>
364cdf0e10cSrcweir		</xsl:choose>
365cdf0e10cSrcweir
366cdf0e10cSrcweir		<xsl:variable name="nextRowNodes" select="$rowNodes[position()!=1]" />
367cdf0e10cSrcweir		<xsl:choose>
368cdf0e10cSrcweir			<xsl:when test="@table:number-rows-repeated &gt; 1">
369cdf0e10cSrcweir				<xsl:apply-templates select="$nextRowNodes[1]">
370cdf0e10cSrcweir					<xsl:with-param name="earlierRowNumber"  select="$calculatedRowPosition" />
371cdf0e10cSrcweir					<xsl:with-param name="calculatedRowPosition"  select="$calculatedRowPosition + @table:number-rows-repeated" />
372cdf0e10cSrcweir					<xsl:with-param name="rowNodes" select="$nextRowNodes" />
373cdf0e10cSrcweir					<xsl:with-param name="columnNodes" select="$columnNodes" />
374cdf0e10cSrcweir			   </xsl:apply-templates>
375cdf0e10cSrcweir			</xsl:when>
376cdf0e10cSrcweir			<xsl:otherwise>
377cdf0e10cSrcweir				<xsl:apply-templates select="$nextRowNodes[1]">
378cdf0e10cSrcweir					<xsl:with-param name="earlierRowNumber"  select="$calculatedRowPosition" />
379cdf0e10cSrcweir					<xsl:with-param name="calculatedRowPosition"  select="$calculatedRowPosition + 1" />
380cdf0e10cSrcweir					<xsl:with-param name="rowNodes" select="$nextRowNodes" />
381cdf0e10cSrcweir					<xsl:with-param name="columnNodes" select="$columnNodes" />
382cdf0e10cSrcweir				</xsl:apply-templates>
383cdf0e10cSrcweir			</xsl:otherwise>
384cdf0e10cSrcweir		</xsl:choose>
385cdf0e10cSrcweir	</xsl:template>
386cdf0e10cSrcweir
387cdf0e10cSrcweir	<xsl:template name="write-table-row">
388cdf0e10cSrcweir		<xsl:param name="earlierRowNumber" select="0" />
389cdf0e10cSrcweir		<xsl:param name="calculatedRowPosition" select="1" />
390cdf0e10cSrcweir		<xsl:param name="columnNodes"  />
391cdf0e10cSrcweir
392cdf0e10cSrcweir		<xsl:element name="Row">
393cdf0e10cSrcweir			<xsl:if test="@table:visibility = 'collapse' or @table:visibility = 'filter'">
394cdf0e10cSrcweir				<xsl:attribute name="ss:Hidden">1</xsl:attribute>
395cdf0e10cSrcweir			</xsl:if>
396cdf0e10cSrcweir			<xsl:if test="not($earlierRowNumber + 1 = $calculatedRowPosition)">
397cdf0e10cSrcweir				<xsl:attribute name="ss:Index"><xsl:value-of select="$calculatedRowPosition" /></xsl:attribute>
398cdf0e10cSrcweir			</xsl:if>
399cdf0e10cSrcweir
400cdf0e10cSrcweir			<!-- writing the style of the row -->
401cdf0e10cSrcweir			<xsl:apply-templates select="@table:style-name" mode="table-row" />
402cdf0e10cSrcweir
403cdf0e10cSrcweir			<xsl:variable name="rowProperties" select="key('styles', @table:style-name)/*" />
404cdf0e10cSrcweir			<xsl:if test="$rowProperties/@style:use-optimal-row-height = 'false'">
405cdf0e10cSrcweir				<!-- default is '1', therefore write only '0' -->
406cdf0e10cSrcweir				<xsl:attribute name="ss:AutoFitHeight">0</xsl:attribute>
407cdf0e10cSrcweir			</xsl:if>
408cdf0e10cSrcweir
409cdf0e10cSrcweir			<xsl:variable name="height" select="$rowProperties/@style:row-height" />
410cdf0e10cSrcweir			<xsl:if test="$height">
411cdf0e10cSrcweir				<xsl:attribute name="ss:Height">
412cdf0e10cSrcweir					<!-- using the absolute height in point -->
413cdf0e10cSrcweir					<xsl:call-template name="convert2pt">
414cdf0e10cSrcweir						<xsl:with-param name="value" select="$height" />
415cdf0e10cSrcweir					</xsl:call-template>
416cdf0e10cSrcweir				</xsl:attribute>
417cdf0e10cSrcweir			</xsl:if>
418cdf0e10cSrcweir			<xsl:apply-templates select="table:table-cell[1]">
419cdf0e10cSrcweir				<xsl:with-param name="calculatedRowPosition"  select="$calculatedRowPosition" />
420cdf0e10cSrcweir				<xsl:with-param name="cellNodes"  select="table:table-cell" />
421cdf0e10cSrcweir				<xsl:with-param name="columnNodes" select="$columnNodes" />
422cdf0e10cSrcweir			</xsl:apply-templates>
423cdf0e10cSrcweir		</xsl:element>
424cdf0e10cSrcweir	</xsl:template>
425cdf0e10cSrcweir
426cdf0e10cSrcweir
427cdf0e10cSrcweir	<!-- Recursions are much faster when the stack size is small 	-->
428cdf0e10cSrcweir	<xsl:template name="optimized-row-repeating">
429cdf0e10cSrcweir		<xsl:param name="tableRow" />
430cdf0e10cSrcweir		<xsl:param name="repetition" />
431cdf0e10cSrcweir		<!-- resource optimation: instead of '1' it will be '1000' and the column is not full -->
432cdf0e10cSrcweir		<xsl:param name="thresholdmax" select="512"/>
433cdf0e10cSrcweir		<xsl:param name="thresholdmin" select="256"/>
434cdf0e10cSrcweir
435cdf0e10cSrcweir		<xsl:choose>
436cdf0e10cSrcweir			<xsl:when test="$repetition &lt;= $thresholdmax">
437cdf0e10cSrcweir				<xsl:copy-of select="$tableRow" />
438cdf0e10cSrcweir				<xsl:if test="$repetition &lt;= $thresholdmin">
439cdf0e10cSrcweir					<xsl:call-template name="optimized-row-repeating">
440cdf0e10cSrcweir						<xsl:with-param name="repetition" select="$repetition - 1"/>
441cdf0e10cSrcweir						<xsl:with-param name="tableRow" select="$tableRow" />
442cdf0e10cSrcweir					</xsl:call-template>
443cdf0e10cSrcweir				</xsl:if>
444cdf0e10cSrcweir			</xsl:when>
445cdf0e10cSrcweir			<xsl:otherwise>
446cdf0e10cSrcweir				<xsl:if test="$repetition mod 2 = 1">
447cdf0e10cSrcweir					<xsl:copy-of select="$tableRow" />
448cdf0e10cSrcweir				</xsl:if>
449cdf0e10cSrcweir				<xsl:variable name="repetitionHalf" select="floor($repetition div 2)"/>
450cdf0e10cSrcweir				<xsl:call-template name="optimized-row-repeating">
451cdf0e10cSrcweir					<xsl:with-param name="repetition" select="$repetitionHalf"/>
452cdf0e10cSrcweir					<xsl:with-param name="tableRow" select="$tableRow" />
453cdf0e10cSrcweir				</xsl:call-template>
454cdf0e10cSrcweir				<xsl:call-template name="optimized-row-repeating">
455cdf0e10cSrcweir					<xsl:with-param name="repetition" select="$repetitionHalf"/>
456cdf0e10cSrcweir					<xsl:with-param name="tableRow" select="$tableRow" />
457cdf0e10cSrcweir				</xsl:call-template>
458cdf0e10cSrcweir			</xsl:otherwise>
459cdf0e10cSrcweir		</xsl:choose>
460cdf0e10cSrcweir	</xsl:template>
461cdf0e10cSrcweir
462cdf0e10cSrcweir
463cdf0e10cSrcweir
464cdf0e10cSrcweir	<!-- ************** -->
465cdf0e10cSrcweir	<!-- *** Cells  *** -->
466cdf0e10cSrcweir	<!-- ************** -->
467cdf0e10cSrcweir
468cdf0e10cSrcweir	<!-- Table cells are able to be repeated by attribute in StarOffice,
469cdf0e10cSrcweir		 but not in Excel. If more cells are repeated -->
470cdf0e10cSrcweir	<xsl:template name="table:table-cell" match="table:table-cell">
471cdf0e10cSrcweir		<xsl:param name="calculatedCellPosition" select="1" /><!-- the later table position of the current cell  -->
472cdf0e10cSrcweir		<xsl:param name="calculatedRowPosition" /><!-- the later table position of the current row  -->
473cdf0e10cSrcweir		<xsl:param name="setIndex" select="false()" /> <!-- if not '0' @ss:Index used for neglecting repeteated empty cells -->
474cdf0e10cSrcweir		<xsl:param name="repetition" select="@table:number-columns-repeated" /> <!-- used for explicit writen out cells -->
475cdf0e10cSrcweir		<xsl:param name="repetitionCellPosition" select="$calculatedCellPosition" /><!-- during repetition formula needs exact cell positioning -->
476cdf0e10cSrcweir		<xsl:param name="nextMatchedCellPosition"><!-- the later table position of the next cell  -->
477cdf0e10cSrcweir		<xsl:choose>
478cdf0e10cSrcweir			<xsl:when test="not(@table:number-columns-repeated) and not(@table:number-columns-spanned)">
479cdf0e10cSrcweir				<xsl:value-of select="$calculatedCellPosition + 1" />
480cdf0e10cSrcweir			</xsl:when>
481cdf0e10cSrcweir			<xsl:when test="not(@table:number-columns-spanned)">
482cdf0e10cSrcweir				<xsl:value-of select="$calculatedCellPosition + @table:number-columns-repeated" />
483cdf0e10cSrcweir			</xsl:when>
484cdf0e10cSrcweir			<xsl:when test="not(@table:number-columns-repeated)">
485cdf0e10cSrcweir				<xsl:value-of select="$calculatedCellPosition + @table:number-columns-spanned" />
486cdf0e10cSrcweir			</xsl:when>
487cdf0e10cSrcweir			<xsl:otherwise>
488cdf0e10cSrcweir				<xsl:value-of select="$calculatedCellPosition + @table:number-columns-spanned * @table:number-columns-repeated" />
489cdf0e10cSrcweir			</xsl:otherwise>
490cdf0e10cSrcweir		</xsl:choose>
491cdf0e10cSrcweir		</xsl:param>
492cdf0e10cSrcweir		<xsl:param name="cellNodes" /><!-- cells to be handled  -->
493cdf0e10cSrcweir		<xsl:param name="columnNodes" />
494cdf0e10cSrcweir
495cdf0e10cSrcweir		<xsl:choose>
496cdf0e10cSrcweir			<!-- in case a repetition took place -->
497cdf0e10cSrcweir			<xsl:when test="$repetition &gt; 0">
498cdf0e10cSrcweir				<xsl:choose>
499cdf0e10cSrcweir					<!-- In case of no cell content (text, subelements, attribute, except repeated style) the ss:Index could be used -->
500cdf0e10cSrcweir					<xsl:when test="not(text()) and not(*) and not(@*[name() != 'table:number-columns-repeated'])">
501cdf0e10cSrcweir						<xsl:choose>
502cdf0e10cSrcweir							<xsl:when test="count($cellNodes) = 1">
503cdf0e10cSrcweir								<xsl:call-template name="create-table-cell">
504cdf0e10cSrcweir									<xsl:with-param name="setIndex" select="true()" />
505cdf0e10cSrcweir									<xsl:with-param name="calculatedCellPosition" select="$nextMatchedCellPosition - 1" />
506cdf0e10cSrcweir									<xsl:with-param name="calculatedRowPosition"  select="$calculatedRowPosition" />
507cdf0e10cSrcweir									<xsl:with-param name="columnNodes"  		  select="$columnNodes" />
508cdf0e10cSrcweir								</xsl:call-template>
509cdf0e10cSrcweir							</xsl:when>
510cdf0e10cSrcweir							<xsl:otherwise>
511cdf0e10cSrcweir								<xsl:apply-templates select="$cellNodes[2]">
512cdf0e10cSrcweir									<xsl:with-param name="calculatedCellPosition" select="$nextMatchedCellPosition" />
513cdf0e10cSrcweir									<xsl:with-param name="calculatedRowPosition"  select="$calculatedRowPosition" />
514cdf0e10cSrcweir									<xsl:with-param name="setIndex" select="true()" />
515cdf0e10cSrcweir									<xsl:with-param name="cellNodes" select="$cellNodes[position() != 1]" />
516cdf0e10cSrcweir									<xsl:with-param name="columnNodes"  		  select="$columnNodes" />
517cdf0e10cSrcweir								</xsl:apply-templates>
518cdf0e10cSrcweir							</xsl:otherwise>
519cdf0e10cSrcweir						</xsl:choose>
520cdf0e10cSrcweir					</xsl:when>
521cdf0e10cSrcweir					<!-- Fastest cell repetition by creating cell once and copying, works not for
522cdf0e10cSrcweir							a) cells with formula (need of actual cell postition)
523cdf0e10cSrcweir							b) cells, which start with ss:Index (as ss:Index is not allowed to be repeated) -->
524cdf0e10cSrcweir					<xsl:when test="not(@table:formula) and not($setIndex)">
525cdf0e10cSrcweir						<!-- In case a non-empty cell is being repeated, the cell will be created
526cdf0e10cSrcweir							in a variabel, which is as many times given out, as being repeated -->
527cdf0e10cSrcweir						<xsl:variable name="tableCell">
528cdf0e10cSrcweir							<xsl:call-template name="create-table-cell">
529cdf0e10cSrcweir								<xsl:with-param name="setIndex" select="false()" /><!-- copied cells may not have indices -->
530cdf0e10cSrcweir								<xsl:with-param name="columnNodes" select="$columnNodes" />
531cdf0e10cSrcweir							</xsl:call-template>
532cdf0e10cSrcweir						</xsl:variable>
533cdf0e10cSrcweir						<xsl:call-template name="repeat-copy-table-cell">
534cdf0e10cSrcweir							<xsl:with-param name="tableCell"   select="$tableCell" />
535cdf0e10cSrcweir							<xsl:with-param name="repetition"  select="$repetition" />
536cdf0e10cSrcweir							<xsl:with-param name="columnNodes" select="$columnNodes" />
537cdf0e10cSrcweir					   </xsl:call-template>
538cdf0e10cSrcweir						<xsl:apply-templates select="$cellNodes[2]">
539cdf0e10cSrcweir							<xsl:with-param name="calculatedCellPosition" select="$nextMatchedCellPosition" />
540cdf0e10cSrcweir							<xsl:with-param name="calculatedRowPosition"  select="$calculatedRowPosition" />
541cdf0e10cSrcweir							<xsl:with-param name="cellNodes" select="$cellNodes[position() != 1]" />
542cdf0e10cSrcweir							<xsl:with-param name="columnNodes" select="$columnNodes" />
543cdf0e10cSrcweir						</xsl:apply-templates>
544cdf0e10cSrcweir					</xsl:when>
545cdf0e10cSrcweir					<!-- explicit writing (instead of copying) of cell for the cases mentioned above -->
546cdf0e10cSrcweir					<xsl:otherwise>
547cdf0e10cSrcweir						<xsl:call-template name="create-table-cell">
548cdf0e10cSrcweir							<xsl:with-param name="setIndex" select="$setIndex" /><!-- a possible Index will be created -->
549cdf0e10cSrcweir							<xsl:with-param name="calculatedCellPosition" select="$repetitionCellPosition" />
550cdf0e10cSrcweir							<xsl:with-param name="calculatedRowPosition" select="$calculatedRowPosition" />
551cdf0e10cSrcweir							<xsl:with-param name="columnNodes" select="$columnNodes" />
552cdf0e10cSrcweir						</xsl:call-template>
553cdf0e10cSrcweir						<xsl:choose>
554cdf0e10cSrcweir							<!-- as long there is a repetition (higher '1') stay on the same cell node  -->
555cdf0e10cSrcweir							<xsl:when test="$repetition &gt; 1">
556cdf0e10cSrcweir								<xsl:call-template name="table:table-cell">
557cdf0e10cSrcweir									<xsl:with-param name="calculatedCellPosition" select="$nextMatchedCellPosition" />
558cdf0e10cSrcweir									<xsl:with-param name="calculatedRowPosition" select="$calculatedRowPosition" />
559cdf0e10cSrcweir									<xsl:with-param name="repetitionCellPosition">
560cdf0e10cSrcweir										<xsl:choose>
561cdf0e10cSrcweir											<xsl:when test="@table:number-columns-spanned">
562cdf0e10cSrcweir												<xsl:value-of select="$repetitionCellPosition + @table:number-columns-spanned" />
563cdf0e10cSrcweir											</xsl:when>
564cdf0e10cSrcweir											<xsl:otherwise>
565cdf0e10cSrcweir												<xsl:value-of select="$repetitionCellPosition + 1"/>
566cdf0e10cSrcweir											</xsl:otherwise>
567cdf0e10cSrcweir										</xsl:choose>
568cdf0e10cSrcweir									</xsl:with-param>
569cdf0e10cSrcweir									<xsl:with-param name="nextMatchedCellPosition" select="$nextMatchedCellPosition" />
570cdf0e10cSrcweir									<xsl:with-param name="repetition" select="$repetition - 1" />
571cdf0e10cSrcweir									<xsl:with-param name="cellNodes" select="$cellNodes" />
572cdf0e10cSrcweir									<xsl:with-param name="columnNodes" select="$columnNodes" />
573cdf0e10cSrcweir								</xsl:call-template>
574cdf0e10cSrcweir							</xsl:when>
575cdf0e10cSrcweir							<xsl:otherwise>
576cdf0e10cSrcweir								<xsl:apply-templates select="$cellNodes[2]">
577cdf0e10cSrcweir									<xsl:with-param name="calculatedCellPosition" select="$nextMatchedCellPosition" />
578cdf0e10cSrcweir									<xsl:with-param name="calculatedRowPosition"  select="$calculatedRowPosition" />
579cdf0e10cSrcweir									<xsl:with-param name="cellNodes" select="$cellNodes[position() != 1]" />
580cdf0e10cSrcweir									<xsl:with-param name="columnNodes" select="$columnNodes" />
581cdf0e10cSrcweir								</xsl:apply-templates>
582cdf0e10cSrcweir							</xsl:otherwise>
583cdf0e10cSrcweir						</xsl:choose>
584cdf0e10cSrcweir					</xsl:otherwise>
585cdf0e10cSrcweir				</xsl:choose>
586cdf0e10cSrcweir			</xsl:when>
587cdf0e10cSrcweir			<xsl:otherwise>
588cdf0e10cSrcweir				<!-- in case no repetition took place -->
589cdf0e10cSrcweir				<xsl:choose>
590cdf0e10cSrcweir					<!-- neglect en empty cells by using ss:Index Attribut  -->
591cdf0e10cSrcweir					<xsl:when test="not(text()) and not(*) and not(@*)">
592cdf0e10cSrcweir						<xsl:choose>
593cdf0e10cSrcweir							<!-- if it is the last cell, write this cell -->
594cdf0e10cSrcweir							<xsl:when test="count($cellNodes) = 1">
595cdf0e10cSrcweir								<xsl:call-template name="create-table-cell">
596cdf0e10cSrcweir									<xsl:with-param name="setIndex" select="true()" />
597cdf0e10cSrcweir									<xsl:with-param name="calculatedCellPosition" select="$nextMatchedCellPosition - 1" />
598cdf0e10cSrcweir									<xsl:with-param name="calculatedRowPosition"  select="$calculatedRowPosition" />
599cdf0e10cSrcweir									<xsl:with-param name="columnNodes" select="$columnNodes" />
600cdf0e10cSrcweir								</xsl:call-template>
601cdf0e10cSrcweir							</xsl:when>
602cdf0e10cSrcweir							<xsl:otherwise>
603cdf0e10cSrcweir								<xsl:apply-templates select="$cellNodes[2]">
604cdf0e10cSrcweir									<xsl:with-param name="setIndex" select="true()" />
605cdf0e10cSrcweir									<xsl:with-param name="calculatedCellPosition" select="$nextMatchedCellPosition" />
606cdf0e10cSrcweir									<xsl:with-param name="calculatedRowPosition"  select="$calculatedRowPosition" />
607cdf0e10cSrcweir									<xsl:with-param name="cellNodes" select="$cellNodes[position() != 1]" />
608cdf0e10cSrcweir									<xsl:with-param name="columnNodes" select="$columnNodes" />
609cdf0e10cSrcweir								</xsl:apply-templates>
610cdf0e10cSrcweir							</xsl:otherwise>
611cdf0e10cSrcweir						</xsl:choose>
612cdf0e10cSrcweir					</xsl:when>
613cdf0e10cSrcweir					<xsl:otherwise>
614cdf0e10cSrcweir						<!-- create cell and use/unset the ss:Index -->
615cdf0e10cSrcweir						<xsl:call-template name="create-table-cell">
616cdf0e10cSrcweir							<xsl:with-param name="setIndex" select="$setIndex" />
617cdf0e10cSrcweir							<xsl:with-param name="calculatedCellPosition" select="$calculatedCellPosition" />
618cdf0e10cSrcweir							<xsl:with-param name="calculatedRowPosition"  select="$calculatedRowPosition" />
619cdf0e10cSrcweir							<xsl:with-param name="columnNodes" select="$columnNodes" />
620cdf0e10cSrcweir						</xsl:call-template>
621cdf0e10cSrcweir						<xsl:apply-templates select="$cellNodes[2]">
622cdf0e10cSrcweir							<xsl:with-param name="calculatedCellPosition" select="$nextMatchedCellPosition" />
623cdf0e10cSrcweir							<xsl:with-param name="calculatedRowPosition"  select="$calculatedRowPosition" />
624cdf0e10cSrcweir							<xsl:with-param name="cellNodes" select="$cellNodes[position() != 1]" />
625cdf0e10cSrcweir							<xsl:with-param name="columnNodes" select="$columnNodes" />
626cdf0e10cSrcweir						</xsl:apply-templates>
627cdf0e10cSrcweir					</xsl:otherwise>
628cdf0e10cSrcweir				</xsl:choose>
629cdf0e10cSrcweir			</xsl:otherwise>
630cdf0e10cSrcweir		</xsl:choose>
631cdf0e10cSrcweir	</xsl:template>
632cdf0e10cSrcweir
633cdf0e10cSrcweir	<!-- Copies the variable 'tableCell' to the output as often as 'repetition' -->
634cdf0e10cSrcweir	<xsl:template name="repeat-copy-table-cell">
635cdf0e10cSrcweir		<xsl:param name="tableCell" />
636cdf0e10cSrcweir		<xsl:param name="repetition" />
637cdf0e10cSrcweir
638cdf0e10cSrcweir		<xsl:if test="$repetition &gt; 0">
639cdf0e10cSrcweir			<xsl:copy-of select="$tableCell"/>
640cdf0e10cSrcweir			<xsl:call-template name="repeat-copy-table-cell">
641cdf0e10cSrcweir				<xsl:with-param name="tableCell"   select="$tableCell" />
642cdf0e10cSrcweir				<xsl:with-param name="repetition"  select="$repetition - 1" />
643cdf0e10cSrcweir			</xsl:call-template>
644cdf0e10cSrcweir		</xsl:if>
645cdf0e10cSrcweir	</xsl:template>
646cdf0e10cSrcweir
647cdf0e10cSrcweir	<xsl:template name="create-table-cell">
648cdf0e10cSrcweir		<xsl:param name="setIndex" select="false()" />
649cdf0e10cSrcweir		<xsl:param name="calculatedCellPosition" />
650cdf0e10cSrcweir		<xsl:param name="calculatedRowPosition" />
651cdf0e10cSrcweir		<xsl:param name="columnNodes"  />
652cdf0e10cSrcweir
653cdf0e10cSrcweir		<xsl:element name="Cell" namespace="urn:schemas-microsoft-com:office:spreadsheet">
654cdf0e10cSrcweir			<xsl:if test="$setIndex">
655cdf0e10cSrcweir				<xsl:attribute name="ss:Index">
656cdf0e10cSrcweir					<xsl:value-of select="$calculatedCellPosition"/>
657cdf0e10cSrcweir				</xsl:attribute>
658cdf0e10cSrcweir			</xsl:if>
659cdf0e10cSrcweir			<xsl:if test="@table:number-columns-spanned &gt; 1">
660cdf0e10cSrcweir				<xsl:attribute name="ss:MergeAcross">
661cdf0e10cSrcweir					<xsl:value-of select="@table:number-columns-spanned - 1" />
662cdf0e10cSrcweir				</xsl:attribute>
663cdf0e10cSrcweir			</xsl:if>
664cdf0e10cSrcweir			<xsl:if test="@table:number-rows-spanned &gt; 1">
665cdf0e10cSrcweir				<xsl:attribute name="ss:MergeDown">
666cdf0e10cSrcweir					<xsl:value-of select="@table:number-rows-spanned - 1" />
667cdf0e10cSrcweir				</xsl:attribute>
668cdf0e10cSrcweir			</xsl:if>
669cdf0e10cSrcweir			<xsl:variable name="link" select="descendant::text:a/@xlink:href" />
670cdf0e10cSrcweir			<xsl:if test="$link">
671cdf0e10cSrcweir				<xsl:attribute name="ss:HRef">
672cdf0e10cSrcweir					<xsl:value-of select="$link" />
673cdf0e10cSrcweir				</xsl:attribute>
674cdf0e10cSrcweir			</xsl:if>
675cdf0e10cSrcweir			<xsl:choose>
676cdf0e10cSrcweir				<xsl:when test="@table:style-name">
677cdf0e10cSrcweir					<xsl:apply-templates select="@table:style-name" />
678cdf0e10cSrcweir				</xsl:when>
679cdf0e10cSrcweir				<xsl:otherwise>
680cdf0e10cSrcweir					<xsl:if test="$firstDefaultCellStyle != ''">
681cdf0e10cSrcweir						<xsl:variable name="defaultCellStyle" select="$columnNodes/table:table-column[position() = $calculatedCellPosition]/@table:default-cell-style-name" />
682cdf0e10cSrcweir						<xsl:if test="$defaultCellStyle">
683cdf0e10cSrcweir							<xsl:if test="not($defaultCellStyle = 'Default')">
684cdf0e10cSrcweir									<xsl:attribute name="ss:StyleID"><xsl:value-of select="$defaultCellStyle"/></xsl:attribute>
685cdf0e10cSrcweir							</xsl:if>
686cdf0e10cSrcweir						</xsl:if>
687cdf0e10cSrcweir					</xsl:if>
688cdf0e10cSrcweir				</xsl:otherwise>
689cdf0e10cSrcweir			</xsl:choose>
690cdf0e10cSrcweir			<xsl:apply-templates select="@table:formula">
691cdf0e10cSrcweir				<xsl:with-param name="calculatedCellPosition" select="$calculatedCellPosition" />
692cdf0e10cSrcweir				<xsl:with-param name="calculatedRowPosition"  select="$calculatedRowPosition" />
693cdf0e10cSrcweir			</xsl:apply-templates>
694cdf0e10cSrcweir			<xsl:choose>
695cdf0e10cSrcweir				<xsl:when test="*">
696cdf0e10cSrcweir				<!-- in case it is not an empty cell
697cdf0e10cSrcweir
698cdf0e10cSrcweir				  As the sequence of comment and data is opposite in Excel and Calc no match work here, in both comments exist only once
699cdf0e10cSrcweir				  Possible Table Content of interest: text:h|text:p|text:list  -->
700cdf0e10cSrcweir					<xsl:if test="text:h | text:p | text:list">
701cdf0e10cSrcweir						<xsl:variable name="valueType">
702cdf0e10cSrcweir							<xsl:choose>
703cdf0e10cSrcweir								<xsl:when test="@office:value-type">
704cdf0e10cSrcweir									<xsl:value-of select="@office:value-type" />
705cdf0e10cSrcweir								</xsl:when>
706cdf0e10cSrcweir								<xsl:otherwise>string</xsl:otherwise>
707cdf0e10cSrcweir							</xsl:choose>
708cdf0e10cSrcweir						</xsl:variable>
709cdf0e10cSrcweir						<xsl:call-template name="ss:Data">
710cdf0e10cSrcweir							<xsl:with-param name="valueType" select="$valueType" />
711cdf0e10cSrcweir							<xsl:with-param name="cellStyleName" select="@table:style-name" />
712cdf0e10cSrcweir						</xsl:call-template>
713cdf0e10cSrcweir					</xsl:if>
714cdf0e10cSrcweir
715cdf0e10cSrcweir					<xsl:if test="office:annotation">
716cdf0e10cSrcweir						<xsl:element name="Comment">
717cdf0e10cSrcweir							<xsl:if test="office:annotation/@office:author">
718cdf0e10cSrcweir								<xsl:attribute name="ss:Author"><xsl:value-of select="office:annotation/@office:author" /></xsl:attribute>
719cdf0e10cSrcweir							</xsl:if>
720cdf0e10cSrcweir							<xsl:if test="office:annotation/@office:display = 'true'">
721cdf0e10cSrcweir								<xsl:attribute name="ss:ShowAlways">1</xsl:attribute>
722cdf0e10cSrcweir							</xsl:if>
723cdf0e10cSrcweir							<!-- ss:Data is oblicatory, but not the same as the ss:Cell ss:Data child, as it has no attributes  -->
724cdf0e10cSrcweir							<ss:Data xmlns="http://www.w3.org/TR/REC-html40">
725cdf0e10cSrcweir								<xsl:for-each select="office:annotation/text:p">
726cdf0e10cSrcweir									<xsl:choose>
727cdf0e10cSrcweir										<xsl:when test="*">
728cdf0e10cSrcweir											<!-- paragraph style have to be neglected due to Excel error,
729cdf0e10cSrcweir												which does not allow shadowing their HTML attributes -->
730cdf0e10cSrcweir											<xsl:for-each select="*">
731cdf0e10cSrcweir												<xsl:call-template name="style-and-contents" />
732cdf0e10cSrcweir											</xsl:for-each>
733cdf0e10cSrcweir										</xsl:when>
734cdf0e10cSrcweir										<xsl:when test="@text:style-name">
735cdf0e10cSrcweir											<xsl:call-template name="style-and-contents" />
736cdf0e10cSrcweir										</xsl:when>
737cdf0e10cSrcweir										<xsl:otherwise>
738cdf0e10cSrcweir											<!-- if no style is set, BOLD is set as default -->
739cdf0e10cSrcweir											<B>
740cdf0e10cSrcweir												<xsl:call-template name="style-and-contents" />
741cdf0e10cSrcweir											</B>
742cdf0e10cSrcweir										</xsl:otherwise>
743cdf0e10cSrcweir									</xsl:choose>
744cdf0e10cSrcweir								</xsl:for-each>
745cdf0e10cSrcweir							</ss:Data>
746cdf0e10cSrcweir						</xsl:element>
747cdf0e10cSrcweir					</xsl:if>
748cdf0e10cSrcweir				</xsl:when>
749cdf0e10cSrcweir			</xsl:choose>
750cdf0e10cSrcweir		</xsl:element>
751cdf0e10cSrcweir	</xsl:template>
752cdf0e10cSrcweir
753cdf0e10cSrcweir	<!-- comments are handled separately in the cell -->
754cdf0e10cSrcweir	<xsl:template match="office:annotation" />
755cdf0e10cSrcweir	<xsl:template match="dc:date" />
756cdf0e10cSrcweir
757cdf0e10cSrcweir	<xsl:template name="ss:Data">
758cdf0e10cSrcweir		<!-- the default value is 'String' in the office -->
759cdf0e10cSrcweir		<xsl:param name="valueType" select="'string'" />
760cdf0e10cSrcweir		<xsl:param name="cellStyleName" />
761cdf0e10cSrcweir
762cdf0e10cSrcweir		<xsl:choose>
763cdf0e10cSrcweir			<xsl:when test="descendant::*/@text:style-name">
764cdf0e10cSrcweir				<xsl:choose>
765cdf0e10cSrcweir					<xsl:when test="$valueType = 'string'">
766cdf0e10cSrcweir						<ss:Data ss:Type="String" xmlns="http://www.w3.org/TR/REC-html40">
767cdf0e10cSrcweir							<xsl:apply-templates>
768cdf0e10cSrcweir								<xsl:with-param name="cellStyleName" select="$cellStyleName" />
769cdf0e10cSrcweir							</xsl:apply-templates>
770cdf0e10cSrcweir						</ss:Data>
771cdf0e10cSrcweir					</xsl:when>
772cdf0e10cSrcweir					<xsl:when test="$valueType = 'boolean'">
773cdf0e10cSrcweir						<ss:Data ss:Type="Boolean" xmlns="http://www.w3.org/TR/REC-html40">
774cdf0e10cSrcweir							<xsl:apply-templates>
775cdf0e10cSrcweir								<xsl:with-param name="cellStyleName" select="$cellStyleName" />
776cdf0e10cSrcweir							</xsl:apply-templates>
777cdf0e10cSrcweir						</ss:Data>
778cdf0e10cSrcweir					</xsl:when>
779cdf0e10cSrcweir					<xsl:when test="$valueType = 'date'">
780cdf0e10cSrcweir						<ss:Data ss:Type="DateTime" xmlns="http://www.w3.org/TR/REC-html40">
781cdf0e10cSrcweir							<xsl:apply-templates>
782cdf0e10cSrcweir								<xsl:with-param name="cellStyleName" select="$cellStyleName" />
783cdf0e10cSrcweir							</xsl:apply-templates>
784cdf0e10cSrcweir						</ss:Data>
785cdf0e10cSrcweir					</xsl:when>
786cdf0e10cSrcweir					<!-- float, time, percentage, currency (no 'Error' setting) -->
787cdf0e10cSrcweir					<xsl:otherwise>
788cdf0e10cSrcweir						<ss:Data ss:Type="Number" xmlns="http://www.w3.org/TR/REC-html40">
789cdf0e10cSrcweir							<xsl:apply-templates>
790cdf0e10cSrcweir								<xsl:with-param name="cellStyleName" select="$cellStyleName" />
791cdf0e10cSrcweir							</xsl:apply-templates>
792cdf0e10cSrcweir						</ss:Data>
793cdf0e10cSrcweir					</xsl:otherwise>
794cdf0e10cSrcweir				</xsl:choose>
795cdf0e10cSrcweir			</xsl:when>
796cdf0e10cSrcweir			<xsl:otherwise>
797cdf0e10cSrcweir				<xsl:element name="Data">
798cdf0e10cSrcweir					<xsl:call-template name="ss:Type">
799cdf0e10cSrcweir						<xsl:with-param name="valueType" select="$valueType" />
800cdf0e10cSrcweir					</xsl:call-template>
801cdf0e10cSrcweir				</xsl:element>
802cdf0e10cSrcweir			</xsl:otherwise>
803cdf0e10cSrcweir		</xsl:choose>
804cdf0e10cSrcweir	</xsl:template>
805cdf0e10cSrcweir
806cdf0e10cSrcweir
807cdf0e10cSrcweir	<xsl:template name="ss:Type">
808cdf0e10cSrcweir		<xsl:param name="valueType" select="'string'" />
809cdf0e10cSrcweir
810cdf0e10cSrcweir		<xsl:choose>
811cdf0e10cSrcweir			<xsl:when test="$valueType = 'string'">
812cdf0e10cSrcweir				<xsl:attribute name="ss:Type">String</xsl:attribute>
813cdf0e10cSrcweir				<xsl:apply-templates select="*"/>
814cdf0e10cSrcweir			</xsl:when>
815cdf0e10cSrcweir			<xsl:when test="$valueType = 'boolean'">
816cdf0e10cSrcweir				<xsl:attribute name="ss:Type">Boolean</xsl:attribute>
817cdf0e10cSrcweir				<xsl:choose>
818cdf0e10cSrcweir					<xsl:when test="@office:boolean-value = 'true'">1</xsl:when>
819cdf0e10cSrcweir					<xsl:otherwise>0</xsl:otherwise>
820cdf0e10cSrcweir				</xsl:choose>
821cdf0e10cSrcweir			</xsl:when>
822cdf0e10cSrcweir			<xsl:when test="$valueType = 'date' or $valueType = 'time'">
823cdf0e10cSrcweir				<!-- issue in Excel: can not have an empty 'DateTime' cell -->
824cdf0e10cSrcweir				<xsl:attribute name="ss:Type">DateTime</xsl:attribute>
825cdf0e10cSrcweir				<!-- Gathering information of two StarOffice date/time attributes
826cdf0e10cSrcweir				Excel always needs both informations in one attribute -->
827cdf0e10cSrcweir				<xsl:choose>
828cdf0e10cSrcweir					<xsl:when test="@office:date-value">
829cdf0e10cSrcweir					<!-- office:date-value may contain time (after 'T')-->
830cdf0e10cSrcweir						<xsl:choose>
831cdf0e10cSrcweir							<xsl:when test="contains(@office:date-value, 'T')">
832cdf0e10cSrcweir								<!-- in case time is also part of the date -->
833cdf0e10cSrcweir								<xsl:value-of select="substring-before(@office:date-value, 'T')" />
834cdf0e10cSrcweir								<xsl:text>T</xsl:text>
835cdf0e10cSrcweir								<xsl:value-of select="substring-after(@office:date-value,'T')" />
836cdf0e10cSrcweir							   <xsl:if test="not(contains(@office:date-value,'.'))">
837cdf0e10cSrcweir									<xsl:text>.</xsl:text>
838cdf0e10cSrcweir								</xsl:if>
839cdf0e10cSrcweir								<xsl:text>000</xsl:text>
840cdf0e10cSrcweir							</xsl:when>
841cdf0e10cSrcweir							<xsl:when test="@office:time-value">
842cdf0e10cSrcweir							<!-- conatains date and time (time will be evaluated later -->
843cdf0e10cSrcweir								<xsl:value-of select="@office:date-value" />
844cdf0e10cSrcweir								<xsl:text>T</xsl:text>
845cdf0e10cSrcweir								<xsl:choose>
846cdf0e10cSrcweir									<xsl:when test="@table:formula or contains(@office:time-value,',')">
847cdf0e10cSrcweir										<!-- customized number types not implemented yet -->
848cdf0e10cSrcweir										<xsl:text>00:00:00.000</xsl:text>
849cdf0e10cSrcweir									</xsl:when>
850cdf0e10cSrcweir									<xsl:otherwise>
851cdf0e10cSrcweir										<xsl:value-of select="translate(substring-after(@office:time-value,'PT'),'HMS','::.')" />
852cdf0e10cSrcweir										<xsl:if test="not(contains(@office:time-value,'S'))">
853cdf0e10cSrcweir											<xsl:text>.</xsl:text>
854cdf0e10cSrcweir										</xsl:if>
855cdf0e10cSrcweir										<xsl:text>000</xsl:text>
856cdf0e10cSrcweir									</xsl:otherwise>
857cdf0e10cSrcweir								</xsl:choose>
858cdf0e10cSrcweir							</xsl:when>
859cdf0e10cSrcweir							<xsl:otherwise>
860cdf0e10cSrcweir								<xsl:value-of select="@office:date-value" />
861cdf0e10cSrcweir								<xsl:text>T00:00:00.000</xsl:text>
862cdf0e10cSrcweir							</xsl:otherwise>
863cdf0e10cSrcweir						</xsl:choose>
864cdf0e10cSrcweir					</xsl:when>
865cdf0e10cSrcweir					<xsl:otherwise>
866cdf0e10cSrcweir						<xsl:if test="@office:time-value">
867cdf0e10cSrcweir							<xsl:text>1899-12-31T</xsl:text>
868cdf0e10cSrcweir							<xsl:choose>
869cdf0e10cSrcweir								<xsl:when test="@table:formula or contains(@office:time-value,',')">
870cdf0e10cSrcweir									<!-- customized number types not implemented yet -->
871cdf0e10cSrcweir									<xsl:text>00:00:00.000</xsl:text>
872cdf0e10cSrcweir								</xsl:when>
873cdf0e10cSrcweir								<xsl:otherwise>
874cdf0e10cSrcweir									<xsl:value-of select="translate(substring-after(@office:time-value,'PT'),'HMS','::.')" />
875cdf0e10cSrcweir								   <xsl:if test="not(contains(@office:time-value,'S'))">
876cdf0e10cSrcweir										<xsl:text>.</xsl:text>
877cdf0e10cSrcweir									</xsl:if>
878cdf0e10cSrcweir									<xsl:text>000</xsl:text>
879cdf0e10cSrcweir								</xsl:otherwise>
880cdf0e10cSrcweir							</xsl:choose>
881cdf0e10cSrcweir						</xsl:if>
882cdf0e10cSrcweir					</xsl:otherwise>
883cdf0e10cSrcweir				</xsl:choose>
884cdf0e10cSrcweir			</xsl:when>
885cdf0e10cSrcweir			<!-- float, percentage, currency (no 'Error' setting) -->
886cdf0e10cSrcweir			<xsl:otherwise>
887cdf0e10cSrcweir				<xsl:attribute name="ss:Type">Number</xsl:attribute>
888cdf0e10cSrcweir				<xsl:value-of select="@office:value" />
889cdf0e10cSrcweir			</xsl:otherwise>
890cdf0e10cSrcweir		</xsl:choose>
891cdf0e10cSrcweir	</xsl:template>
892cdf0e10cSrcweir
893cdf0e10cSrcweir
894cdf0e10cSrcweir	<!-- ******************** -->
895cdf0e10cSrcweir	<!-- *** Common Rules *** -->
896cdf0e10cSrcweir	<!-- ******************** -->
897cdf0e10cSrcweir
898cdf0e10cSrcweir	<xsl:template match="*">
899cdf0e10cSrcweir		<xsl:param name="cellStyleName" />
900cdf0e10cSrcweir
901cdf0e10cSrcweir<!-- 	LineBreak in Cell -->
902cdf0e10cSrcweir		<xsl:if test="preceding-sibling::text:p[1]"><xsl:text>&#10;</xsl:text></xsl:if>
903cdf0e10cSrcweir		<xsl:call-template name="style-and-contents">
904cdf0e10cSrcweir			<xsl:with-param name="cellStyleName" select="$cellStyleName" />
905cdf0e10cSrcweir		</xsl:call-template>
906cdf0e10cSrcweir	</xsl:template>
907cdf0e10cSrcweir
908cdf0e10cSrcweir	<!-- disabling draw:frames -->
909cdf0e10cSrcweir	<xsl:template match="draw:frame" />
910cdf0e10cSrcweir
911cdf0e10cSrcweir	<xsl:template match="text:s">
912cdf0e10cSrcweir		<xsl:call-template name="write-breakable-whitespace">
913cdf0e10cSrcweir			<xsl:with-param name="whitespaces" select="@text:c" />
914cdf0e10cSrcweir		</xsl:call-template>
915cdf0e10cSrcweir	</xsl:template>
916cdf0e10cSrcweir
917cdf0e10cSrcweir	<!--write the number of 'whitespaces' -->
918cdf0e10cSrcweir	<xsl:template name="write-breakable-whitespace">
919cdf0e10cSrcweir		<xsl:param name="whitespaces" />
920cdf0e10cSrcweir
921cdf0e10cSrcweir		<xsl:text> </xsl:text>
922cdf0e10cSrcweir		<xsl:if test="$whitespaces >= 1">
923cdf0e10cSrcweir			<xsl:call-template name="write-breakable-whitespace">
924cdf0e10cSrcweir				<xsl:with-param name="whitespaces" select="$whitespaces - 1" />
925cdf0e10cSrcweir			</xsl:call-template>
926cdf0e10cSrcweir		</xsl:if>
927cdf0e10cSrcweir	</xsl:template>
928cdf0e10cSrcweir
929cdf0e10cSrcweir	<!-- allowing all matched text nodes -->
930cdf0e10cSrcweir	<xsl:template match="text()"><xsl:value-of select="." /></xsl:template>
931cdf0e10cSrcweir
932cdf0e10cSrcweir</xsl:stylesheet>
933cdf0e10cSrcweir
934