1*cdf0e10cSrcweir<?xml version="1.0" encoding="UTF-8"?>
2*cdf0e10cSrcweir<!--
3*cdf0e10cSrcweir
4*cdf0e10cSrcweir  DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5*cdf0e10cSrcweir
6*cdf0e10cSrcweir  Copyright 2000, 2010 Oracle and/or its affiliates.
7*cdf0e10cSrcweir
8*cdf0e10cSrcweir  OpenOffice.org - a multi-platform office productivity suite
9*cdf0e10cSrcweir
10*cdf0e10cSrcweir  This file is part of OpenOffice.org.
11*cdf0e10cSrcweir
12*cdf0e10cSrcweir  OpenOffice.org is free software: you can redistribute it and/or modify
13*cdf0e10cSrcweir  it under the terms of the GNU Lesser General Public License version 3
14*cdf0e10cSrcweir  only, as published by the Free Software Foundation.
15*cdf0e10cSrcweir
16*cdf0e10cSrcweir  OpenOffice.org is distributed in the hope that it will be useful,
17*cdf0e10cSrcweir  but WITHOUT ANY WARRANTY; without even the implied warranty of
18*cdf0e10cSrcweir  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19*cdf0e10cSrcweir  GNU Lesser General Public License version 3 for more details
20*cdf0e10cSrcweir  (a copy is included in the LICENSE file that accompanied this code).
21*cdf0e10cSrcweir
22*cdf0e10cSrcweir  You should have received a copy of the GNU Lesser General Public License
23*cdf0e10cSrcweir  version 3 along with OpenOffice.org.  If not, see
24*cdf0e10cSrcweir  <http://www.openoffice.org/license.html>
25*cdf0e10cSrcweir  for a copy of the LGPLv3 License.
26*cdf0e10cSrcweir
27*cdf0e10cSrcweir-->
28*cdf0e10cSrcweir<xsl:stylesheet version="1.0"
29*cdf0e10cSrcweir	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
30*cdf0e10cSrcweir	xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0"
31*cdf0e10cSrcweir	xmlns:config="urn:oasis:names:tc:opendocument:xmlns:config:1.0"
32*cdf0e10cSrcweir	xmlns:dc="http://purl.org/dc/elements/1.1/"
33*cdf0e10cSrcweir	xmlns:dom="http://www.w3.org/2001/xml-events"
34*cdf0e10cSrcweir	xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0"
35*cdf0e10cSrcweir	xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0"
36*cdf0e10cSrcweir	xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0"
37*cdf0e10cSrcweir	xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0"
38*cdf0e10cSrcweir	xmlns:math="http://www.w3.org/1998/Math/MathML"
39*cdf0e10cSrcweir	xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0"
40*cdf0e10cSrcweir	xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0"
41*cdf0e10cSrcweir	xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0"
42*cdf0e10cSrcweir	xmlns:ooo="http://openoffice.org/2004/office"
43*cdf0e10cSrcweir	xmlns:oooc="http://openoffice.org/2004/calc"
44*cdf0e10cSrcweir	xmlns:ooow="http://openoffice.org/2004/writer"
45*cdf0e10cSrcweir	xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0"
46*cdf0e10cSrcweir	xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0"
47*cdf0e10cSrcweir	xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0"
48*cdf0e10cSrcweir	xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0"
49*cdf0e10cSrcweir	xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0"
50*cdf0e10cSrcweir	xmlns:xlink="http://www.w3.org/1999/xlink"
51*cdf0e10cSrcweir	xmlns:xt="http://www.jclark.com/xt"
52*cdf0e10cSrcweir	xmlns:common="http://exslt.org/common"
53*cdf0e10cSrcweir	xmlns:xalan="http://xml.apache.org/xalan"
54*cdf0e10cSrcweir	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"
55*cdf0e10cSrcweir	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">
56*cdf0e10cSrcweir
57*cdf0e10cSrcweir
58*cdf0e10cSrcweir	<!-- Mapping @table:formula to @ss:Formula translating the expression syntax -->
59*cdf0e10cSrcweir	<xsl:template match="@table:formula">
60*cdf0e10cSrcweir		<xsl:param name="calculatedCellPosition" />
61*cdf0e10cSrcweir		<xsl:param name="calculatedRowPosition" />
62*cdf0e10cSrcweir
63*cdf0e10cSrcweir		<xsl:attribute name="ss:Formula">
64*cdf0e10cSrcweir			<xsl:call-template name="translate-formular-expression">
65*cdf0e10cSrcweir				<xsl:with-param name="rowPos"    select="$calculatedRowPosition" />
66*cdf0e10cSrcweir				<xsl:with-param name="columnPos" select="$calculatedCellPosition" />
67*cdf0e10cSrcweir				<xsl:with-param name="expression" select="." />
68*cdf0e10cSrcweir			</xsl:call-template>
69*cdf0e10cSrcweir		</xsl:attribute>
70*cdf0e10cSrcweir	</xsl:template>
71*cdf0e10cSrcweir
72*cdf0e10cSrcweir
73*cdf0e10cSrcweir	<!-- Translate OOOC formula expressions of table cells to spreadsheetml expression
74*cdf0e10cSrcweir
75*cdf0e10cSrcweir		For example:
76*cdf0e10cSrcweir			"oooc:=ROUNDDOWN(123.321;2)"
77*cdf0e10cSrcweir				to "=ROUNDDOWN(123.321,2)"
78*cdf0e10cSrcweir			"oooc:=([.B2]-[.C2])"
79*cdf0e10cSrcweir				to  "=(RC[-2]-RC[-1])"
80*cdf0e10cSrcweir			"oooc:=DCOUNTA([.E14:.F21];[.F14];[.H14:.I15])"
81*cdf0e10cSrcweir				to  "=DCOUNTA(R[-17]C[3]:R[-10]C[4],R[-17]C[4],R[-17]C[6]:R[-16]C[7])"   -->
82*cdf0e10cSrcweir	<xsl:template name="translate-formular-expression">
83*cdf0e10cSrcweir		<!--  return position or range for formula or other -->
84*cdf0e10cSrcweir		<xsl:param name="rowPos" /> <!-- the position in row (vertical) of cell -->
85*cdf0e10cSrcweir		<xsl:param name="columnPos" /> <!-- the position in column (horizontal of cell) -->
86*cdf0e10cSrcweir		<xsl:param name="expression" /> <!-- the expression string to be converted  -->
87*cdf0e10cSrcweir
88*cdf0e10cSrcweir		<xsl:choose>
89*cdf0e10cSrcweir			<xsl:when test="$expression != ''">
90*cdf0e10cSrcweir				<xsl:choose>
91*cdf0e10cSrcweir					<!-- OASIS Open Document XML formular expressions  -->
92*cdf0e10cSrcweir					<xsl:when test="starts-with($expression,'oooc:')">
93*cdf0e10cSrcweir						<!-- giving out the '=', which will be removed with 'oooc:=' to enable recursive string parsing  -->
94*cdf0e10cSrcweir						<xsl:text>=</xsl:text>
95*cdf0e10cSrcweir						<xsl:call-template name="function-parameter-mapping">
96*cdf0e10cSrcweir							<xsl:with-param name="rowPos" select="$rowPos" />
97*cdf0e10cSrcweir							<xsl:with-param name="columnPos" select="$columnPos" />
98*cdf0e10cSrcweir							<!-- 1) remove 'oooc:=' prefix and exchange ';' with ',' -->
99*cdf0e10cSrcweir							<xsl:with-param name="expression" select="translate(substring($expression,7),';',',')"/>
100*cdf0e10cSrcweir						</xsl:call-template>
101*cdf0e10cSrcweir					</xsl:when>
102*cdf0e10cSrcweir					<xsl:otherwise>
103*cdf0e10cSrcweir						<xsl:value-of select="$expression" />
104*cdf0e10cSrcweir					</xsl:otherwise>
105*cdf0e10cSrcweir				</xsl:choose>
106*cdf0e10cSrcweir			</xsl:when>
107*cdf0e10cSrcweir			<xsl:otherwise>
108*cdf0e10cSrcweir				<xsl:value-of select="$expression" />
109*cdf0e10cSrcweir			</xsl:otherwise>
110*cdf0e10cSrcweir		</xsl:choose>
111*cdf0e10cSrcweir	</xsl:template>
112*cdf0e10cSrcweir
113*cdf0e10cSrcweir	<!-- As the function API of our Office and MS Office show differences in the argumentlists,
114*cdf0e10cSrcweir			-	sometimes the last parameter have to be neglected
115*cdf0e10cSrcweir			-	sometimes a default have to be added
116*cdf0e10cSrcweir		these exchanges have to be done as well -->
117*cdf0e10cSrcweir	<xsl:template name="function-parameter-mapping">
118*cdf0e10cSrcweir		<xsl:param name="rowPos" /> <!-- the position in row (vertical of cell) -->
119*cdf0e10cSrcweir		<xsl:param name="columnPos" /> <!-- the position in column (horizontal of cell) -->
120*cdf0e10cSrcweir		<xsl:param name="expression" /> <!-- expression to be exchanged -->
121*cdf0e10cSrcweir
122*cdf0e10cSrcweir		<!-- Choose if the expression contains one of the function, which might need changes -->
123*cdf0e10cSrcweir		<xsl:choose>
124*cdf0e10cSrcweir			<!-- if not contain one of the functions, which need parameter mapping -->
125*cdf0e10cSrcweir			<xsl:when test="not(contains($expression, 'ADDRESS(') or
126*cdf0e10cSrcweir								contains($expression, 'CEILING(') or
127*cdf0e10cSrcweir								contains($expression, 'FLOOR(') or
128*cdf0e10cSrcweir								contains($expression, 'IF(') or
129*cdf0e10cSrcweir								contains($expression, 'ROUND('))">
130*cdf0e10cSrcweir				<!-- simply translate possily exisiting column & row references -->
131*cdf0e10cSrcweir				<xsl:call-template name="translate-oooc-expression">
132*cdf0e10cSrcweir					<xsl:with-param name="rowPos" select="$rowPos" />
133*cdf0e10cSrcweir					<xsl:with-param name="columnPos" select="$columnPos" />
134*cdf0e10cSrcweir					<xsl:with-param name="expression" select="$expression"/>
135*cdf0e10cSrcweir				</xsl:call-template>
136*cdf0e10cSrcweir			</xsl:when>
137*cdf0e10cSrcweir			<!-- functions to be mapped -->
138*cdf0e10cSrcweir			<xsl:otherwise>
139*cdf0e10cSrcweir				<xsl:variable name="functionPrefix" select="substring-before($expression, '(')" />
140*cdf0e10cSrcweir				<xsl:variable name="expressionSuffix" select="substring-after($expression, '(')" />
141*cdf0e10cSrcweir
142*cdf0e10cSrcweir				<!-- translate in case the expression contains row/cell references aside of the function name -->
143*cdf0e10cSrcweir				<xsl:call-template name="translate-oooc-expression">
144*cdf0e10cSrcweir					<xsl:with-param name="rowPos" select="$rowPos" />
145*cdf0e10cSrcweir					<xsl:with-param name="columnPos" select="$columnPos" />
146*cdf0e10cSrcweir					<xsl:with-param name="expression" select="$functionPrefix"/>
147*cdf0e10cSrcweir				</xsl:call-template>
148*cdf0e10cSrcweir				<!-- Prefix do not include the bracket -->
149*cdf0e10cSrcweir				<xsl:text>(</xsl:text>
150*cdf0e10cSrcweir				<xsl:choose>
151*cdf0e10cSrcweir					<xsl:when test="not(contains($functionPrefix, 'ADDRESS') or
152*cdf0e10cSrcweir										contains($functionPrefix, 'CEILING') or
153*cdf0e10cSrcweir										contains($functionPrefix, 'FLOOR') or
154*cdf0e10cSrcweir										(contains($functionPrefix, 'IF') and not(
155*cdf0e10cSrcweir											contains($functionPrefix, 'COUNTIF') or
156*cdf0e10cSrcweir											contains($functionPrefix, 'SUMIF'))) or
157*cdf0e10cSrcweir										contains($functionPrefix, 'ROUND'))">
158*cdf0e10cSrcweir						<xsl:call-template name="function-parameter-mapping">
159*cdf0e10cSrcweir							<xsl:with-param name="rowPos" select="$rowPos" />
160*cdf0e10cSrcweir							<xsl:with-param name="columnPos" select="$columnPos" />
161*cdf0e10cSrcweir							<xsl:with-param name="expression" select="$expressionSuffix"/>
162*cdf0e10cSrcweir						</xsl:call-template>
163*cdf0e10cSrcweir					</xsl:when>
164*cdf0e10cSrcweir					<xsl:otherwise>
165*cdf0e10cSrcweir						<xsl:choose>
166*cdf0e10cSrcweir							<xsl:when test="contains($functionPrefix, 'ADDRESS')">
167*cdf0e10cSrcweir								<xsl:call-template name="find-parameters">
168*cdf0e10cSrcweir									<xsl:with-param name="rowPos" select="$rowPos" />
169*cdf0e10cSrcweir									<xsl:with-param name="columnPos" select="$columnPos" />
170*cdf0e10cSrcweir									<xsl:with-param name="expressionSuffix" select="$expressionSuffix"/>
171*cdf0e10cSrcweir									<xsl:with-param name="parameterRemoval" select="4" />
172*cdf0e10cSrcweir								</xsl:call-template>
173*cdf0e10cSrcweir							</xsl:when>
174*cdf0e10cSrcweir							<xsl:when test="contains($functionPrefix, 'CEILING') or
175*cdf0e10cSrcweir											contains($functionPrefix, 'FLOOR')">
176*cdf0e10cSrcweir								<xsl:call-template name="find-parameters">
177*cdf0e10cSrcweir									<xsl:with-param name="rowPos" select="$rowPos" />
178*cdf0e10cSrcweir									<xsl:with-param name="columnPos" select="$columnPos" />
179*cdf0e10cSrcweir									<xsl:with-param name="expressionSuffix" select="$expressionSuffix"/>
180*cdf0e10cSrcweir									<xsl:with-param name="parameterRemoval" select="3" />
181*cdf0e10cSrcweir								</xsl:call-template>
182*cdf0e10cSrcweir							</xsl:when>
183*cdf0e10cSrcweir							<xsl:when test="contains($functionPrefix, 'IF')">
184*cdf0e10cSrcweir								<xsl:if test="not(contains($functionPrefix, 'COUNTIF') or
185*cdf0e10cSrcweir												  contains($functionPrefix, 'SUMIF'))">
186*cdf0e10cSrcweir									<xsl:call-template name="find-parameters">
187*cdf0e10cSrcweir										<xsl:with-param name="rowPos" select="$rowPos" />
188*cdf0e10cSrcweir										<xsl:with-param name="columnPos" select="$columnPos" />
189*cdf0e10cSrcweir										<xsl:with-param name="expressionSuffix" select="$expressionSuffix"/>
190*cdf0e10cSrcweir										<xsl:with-param name="parameterAddition" select="'true'" />
191*cdf0e10cSrcweir										<xsl:with-param name="additonAfterLastParameter" select="2" />
192*cdf0e10cSrcweir									</xsl:call-template>
193*cdf0e10cSrcweir								</xsl:if>
194*cdf0e10cSrcweir							</xsl:when>
195*cdf0e10cSrcweir							<xsl:when test="contains($functionPrefix, 'ROUND')">
196*cdf0e10cSrcweir								<xsl:call-template name="find-parameters">
197*cdf0e10cSrcweir									<xsl:with-param name="rowPos" select="$rowPos" />
198*cdf0e10cSrcweir									<xsl:with-param name="columnPos" select="$columnPos" />
199*cdf0e10cSrcweir									<xsl:with-param name="expressionSuffix" select="$expressionSuffix"/>
200*cdf0e10cSrcweir									<xsl:with-param name="parameterAddition" select="'null'" />
201*cdf0e10cSrcweir									<xsl:with-param name="additonAfterLastParameter" select="1" />
202*cdf0e10cSrcweir								</xsl:call-template>
203*cdf0e10cSrcweir							</xsl:when>
204*cdf0e10cSrcweir						</xsl:choose>
205*cdf0e10cSrcweir					</xsl:otherwise>
206*cdf0e10cSrcweir				</xsl:choose>
207*cdf0e10cSrcweir			</xsl:otherwise>
208*cdf0e10cSrcweir		</xsl:choose>
209*cdf0e10cSrcweir	</xsl:template>
210*cdf0e10cSrcweir
211*cdf0e10cSrcweir	<!-- Each parameter of the argumentlist have to be determined.
212*cdf0e10cSrcweir	Due to the low level string functionlity in XSLT it becomes a clumsy task -->
213*cdf0e10cSrcweir	<xsl:template name="find-parameters">
214*cdf0e10cSrcweir		<!-- used for mapping of row/column reference  -->
215*cdf0e10cSrcweir		<xsl:param name="rowPos" /> <!-- the position in row (vertical of cell) -->
216*cdf0e10cSrcweir		<xsl:param name="columnPos" /> <!-- the position in column (horizontal of cell) -->
217*cdf0e10cSrcweir		<!-- used for mapping of parameter  -->
218*cdf0e10cSrcweir		<xsl:param name="parameterRemoval" />
219*cdf0e10cSrcweir		<xsl:param name="parameterAddition" />
220*cdf0e10cSrcweir		<xsl:param name="additonAfterLastParameter" />
221*cdf0e10cSrcweir		<!-- used as helper to find a parameter  -->
222*cdf0e10cSrcweir		<xsl:param name="expressionSuffix" />
223*cdf0e10cSrcweir		<xsl:param name="parameterNumber" select="1" />
224*cdf0e10cSrcweir
225*cdf0e10cSrcweir		<xsl:variable name="parameter">
226*cdf0e10cSrcweir			<xsl:call-template name="getParameter">
227*cdf0e10cSrcweir				<xsl:with-param name="expressionSuffix" select="$expressionSuffix"/>
228*cdf0e10cSrcweir			</xsl:call-template>
229*cdf0e10cSrcweir		</xsl:variable>
230*cdf0e10cSrcweir
231*cdf0e10cSrcweir		<xsl:choose>
232*cdf0e10cSrcweir			<!-- if it is not the last parameter -->
233*cdf0e10cSrcweir			<xsl:when test="starts-with(substring-after($expressionSuffix, $parameter), ',')">
234*cdf0e10cSrcweir				<!-- searches the argument for functions to be mapped -->
235*cdf0e10cSrcweir				<xsl:if test="not($parameterRemoval = $parameterNumber)">
236*cdf0e10cSrcweir					<xsl:call-template name="function-parameter-mapping">
237*cdf0e10cSrcweir						<xsl:with-param name="rowPos" select="$rowPos" />
238*cdf0e10cSrcweir						<xsl:with-param name="columnPos" select="$columnPos" />
239*cdf0e10cSrcweir						<xsl:with-param name="expression">
240*cdf0e10cSrcweir							<xsl:choose>
241*cdf0e10cSrcweir								<!-- in case a character will be removed the preceding won't make a comma -->
242*cdf0e10cSrcweir								<xsl:when test="$parameterRemoval = ($parameterNumber + 1)">
243*cdf0e10cSrcweir									<xsl:value-of select="$parameter" />
244*cdf0e10cSrcweir								</xsl:when>
245*cdf0e10cSrcweir								<xsl:otherwise>
246*cdf0e10cSrcweir									<xsl:value-of select="concat($parameter, ',')" />
247*cdf0e10cSrcweir								</xsl:otherwise>
248*cdf0e10cSrcweir							</xsl:choose>
249*cdf0e10cSrcweir						</xsl:with-param>
250*cdf0e10cSrcweir					</xsl:call-template>
251*cdf0e10cSrcweir				</xsl:if>
252*cdf0e10cSrcweir				<!-- searches for the next parameter -->
253*cdf0e10cSrcweir				<xsl:call-template name="find-parameters">
254*cdf0e10cSrcweir					<xsl:with-param name="rowPos" select="$rowPos" />
255*cdf0e10cSrcweir					<xsl:with-param name="columnPos" select="$columnPos" />
256*cdf0e10cSrcweir					<xsl:with-param name="expressionSuffix" select="substring-after(substring-after($expressionSuffix, $parameter),',')"/>
257*cdf0e10cSrcweir					<xsl:with-param name="parameterAddition" select="$parameterAddition" />
258*cdf0e10cSrcweir					<xsl:with-param name="parameterRemoval" select="$parameterRemoval" />
259*cdf0e10cSrcweir					<xsl:with-param name="additonAfterLastParameter" select="$additonAfterLastParameter" />
260*cdf0e10cSrcweir					<xsl:with-param name="parameterNumber" select="$parameterNumber + 1" />
261*cdf0e10cSrcweir				</xsl:call-template>
262*cdf0e10cSrcweir			</xsl:when>
263*cdf0e10cSrcweir			<xsl:otherwise>
264*cdf0e10cSrcweir				<!-- the last parameter -->
265*cdf0e10cSrcweir				<xsl:choose>
266*cdf0e10cSrcweir					<xsl:when test="$parameterRemoval = $parameterNumber">
267*cdf0e10cSrcweir						<!-- searches the rest of the expression for functions to be mapped -->
268*cdf0e10cSrcweir						<xsl:call-template name="function-parameter-mapping">
269*cdf0e10cSrcweir							<xsl:with-param name="rowPos" select="$rowPos" />
270*cdf0e10cSrcweir							<xsl:with-param name="columnPos" select="$columnPos" />
271*cdf0e10cSrcweir							<xsl:with-param name="expression" select="substring-after($expressionSuffix, $parameter)"/>
272*cdf0e10cSrcweir						</xsl:call-template>
273*cdf0e10cSrcweir					</xsl:when>
274*cdf0e10cSrcweir					<xsl:when test="$parameterAddition and ($parameterNumber  = $additonAfterLastParameter)">
275*cdf0e10cSrcweir						<!-- searches the rest of the expression for functions to be mapped -->
276*cdf0e10cSrcweir						<xsl:call-template name="function-parameter-mapping">
277*cdf0e10cSrcweir							<xsl:with-param name="rowPos" select="$rowPos" />
278*cdf0e10cSrcweir							<xsl:with-param name="columnPos" select="$columnPos" />
279*cdf0e10cSrcweir							<xsl:with-param name="expression" select="$parameter" />
280*cdf0e10cSrcweir						</xsl:call-template>
281*cdf0e10cSrcweir						<!-- searches last parameter and additional parameters for functions to be mapped -->
282*cdf0e10cSrcweir						<xsl:call-template name="function-parameter-mapping">
283*cdf0e10cSrcweir							<xsl:with-param name="rowPos" select="$rowPos" />
284*cdf0e10cSrcweir							<xsl:with-param name="columnPos" select="$columnPos" />
285*cdf0e10cSrcweir							<!-- for the final parameter the latter substring is the ')' -->
286*cdf0e10cSrcweir							<xsl:with-param name="expression" select="concat(',', $parameterAddition, substring-after($expressionSuffix, $parameter))"/>
287*cdf0e10cSrcweir						</xsl:call-template>
288*cdf0e10cSrcweir					</xsl:when>
289*cdf0e10cSrcweir					<xsl:otherwise>
290*cdf0e10cSrcweir						<!-- searches the argument for functions to be mapped -->
291*cdf0e10cSrcweir						<xsl:call-template name="function-parameter-mapping">
292*cdf0e10cSrcweir							<xsl:with-param name="rowPos" select="$rowPos" />
293*cdf0e10cSrcweir							<xsl:with-param name="columnPos" select="$columnPos" />
294*cdf0e10cSrcweir							<xsl:with-param name="expression" select="$parameter" />
295*cdf0e10cSrcweir						</xsl:call-template>
296*cdf0e10cSrcweir						<!-- searches the rest of the expression for functions to be mapped -->
297*cdf0e10cSrcweir						<xsl:call-template name="function-parameter-mapping">
298*cdf0e10cSrcweir							<xsl:with-param name="rowPos" select="$rowPos" />
299*cdf0e10cSrcweir							<xsl:with-param name="columnPos" select="$columnPos" />
300*cdf0e10cSrcweir							<xsl:with-param name="expression" select="substring-after($expressionSuffix, $parameter)"/>
301*cdf0e10cSrcweir						</xsl:call-template>
302*cdf0e10cSrcweir					</xsl:otherwise>
303*cdf0e10cSrcweir				</xsl:choose>
304*cdf0e10cSrcweir			</xsl:otherwise>
305*cdf0e10cSrcweir		</xsl:choose>
306*cdf0e10cSrcweir	</xsl:template>
307*cdf0e10cSrcweir
308*cdf0e10cSrcweir	<xsl:template name="getParameter">
309*cdf0e10cSrcweir		<xsl:param name="closingBracketCount" select="0" />
310*cdf0e10cSrcweir		<xsl:param name="openingBracketCount" select="0" />
311*cdf0e10cSrcweir		<xsl:param name="expressionSuffix" />
312*cdf0e10cSrcweir		<xsl:param name="parameterCandidate">
313*cdf0e10cSrcweir			<xsl:choose>
314*cdf0e10cSrcweir				<!-- if there are multiple parameter -->
315*cdf0e10cSrcweir				<xsl:when test="contains(substring-before($expressionSuffix, ')'), ',')">
316*cdf0e10cSrcweir					<xsl:value-of select="substring-before($expressionSuffix, ',')"/>
317*cdf0e10cSrcweir				</xsl:when>
318*cdf0e10cSrcweir				<xsl:otherwise>
319*cdf0e10cSrcweir					<xsl:value-of select="substring-before($expressionSuffix, ')')"/>
320*cdf0e10cSrcweir				</xsl:otherwise>
321*cdf0e10cSrcweir			</xsl:choose>
322*cdf0e10cSrcweir		</xsl:param>
323*cdf0e10cSrcweir		<xsl:param name="earlierCandidate" select="$parameterCandidate" />
324*cdf0e10cSrcweir
325*cdf0e10cSrcweir		<xsl:choose>
326*cdf0e10cSrcweir			<xsl:when test="contains($parameterCandidate, '(') or contains($parameterCandidate, ')')">
327*cdf0e10cSrcweir				<xsl:choose>
328*cdf0e10cSrcweir					<!-- contains only closing bracket(s) -->
329*cdf0e10cSrcweir					<xsl:when test="contains($parameterCandidate, '(') and not(contains($parameterCandidate, ')'))">
330*cdf0e10cSrcweir						<xsl:call-template name="getParameter">
331*cdf0e10cSrcweir							<xsl:with-param name="openingBracketCount" select="$openingBracketCount + 1" />
332*cdf0e10cSrcweir							<xsl:with-param name="closingBracketCount" select="$closingBracketCount" />
333*cdf0e10cSrcweir							<xsl:with-param name="parameterCandidate" select="substring-after($parameterCandidate, '(')" />
334*cdf0e10cSrcweir							<xsl:with-param name="earlierCandidate" select="$earlierCandidate" />
335*cdf0e10cSrcweir							<xsl:with-param name="expressionSuffix" select="$expressionSuffix"/>
336*cdf0e10cSrcweir						</xsl:call-template>
337*cdf0e10cSrcweir					</xsl:when>
338*cdf0e10cSrcweir					<!-- contains only opening bracket(s) -->
339*cdf0e10cSrcweir					<xsl:when test="not(contains($parameterCandidate, '(')) and contains($parameterCandidate, ')')">
340*cdf0e10cSrcweir						<xsl:call-template name="getParameter">
341*cdf0e10cSrcweir							<xsl:with-param name="openingBracketCount" select="$openingBracketCount" />
342*cdf0e10cSrcweir							<xsl:with-param name="closingBracketCount" select="$closingBracketCount + 1" />
343*cdf0e10cSrcweir							<xsl:with-param name="parameterCandidate" select="substring-after($parameterCandidate, ')')" />
344*cdf0e10cSrcweir							<xsl:with-param name="earlierCandidate" select="$earlierCandidate" />
345*cdf0e10cSrcweir							<xsl:with-param name="expressionSuffix" select="$expressionSuffix"/>
346*cdf0e10cSrcweir						</xsl:call-template>
347*cdf0e10cSrcweir					</xsl:when>
348*cdf0e10cSrcweir					<xsl:otherwise>
349*cdf0e10cSrcweir						<xsl:choose>
350*cdf0e10cSrcweir							<xsl:when test="string-length(substring-before($parameterCandidate, '(')) &lt;
351*cdf0e10cSrcweir											string-length(substring-before($parameterCandidate, ')'))">
352*cdf0e10cSrcweir								<xsl:call-template name="getParameter">
353*cdf0e10cSrcweir									<xsl:with-param name="openingBracketCount" select="$openingBracketCount + 1" />
354*cdf0e10cSrcweir									<xsl:with-param name="closingBracketCount" select="$closingBracketCount" />
355*cdf0e10cSrcweir									<xsl:with-param name="parameterCandidate" select="substring-after($parameterCandidate, '(')" />
356*cdf0e10cSrcweir									<xsl:with-param name="earlierCandidate" select="$earlierCandidate" />
357*cdf0e10cSrcweir									<xsl:with-param name="expressionSuffix" select="$expressionSuffix"/>
358*cdf0e10cSrcweir								</xsl:call-template>
359*cdf0e10cSrcweir							</xsl:when>
360*cdf0e10cSrcweir							<xsl:otherwise>
361*cdf0e10cSrcweir								<xsl:call-template name="getParameter">
362*cdf0e10cSrcweir									<xsl:with-param name="openingBracketCount" select="$openingBracketCount" />
363*cdf0e10cSrcweir									<xsl:with-param name="closingBracketCount" select="$closingBracketCount + 1" />
364*cdf0e10cSrcweir									<xsl:with-param name="parameterCandidate" select="substring-after($parameterCandidate, ')')" />
365*cdf0e10cSrcweir									<xsl:with-param name="earlierCandidate" select="$earlierCandidate" />
366*cdf0e10cSrcweir									<xsl:with-param name="expressionSuffix" select="$expressionSuffix"/>
367*cdf0e10cSrcweir								</xsl:call-template>
368*cdf0e10cSrcweir							</xsl:otherwise>
369*cdf0e10cSrcweir						</xsl:choose>
370*cdf0e10cSrcweir					</xsl:otherwise>
371*cdf0e10cSrcweir				</xsl:choose>
372*cdf0e10cSrcweir			</xsl:when>
373*cdf0e10cSrcweir			<xsl:otherwise>
374*cdf0e10cSrcweir				<xsl:choose>
375*cdf0e10cSrcweir					<xsl:when test="$openingBracketCount = $closingBracketCount">
376*cdf0e10cSrcweir						<xsl:value-of select="$earlierCandidate" />
377*cdf0e10cSrcweir					</xsl:when>
378*cdf0e10cSrcweir					<xsl:otherwise>
379*cdf0e10cSrcweir						<xsl:value-of select="$earlierCandidate" />
380*cdf0e10cSrcweir						<xsl:variable name="parameterCandidate2">
381*cdf0e10cSrcweir							<xsl:variable name="formularAfterCandidate" select="substring-after($expressionSuffix, $earlierCandidate)" />
382*cdf0e10cSrcweir							<xsl:variable name="parameterTillBracket" select="concat(substring-before($formularAfterCandidate,')'),')')" />
383*cdf0e10cSrcweir							<xsl:variable name="parameterTillComma" select="substring-before(substring-after($expressionSuffix, $parameterTillBracket),',')" />
384*cdf0e10cSrcweir							<xsl:choose>
385*cdf0e10cSrcweir								<xsl:when test="string-length($parameterTillComma) &gt; 0 and
386*cdf0e10cSrcweir												not(contains($parameterTillComma, '('))">
387*cdf0e10cSrcweir									<xsl:choose>
388*cdf0e10cSrcweir										<xsl:when test="starts-with($formularAfterCandidate, ',')">
389*cdf0e10cSrcweir											<xsl:value-of select="concat(',',substring-before(substring-after($formularAfterCandidate,','),','))"/>
390*cdf0e10cSrcweir										</xsl:when>
391*cdf0e10cSrcweir										<xsl:otherwise>
392*cdf0e10cSrcweir											<xsl:value-of select="substring-before($formularAfterCandidate,',')"/>
393*cdf0e10cSrcweir										</xsl:otherwise>
394*cdf0e10cSrcweir									</xsl:choose>
395*cdf0e10cSrcweir								</xsl:when>
396*cdf0e10cSrcweir								<xsl:otherwise>
397*cdf0e10cSrcweir									<xsl:value-of select="$parameterTillBracket"/>
398*cdf0e10cSrcweir								</xsl:otherwise>
399*cdf0e10cSrcweir							</xsl:choose>
400*cdf0e10cSrcweir						</xsl:variable>
401*cdf0e10cSrcweir						<xsl:call-template name="getParameter">
402*cdf0e10cSrcweir							<xsl:with-param name="closingBracketCount" select="$closingBracketCount" />
403*cdf0e10cSrcweir							<xsl:with-param name="openingBracketCount" select="$openingBracketCount" />
404*cdf0e10cSrcweir							<xsl:with-param name="parameterCandidate" select="$parameterCandidate2" />
405*cdf0e10cSrcweir							<xsl:with-param name="earlierCandidate" select="$parameterCandidate2" />
406*cdf0e10cSrcweir							<xsl:with-param name="expressionSuffix" select="$expressionSuffix" />
407*cdf0e10cSrcweir						</xsl:call-template>
408*cdf0e10cSrcweir					</xsl:otherwise>
409*cdf0e10cSrcweir				</xsl:choose>
410*cdf0e10cSrcweir			</xsl:otherwise>
411*cdf0e10cSrcweir		</xsl:choose>
412*cdf0e10cSrcweir	</xsl:template>
413*cdf0e10cSrcweir
414*cdf0e10cSrcweir	<!-- Mapping table-cell definitions by exchangomg all table cell definitions:
415*cdf0e10cSrcweir		a) a pair of cells e.g. "[.E14:.F21]" to "R[-17]C[3]:R[-10]C[4]"
416*cdf0e10cSrcweir		b) a single cell e.g. "[.F14]" to "R[-17]"-->
417*cdf0e10cSrcweir	<xsl:template name="translate-oooc-expression">
418*cdf0e10cSrcweir		<xsl:param name="rowPos" /> <!-- the position in row (vertical of cell) -->
419*cdf0e10cSrcweir		<xsl:param name="columnPos" /> <!-- the position in column (horizontal of cell) -->
420*cdf0e10cSrcweir		<xsl:param name="expression" /> <!-- expression to be exchanged -->
421*cdf0e10cSrcweir
422*cdf0e10cSrcweir		<xsl:choose>
423*cdf0e10cSrcweir			<xsl:when test="contains($expression, '[')">
424*cdf0e10cSrcweir
425*cdf0e10cSrcweir				<!-- Giving out the part before '[.' -->
426*cdf0e10cSrcweir				<xsl:value-of select="substring-before($expression, '[')" />
427*cdf0e10cSrcweir
428*cdf0e10cSrcweir				<!-- Mapping cell definitions
429*cdf0e10cSrcweir				1) a pair of cells e.g. "[.E14:.F21]" to "R[-17]C[3]:R[-10]C[4]"
430*cdf0e10cSrcweir				2) a single cell e.g. "[.F14]" to "R[-17]"-->
431*cdf0e10cSrcweir				<xsl:variable name="remainingExpression" select="substring-after($expression, '[')"/>
432*cdf0e10cSrcweir				<xsl:choose>
433*cdf0e10cSrcweir					<xsl:when test="contains(substring-before($remainingExpression, ']'), ':')">
434*cdf0e10cSrcweir						<xsl:call-template name="translate-cell-expression">
435*cdf0e10cSrcweir							<xsl:with-param name="rowPos" select="$rowPos" />
436*cdf0e10cSrcweir							<xsl:with-param name="columnPos" select="$columnPos" />
437*cdf0e10cSrcweir							<xsl:with-param name="expression" select="substring-before($remainingExpression, ':')" />
438*cdf0e10cSrcweir						</xsl:call-template>
439*cdf0e10cSrcweir						<xsl:value-of select="':'" />
440*cdf0e10cSrcweir						<xsl:call-template name="translate-cell-expression">
441*cdf0e10cSrcweir							<xsl:with-param name="rowPos" select="$rowPos" />
442*cdf0e10cSrcweir							<xsl:with-param name="columnPos" select="$columnPos" />
443*cdf0e10cSrcweir							<xsl:with-param name="expression" select="substring-after(substring-before($remainingExpression, ']'), ':')" />
444*cdf0e10cSrcweir						</xsl:call-template>
445*cdf0e10cSrcweir					</xsl:when>
446*cdf0e10cSrcweir					<xsl:otherwise>
447*cdf0e10cSrcweir						<xsl:call-template name="translate-cell-expression">
448*cdf0e10cSrcweir							<xsl:with-param name="rowPos" select="$rowPos" />
449*cdf0e10cSrcweir							<xsl:with-param name="columnPos" select="$columnPos" />
450*cdf0e10cSrcweir							<xsl:with-param name="expression" select="substring-before($remainingExpression, ']')" />
451*cdf0e10cSrcweir						</xsl:call-template>
452*cdf0e10cSrcweir					</xsl:otherwise>
453*cdf0e10cSrcweir				</xsl:choose>
454*cdf0e10cSrcweir				<xsl:call-template name="translate-oooc-expression">
455*cdf0e10cSrcweir					<xsl:with-param name="rowPos" select="$rowPos" />
456*cdf0e10cSrcweir					<xsl:with-param name="columnPos" select="$columnPos" />
457*cdf0e10cSrcweir					<xsl:with-param name="expression" select="substring-after($remainingExpression,']')"/>
458*cdf0e10cSrcweir				</xsl:call-template>
459*cdf0e10cSrcweir			</xsl:when>
460*cdf0e10cSrcweir			<xsl:otherwise>
461*cdf0e10cSrcweir				<!-- Giving out the remaining part -->
462*cdf0e10cSrcweir				<xsl:value-of select="$expression" />
463*cdf0e10cSrcweir			</xsl:otherwise>
464*cdf0e10cSrcweir		</xsl:choose>
465*cdf0e10cSrcweir	</xsl:template>
466*cdf0e10cSrcweir
467*cdf0e10cSrcweir
468*cdf0e10cSrcweir	<!-- A cell expression has usually starts with a '.' otherwise it references to a sheet  -->
469*cdf0e10cSrcweir	<xsl:template name="translate-cell-expression">
470*cdf0e10cSrcweir		<xsl:param name="rowPos" /> <!-- the vertical position of the current cell -->
471*cdf0e10cSrcweir		<xsl:param name="columnPos" /> <!-- the horizontal position of the current cell -->
472*cdf0e10cSrcweir		<xsl:param name="targetRowPos" select="0"/> <!-- the vertical position of the target cell -->
473*cdf0e10cSrcweir		<xsl:param name="targetColumnPos" select="0"/> <!-- the horizontal position of the target cell -->
474*cdf0e10cSrcweir		<xsl:param name="charPos" select="0"/> <!-- current column position (needed for multiplying) -->
475*cdf0e10cSrcweir		<xsl:param name="digitPos" select="0"/>  <!-- current row position (needed for multiplying) -->
476*cdf0e10cSrcweir		<xsl:param name="expression" /> <!-- expression to be parsed by character -->
477*cdf0e10cSrcweir		<xsl:param name="isRow" select="true()"/> <!-- the string (e.g. $D39 is parsed character per character from the back,
478*cdf0e10cSrcweir													   first the row, later the column is parsed -->
479*cdf0e10cSrcweir
480*cdf0e10cSrcweir		<xsl:choose>
481*cdf0e10cSrcweir			<xsl:when test="starts-with($expression, '.')">
482*cdf0e10cSrcweir				<xsl:variable name="expLength" select="string-length($expression)" />
483*cdf0e10cSrcweir				<xsl:choose>
484*cdf0e10cSrcweir					<!-- parsing from the end, till only the '.' remains -->
485*cdf0e10cSrcweir					<xsl:when test="$expLength != 1">
486*cdf0e10cSrcweir						<xsl:variable name="token" select="substring($expression, $expLength)" />
487*cdf0e10cSrcweir						<xsl:choose>
488*cdf0e10cSrcweir							<xsl:when test="$token='0' or $token='1' or $token='2' or $token='3' or $token='4' or $token='5' or $token='6' or $token='7' or $token='8' or $token='9'">
489*cdf0e10cSrcweir								<xsl:variable name="multiplier">
490*cdf0e10cSrcweir									<xsl:call-template name="calculate-square-numbers">
491*cdf0e10cSrcweir										<xsl:with-param name="base" select="10" />
492*cdf0e10cSrcweir										<xsl:with-param name="exponent" select="$digitPos"/>
493*cdf0e10cSrcweir									</xsl:call-template>
494*cdf0e10cSrcweir								</xsl:variable>
495*cdf0e10cSrcweir								<xsl:call-template name="translate-cell-expression">
496*cdf0e10cSrcweir									<xsl:with-param name="columnPos" select="$columnPos" />
497*cdf0e10cSrcweir									<xsl:with-param name="rowPos" select="$rowPos" />
498*cdf0e10cSrcweir									<xsl:with-param name="targetColumnPos" select="$targetColumnPos" />
499*cdf0e10cSrcweir									<xsl:with-param name="targetRowPos" select="$targetRowPos + $multiplier * $token" />
500*cdf0e10cSrcweir									<xsl:with-param name="digitPos" select="$digitPos + 1" />
501*cdf0e10cSrcweir									<xsl:with-param name="charPos" select="$charPos" />
502*cdf0e10cSrcweir									<!-- removing the last character-->
503*cdf0e10cSrcweir									<xsl:with-param name="expression" select="substring($expression, 1, $expLength - 1)" />
504*cdf0e10cSrcweir									<xsl:with-param name="isRow" select="true()" />
505*cdf0e10cSrcweir								</xsl:call-template>
506*cdf0e10cSrcweir							</xsl:when>
507*cdf0e10cSrcweir							<xsl:when test="$token = '$'">
508*cdf0e10cSrcweir								<xsl:choose>
509*cdf0e10cSrcweir									<!-- if this is the first '$' after '.' (column-->
510*cdf0e10cSrcweir									<xsl:when test="$expLength = 2">
511*cdf0e10cSrcweir										<xsl:text>C</xsl:text><xsl:value-of select="$targetColumnPos"/>
512*cdf0e10cSrcweir									</xsl:when>
513*cdf0e10cSrcweir									<xsl:otherwise>
514*cdf0e10cSrcweir										<xsl:text>R</xsl:text><xsl:value-of select="$targetRowPos"/>
515*cdf0e10cSrcweir										<xsl:call-template name="translate-cell-expression">
516*cdf0e10cSrcweir											<xsl:with-param name="columnPos" select="$columnPos" />
517*cdf0e10cSrcweir											<xsl:with-param name="rowPos" select="$rowPos" />
518*cdf0e10cSrcweir											<xsl:with-param name="targetColumnPos" select="$targetColumnPos" />
519*cdf0e10cSrcweir											<xsl:with-param name="targetRowPos" select="$targetRowPos" />
520*cdf0e10cSrcweir											<xsl:with-param name="charPos" select="$charPos" />
521*cdf0e10cSrcweir											<!-- removing the last character-->
522*cdf0e10cSrcweir											<xsl:with-param name="expression" select="substring($expression, 1, $expLength - 1)" />
523*cdf0e10cSrcweir											<xsl:with-param name="isRow" select="false()" />
524*cdf0e10cSrcweir										</xsl:call-template>
525*cdf0e10cSrcweir									</xsl:otherwise>
526*cdf0e10cSrcweir								</xsl:choose>
527*cdf0e10cSrcweir							</xsl:when>
528*cdf0e10cSrcweir							<!-- in case of a letter -->
529*cdf0e10cSrcweir							<xsl:otherwise>
530*cdf0e10cSrcweir								<xsl:if test="$isRow">
531*cdf0e10cSrcweir									<xsl:text>R</xsl:text>
532*cdf0e10cSrcweir									<xsl:if test="$targetRowPos != $rowPos">
533*cdf0e10cSrcweir										<xsl:text>[</xsl:text><xsl:value-of select="$targetRowPos - $rowPos"/><xsl:text>]</xsl:text>
534*cdf0e10cSrcweir									</xsl:if>
535*cdf0e10cSrcweir								</xsl:if>
536*cdf0e10cSrcweir								<xsl:variable name="multiplier">
537*cdf0e10cSrcweir									<xsl:call-template name="calculate-square-numbers">
538*cdf0e10cSrcweir										<xsl:with-param name="base" select="26" />
539*cdf0e10cSrcweir										<xsl:with-param name="exponent" select="$charPos"/>
540*cdf0e10cSrcweir									</xsl:call-template>
541*cdf0e10cSrcweir								</xsl:variable>
542*cdf0e10cSrcweir								<xsl:variable name="tokenNumber">
543*cdf0e10cSrcweir									<xsl:call-template name="character-to-number">
544*cdf0e10cSrcweir										<xsl:with-param name="character" select="$token" />
545*cdf0e10cSrcweir									</xsl:call-template>
546*cdf0e10cSrcweir								</xsl:variable>
547*cdf0e10cSrcweir
548*cdf0e10cSrcweir								<xsl:call-template name="translate-cell-expression">
549*cdf0e10cSrcweir									<xsl:with-param name="columnPos" select="$columnPos" />
550*cdf0e10cSrcweir									<xsl:with-param name="rowPos" select="$rowPos" />
551*cdf0e10cSrcweir									<xsl:with-param name="targetColumnPos" select="$targetColumnPos + $multiplier * $tokenNumber" />
552*cdf0e10cSrcweir									<xsl:with-param name="targetRowPos" select="$targetRowPos" />
553*cdf0e10cSrcweir									<xsl:with-param name="digitPos" select="$digitPos" />
554*cdf0e10cSrcweir									<xsl:with-param name="charPos" select="$charPos + 1" />
555*cdf0e10cSrcweir									<!-- removing the last character-->
556*cdf0e10cSrcweir									<xsl:with-param name="expression" select="substring($expression, 1, $expLength - 1)" />
557*cdf0e10cSrcweir									<xsl:with-param name="isRow" select="false()" />
558*cdf0e10cSrcweir								</xsl:call-template>
559*cdf0e10cSrcweir							</xsl:otherwise>
560*cdf0e10cSrcweir						</xsl:choose>
561*cdf0e10cSrcweir					</xsl:when>
562*cdf0e10cSrcweir					<xsl:otherwise>
563*cdf0e10cSrcweir						<xsl:text>C</xsl:text>
564*cdf0e10cSrcweir						<xsl:if test="$targetColumnPos != $columnPos">
565*cdf0e10cSrcweir							<xsl:text>[</xsl:text><xsl:value-of select="$targetColumnPos - $columnPos"/><xsl:text>]</xsl:text>
566*cdf0e10cSrcweir						</xsl:if>
567*cdf0e10cSrcweir					</xsl:otherwise>
568*cdf0e10cSrcweir				</xsl:choose>
569*cdf0e10cSrcweir			</xsl:when>
570*cdf0e10cSrcweir			<xsl:otherwise>
571*cdf0e10cSrcweir				<xsl:variable name="sheetName" select="substring-before($expression, '.')" />
572*cdf0e10cSrcweir				<xsl:value-of select="$sheetName"/><xsl:text>!</xsl:text>
573*cdf0e10cSrcweir				<xsl:call-template name="translate-cell-expression">
574*cdf0e10cSrcweir					<xsl:with-param name="rowPos" select="$rowPos" />
575*cdf0e10cSrcweir					<xsl:with-param name="columnPos" select="$columnPos" />
576*cdf0e10cSrcweir					<xsl:with-param name="expression" select="substring-after($expression, $sheetName)" />
577*cdf0e10cSrcweir				</xsl:call-template>
578*cdf0e10cSrcweir			</xsl:otherwise>
579*cdf0e10cSrcweir		</xsl:choose>
580*cdf0e10cSrcweir	</xsl:template>
581*cdf0e10cSrcweir
582*cdf0e10cSrcweir
583*cdf0e10cSrcweir	<xsl:template name="calculate-square-numbers">
584*cdf0e10cSrcweir		<xsl:param name="base" />
585*cdf0e10cSrcweir		<xsl:param name="exponent" />
586*cdf0e10cSrcweir		<xsl:param name="return" select="1" />
587*cdf0e10cSrcweir
588*cdf0e10cSrcweir		<xsl:choose>
589*cdf0e10cSrcweir			<xsl:when test="$exponent > '1'">
590*cdf0e10cSrcweir				<xsl:call-template name="calculate-square-numbers">
591*cdf0e10cSrcweir					<xsl:with-param name="base" select="$base" />
592*cdf0e10cSrcweir					<xsl:with-param name="exponent" select="$exponent - 1"/>
593*cdf0e10cSrcweir					<xsl:with-param name="return" select="$return * $base" />
594*cdf0e10cSrcweir				</xsl:call-template>
595*cdf0e10cSrcweir			</xsl:when>
596*cdf0e10cSrcweir			<xsl:when test="$exponent = '1'">
597*cdf0e10cSrcweir				<xsl:value-of select="$return * $base"/>
598*cdf0e10cSrcweir			</xsl:when>
599*cdf0e10cSrcweir			<!-- if exponent is equal '0' -->
600*cdf0e10cSrcweir			<xsl:otherwise>
601*cdf0e10cSrcweir				<xsl:value-of select="1"/>
602*cdf0e10cSrcweir			</xsl:otherwise>
603*cdf0e10cSrcweir		</xsl:choose>
604*cdf0e10cSrcweir	</xsl:template>
605*cdf0e10cSrcweir
606*cdf0e10cSrcweir
607*cdf0e10cSrcweir	<xsl:template name="character-to-number">
608*cdf0e10cSrcweir		<xsl:param name="character" />
609*cdf0e10cSrcweir		<xsl:choose>
610*cdf0e10cSrcweir			<xsl:when test="$character = 'A'">1</xsl:when>
611*cdf0e10cSrcweir			<xsl:when test="$character = 'B'">2</xsl:when>
612*cdf0e10cSrcweir			<xsl:when test="$character = 'C'">3</xsl:when>
613*cdf0e10cSrcweir			<xsl:when test="$character = 'D'">4</xsl:when>
614*cdf0e10cSrcweir			<xsl:when test="$character = 'E'">5</xsl:when>
615*cdf0e10cSrcweir			<xsl:when test="$character = 'F'">6</xsl:when>
616*cdf0e10cSrcweir			<xsl:when test="$character = 'G'">7</xsl:when>
617*cdf0e10cSrcweir			<xsl:when test="$character = 'H'">8</xsl:when>
618*cdf0e10cSrcweir			<xsl:when test="$character = 'I'">9</xsl:when>
619*cdf0e10cSrcweir			<xsl:when test="$character = 'J'">10</xsl:when>
620*cdf0e10cSrcweir			<xsl:when test="$character = 'K'">11</xsl:when>
621*cdf0e10cSrcweir			<xsl:when test="$character = 'L'">12</xsl:when>
622*cdf0e10cSrcweir			<xsl:when test="$character = 'M'">13</xsl:when>
623*cdf0e10cSrcweir			<xsl:when test="$character = 'N'">14</xsl:when>
624*cdf0e10cSrcweir			<xsl:when test="$character = 'O'">15</xsl:when>
625*cdf0e10cSrcweir			<xsl:when test="$character = 'P'">16</xsl:when>
626*cdf0e10cSrcweir			<xsl:when test="$character = 'Q'">17</xsl:when>
627*cdf0e10cSrcweir			<xsl:when test="$character = 'R'">18</xsl:when>
628*cdf0e10cSrcweir			<xsl:when test="$character = 'S'">19</xsl:when>
629*cdf0e10cSrcweir			<xsl:when test="$character = 'T'">20</xsl:when>
630*cdf0e10cSrcweir			<xsl:when test="$character = 'U'">21</xsl:when>
631*cdf0e10cSrcweir			<xsl:when test="$character = 'V'">22</xsl:when>
632*cdf0e10cSrcweir			<xsl:when test="$character = 'W'">23</xsl:when>
633*cdf0e10cSrcweir			<xsl:when test="$character = 'X'">24</xsl:when>
634*cdf0e10cSrcweir			<xsl:when test="$character = 'Y'">25</xsl:when>
635*cdf0e10cSrcweir			<xsl:when test="$character = 'Z'">26</xsl:when>
636*cdf0e10cSrcweir			<xsl:otherwise/>
637*cdf0e10cSrcweir		</xsl:choose>
638*cdf0e10cSrcweir	</xsl:template>
639*cdf0e10cSrcweir
640*cdf0e10cSrcweir</xsl:stylesheet>
641