1<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 2 3 <xsl:output method="text" /> 4 5 6 7 <!-- FileName: log10.xsl --> 8 9 <!-- Author: Darryl Fuller, SchemaSoft --> 10 11 <!-- Purpose: Torture test, compute log10 recursivly for the a bunch of numbers --> 12 13 14 15 16 17 <xsl:template match="/"> 18 19 <xsl:for-each select="./*/*/*/*"> 20 21 <xsl:variable name="val" select="position()"/> 22 23 <xsl:variable name="logval"> 24 25 <xsl:call-template name="log10"> 26 27 <xsl:with-param name="x" select="$val"/> 28 29 </xsl:call-template> 30 31 </xsl:variable> 32 33Value: <xsl:value-of select="$val"/> Log10: <xsl:value-of select="$logval"/> 34 35 </xsl:for-each> 36 37 </xsl:template> 38 39 40 41 <xsl:template name="ln" > 42 43 <xsl:param name="x"/> 44 45 <xsl:variable name="e">2.71828182845904</xsl:variable> 46 47 <xsl:choose> 48 49 <xsl:when test="$x = 0">0</xsl:when> 50 51 <!-- technically, a negative number should be NaN, but we will 52 53 instead pretend we're just scaling a negative number 54 55 with the ln function --> 56 57 <xsl:when test="$x < 0"> 58 59 <xsl:variable name="scaled_answer"> 60 61 <xsl:call-template name="ln"> 62 63 <xsl:with-param name="x" select="$x * -1"/> 64 65 </xsl:call-template> 66 67 </xsl:variable> 68 69 <xsl:value-of select="$scaled_answer * -1"/> 70 71 </xsl:when> 72 73 <!-- A table of some common values --> 74 75 <xsl:when test="$x = 10">2.3025850929940</xsl:when> 76 77 <xsl:when test="$x = 20">2.9957322735539</xsl:when> 78 79 <xsl:when test="$x = 30">3.4011973816621</xsl:when> 80 81 <xsl:when test="$x = 40">3.6888794541139</xsl:when> 82 83 <xsl:when test="$x = 50">3.9120230054281</xsl:when> 84 85 <xsl:when test="$x = 60">4.0943445622221</xsl:when> 86 87 <xsl:when test="$x = 70">4.2484952420493</xsl:when> 88 89 <xsl:when test="$x = 80">4.3820266346738</xsl:when> 90 91 <xsl:when test="$x = 90">4.4998096703302</xsl:when> 92 93 <xsl:when test="$x = 100">4.6051701859881</xsl:when> 94 95 <xsl:when test="$x = 200">5.2983173665480</xsl:when> 96 97 <xsl:when test="$x = 300">5.7037824746562</xsl:when> 98 99 <xsl:when test="$x = 400">5.9914645471079</xsl:when> 100 101 <xsl:when test="$x = 500">6.2146080984222</xsl:when> 102 103 <xsl:when test="$x = 600">6.3969296552161</xsl:when> 104 105 <xsl:when test="$x = 700">6.5510803350434</xsl:when> 106 107 <xsl:when test="$x = 800">6.6846117276679</xsl:when> 108 109 <xsl:when test="$x = 900">6.8023947633243</xsl:when> 110 111 <xsl:when test="$x = 1000">6.90775527898213</xsl:when> 112 113 <!-- scale the answer --> 114 115 <xsl:when test="$x > 20"> 116 117 <xsl:variable name="scaled_answer"> 118 119 <xsl:call-template name="ln"> 120 121 <xsl:with-param name="x" select="$x div $e"/> 122 123 </xsl:call-template> 124 125 </xsl:variable> 126 127 <xsl:value-of select="$scaled_answer + 1"/> 128 129 </xsl:when> 130 131 <!-- scale the answer --> 132 133 <xsl:when test="$x < 0.005"> 134 135 <xsl:variable name="scaled_answer"> 136 137 <xsl:call-template name="ln"> 138 139 <xsl:with-param name="x" select="$x * $e"/> 140 141 </xsl:call-template> 142 143 </xsl:variable> 144 145 <xsl:value-of select="$scaled_answer - 1"/> 146 147 </xsl:when> 148 149 <!-- The straight goods --> 150 151 <xsl:otherwise> 152 153 <xsl:variable name="z"> 154 155 <xsl:call-template name="z_value"> 156 157 <xsl:with-param name="x" select="$x"/> 158 159 </xsl:call-template> 160 161 </xsl:variable> 162 163 <xsl:variable name="interim_answer"> 164 165 <xsl:call-template name="ln_recurse"> 166 167 <xsl:with-param name="z" select="$z"/> 168 169 <xsl:with-param name="current" select="0"/> 170 171 <xsl:with-param name="term" select="1"/> 172 173 </xsl:call-template> 174 175 </xsl:variable> 176 177 <xsl:value-of select="$interim_answer * 2"/> 178 179 </xsl:otherwise> 180 181 </xsl:choose> 182 183 </xsl:template> 184 185 <xsl:template name="z_value"> 186 187 <xsl:param name="x"/> 188 189 <xsl:value-of select="($x - 1) div ($x + 1)"/> 190 191 </xsl:template> 192 193 <xsl:template name="ln_recurse"> 194 195 <xsl:param name="z"/> 196 197 <xsl:param name="current"/> 198 199 <xsl:param name="term"/> 200 201 <xsl:variable name="term_value"> 202 203 <xsl:call-template name="ln_term"> 204 205 <xsl:with-param name="z" select="$z"/> 206 207 <xsl:with-param name="n" select="$term"/> 208 209 </xsl:call-template> 210 211 </xsl:variable> 212 213 <xsl:variable name="val" select="$current + $term_value"/> 214 215 <xsl:choose> 216 217 <xsl:when test="$val = $current"> 218 219 <xsl:value-of select="$current"/> 220 221 </xsl:when> 222 223 <!-- Limiting the number of terms we calculate to is a trade 224 225 off of accuracy v.s. speed. I'm currently sacrificing 226 227 accuracy for a bit o' speed to make this less painfully 228 229 slow --> 230 231 <xsl:when test="$term > 100"> 232 233 <xsl:value-of select="$current"/> 234 235 </xsl:when> 236 237 <xsl:otherwise> 238 239 <xsl:call-template name="ln_recurse"> 240 241 <xsl:with-param name="z" select="$z"/> 242 243 <xsl:with-param name="current" select="$val"/> 244 245 <xsl:with-param name="term" select="$term + 2"/> 246 247 </xsl:call-template> 248 249 </xsl:otherwise> 250 251 </xsl:choose> 252 253 </xsl:template> 254 255 <xsl:template name="ln_term"> 256 257 <xsl:param name="z"/> 258 259 <xsl:param name="n"/> 260 261 <xsl:variable name="numerator"> 262 263 <xsl:call-template name="pow_function"> 264 265 <xsl:with-param name="number" select="$z"/> 266 267 <xsl:with-param name="power" select="$n"/> 268 269 </xsl:call-template> 270 271 </xsl:variable> 272 273 <xsl:value-of select="$numerator div $n"/> 274 275 </xsl:template> 276 277 <xsl:template name="pow_function" ><!-- Power function. 278 279 Calculates number ^ power where power is an 280 281 integer. --> 282 283 <xsl:param name="number"/> 284 285 <xsl:param name="power"/> 286 287 288 289 <xsl:variable name="int_power" select="round( $power )"/> 290 291 <xsl:variable name="rest"> 292 293 <xsl:choose> 294 295 <xsl:when test="$int_power > 0"> 296 297 <xsl:call-template name="pow_function"> 298 299 <xsl:with-param name="number" select="$number"/> 300 301 <xsl:with-param name="power" select="$int_power - 1"/> 302 303 </xsl:call-template> 304 305 </xsl:when> 306 307 <xsl:when test="$int_power < 0"> 308 309 <xsl:call-template name="pow_function"> 310 311 <xsl:with-param name="number" select="$number"/> 312 313 <xsl:with-param name="power" select="$int_power + 1"/> 314 315 </xsl:call-template> 316 317 </xsl:when> 318 319 <xsl:otherwise>1</xsl:otherwise> 320 321 </xsl:choose> 322 323 </xsl:variable> 324 325 <xsl:variable name="result"> 326 327 <xsl:choose> 328 329 <xsl:when test="$int_power > 0"> 330 331 <xsl:value-of select="$rest * $number"/> 332 333 </xsl:when> 334 335 <xsl:when test="$int_power < 0"> 336 337 <xsl:value-of select="$rest div $number"/> 338 339 </xsl:when> 340 341 <xsl:otherwise> 342 343 1 344 345 </xsl:otherwise> 346 347 </xsl:choose> 348 349 </xsl:variable> 350 351 <xsl:value-of select="$result"/> 352 353 </xsl:template> 354 355 <xsl:template name="log10"><!-- Log (base 10). --> 356 357 <xsl:param name="x"/> 358 359 <xsl:variable name="numerator"> 360 361 <xsl:call-template name="ln"> 362 363 <xsl:with-param name="x" select="$x"/> 364 365 </xsl:call-template> 366 367 </xsl:variable> 368 369 <!-- ln(10) --> 370 371 <xsl:variable name="denominator" select="2.302585092994045684"/> 372 373 <xsl:value-of select="$numerator div $denominator"/> 374 375 </xsl:template> 376 377 <!-- 378 * Licensed to the Apache Software Foundation (ASF) under one 379 * or more contributor license agreements. See the NOTICE file 380 * distributed with this work for additional information 381 * regarding copyright ownership. The ASF licenses this file 382 * to you under the Apache License, Version 2.0 (the "License"); 383 * you may not use this file except in compliance with the License. 384 * You may obtain a copy of the License at 385 * 386 * http://www.apache.org/licenses/LICENSE-2.0 387 * 388 * Unless required by applicable law or agreed to in writing, software 389 * distributed under the License is distributed on an "AS IS" BASIS, 390 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 391 * See the License for the specific language governing permissions and 392 * limitations under the License. 393 --> 394 395 </xsl:stylesheet> 396