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, '(')) < 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) > 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