| 1 | <?xml version="1.0"?> | 
| 2 | <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> | 
| 3 | <!-- | 
| 4 | ========================================================================== | 
| 5 | Stylesheet: numberutils_lib.xsl | 
| 6 | ========================================================================== --> | 
| 7 |  | 
| 8 | <!-- ========================================================= --> | 
| 9 | <!-- Function: Bin2Dec(<value>) => Decimal value               --> | 
| 10 | <!-- Parameters:-                                              --> | 
| 11 | <!--   <value>  - the binary string to be converted to decimal --> | 
| 12 | <xsl:template name="Bin2Dec"> | 
| 13 | <xsl:param name="value" select="'0'"/> | 
| 14 | <!-- the following paremeters are used only during recursion --> | 
| 15 | <xsl:param name="bin-power" select="number(1)"/> | 
| 16 | <xsl:param name="accum" select="number(0)"/> | 
| 17 | <!-- isolate last binary digit  --> | 
| 18 | <xsl:variable name="bin-digit" select="substring($value,string-length($value),1)"/> | 
| 19 | <!-- check that binary digit is valid --> | 
| 20 | <xsl:choose> | 
| 21 | <xsl:when test="not(contains('01',$bin-digit))"> | 
| 22 | <!-- not a binary digit! --> | 
| 23 | <xsl:text>NaN</xsl:text> | 
| 24 | </xsl:when> | 
| 25 | <xsl:when test="string-length($bin-digit) = 0"> | 
| 26 | <!-- unexpected end of hex string --> | 
| 27 | <xsl:text>0</xsl:text> | 
| 28 | </xsl:when> | 
| 29 | <xsl:otherwise> | 
| 30 | <!-- OK so far --> | 
| 31 | <xsl:variable name="remainder" select="substring($value,1,string-length($value)-1)"/> | 
| 32 | <xsl:variable name="this-digit-value" select="number($bin-digit) * $bin-power"/> | 
| 33 | <!-- determine whether this is the end of the hex string --> | 
| 34 | <xsl:choose> | 
| 35 | <xsl:when test="string-length($remainder) = 0"> | 
| 36 | <!-- end - output final result --> | 
| 37 | <xsl:value-of select="$accum + $this-digit-value"/> | 
| 38 | </xsl:when> | 
| 39 | <xsl:otherwise> | 
| 40 | <!-- recurse to self for next digit --> | 
| 41 | <xsl:call-template name="Bin2Dec"> | 
| 42 | <xsl:with-param name="value" select="$remainder"/> | 
| 43 | <xsl:with-param name="bin-power" select="$bin-power * 2"/> | 
| 44 | <xsl:with-param name="accum" select="$accum + $this-digit-value"/> | 
| 45 | </xsl:call-template> | 
| 46 | </xsl:otherwise> | 
| 47 | </xsl:choose> | 
| 48 | </xsl:otherwise> | 
| 49 | </xsl:choose> | 
| 50 | </xsl:template> | 
| 51 |  | 
| 52 | <!-- ======================================================== --> | 
| 53 | <!-- Function: Hex2Dec(<value>) => Decimal value              --> | 
| 54 | <!-- Parameters:-                                             --> | 
| 55 | <!--   <value>  - the hex string to be converted to decimal   --> | 
| 56 | <!--              (case of hex string is unimportant)         --> | 
| 57 | <xsl:template name="Hex2Dec"> | 
| 58 | <xsl:param name="value" select="'0'"/> | 
| 59 | <!-- the following paremeters are used only during recursion --> | 
| 60 | <xsl:param name="hex-power" select="number(1)"/> | 
| 61 | <xsl:param name="accum" select="number(0)"/> | 
| 62 | <!-- isolate last hex digit (and convert it to upper case) --> | 
| 63 | <xsl:variable name="hex-digit" select="translate(substring($value,string-length($value),1),'abcdef','ABCDEF')"/> | 
| 64 | <!-- check that hex digit is valid --> | 
| 65 | <xsl:choose> | 
| 66 | <xsl:when test="not(contains('0123456789ABCDEF',$hex-digit))"> | 
| 67 | <!-- not a hex digit! --> | 
| 68 | <xsl:text>NaN</xsl:text> | 
| 69 | </xsl:when> | 
| 70 | <xsl:when test="string-length($hex-digit) = 0"> | 
| 71 | <!-- unexpected end of hex string --> | 
| 72 | <xsl:text>0</xsl:text> | 
| 73 | </xsl:when> | 
| 74 | <xsl:otherwise> | 
| 75 | <!-- OK so far --> | 
| 76 | <xsl:variable name="remainder" select="substring($value,1,string-length($value)-1)"/> | 
| 77 | <xsl:variable name="this-digit-value" select="string-length(substring-before('0123456789ABCDEF',$hex-digit)) * $hex-power"/> | 
| 78 | <!-- determine whether this is the end of the hex string --> | 
| 79 | <xsl:choose> | 
| 80 | <xsl:when test="string-length($remainder) = 0"> | 
| 81 | <!-- end - output final result --> | 
| 82 | <xsl:value-of select="$accum + $this-digit-value"/> | 
| 83 | </xsl:when> | 
| 84 | <xsl:otherwise> | 
| 85 | <!-- recurse to self for next digit --> | 
| 86 | <xsl:call-template name="Hex2Dec"> | 
| 87 | <xsl:with-param name="value" select="$remainder"/> | 
| 88 | <xsl:with-param name="hex-power" select="$hex-power * 16"/> | 
| 89 | <xsl:with-param name="accum" select="$accum + $this-digit-value"/> | 
| 90 | </xsl:call-template> | 
| 91 | </xsl:otherwise> | 
| 92 | </xsl:choose> | 
| 93 | </xsl:otherwise> | 
| 94 | </xsl:choose> | 
| 95 | </xsl:template> | 
| 96 |  | 
| 97 | <!-- ===================================================== --> | 
| 98 | <!-- Function: Dec2Hex(<value>[,<digits>]) => Hex string   --> | 
| 99 | <!-- Parameters:-                                          --> | 
| 100 | <!--   <value>  - the decimal value to be converted to hex --> | 
| 101 | <!--              (must be a positive)                     --> | 
| 102 | <!--   <digits> - the number of hex digits required        --> | 
| 103 | <!--              If this parameter is omitted then the    --> | 
| 104 | <!--              hex string returned is as long as reqd.  --> | 
| 105 | <!--              If the number of digits required exceeds --> | 
| 106 | <!--              the value specified by this parameter    --> | 
| 107 | <!--              then the hex string is as long as reqd.  --> | 
| 108 | <xsl:template name="Dec2Hex"> | 
| 109 | <xsl:param name="value" select="number(0)"/> | 
| 110 | <xsl:param name="digits" select="number(-1)"/> | 
| 111 | <!-- the following paremeters are used only during recursion --> | 
| 112 | <xsl:param name="hex" select="number(268435456)"/> | 
| 113 | <xsl:param name="hex-power" select="number(28)"/> | 
| 114 | <xsl:param name="nonzero-encounters" select="false()"/> | 
| 115 | <!-- calculate the left over value to be passed to next recursion --> | 
| 116 | <xsl:variable name="remainder" select="floor($value) mod $hex"/> | 
| 117 | <!-- calculate the value of this nybble (this hex digit) --> | 
| 118 | <xsl:variable name="this-nybble" select="(floor($value) - $remainder) div ($hex)"/> | 
| 119 | <!-- determine whether a non-zero digit has been encountered yet --> | 
| 120 | <xsl:variable name="nonzero-encountered" select="boolean($nonzero-encounters or ($this-nybble > 0))"/> | 
| 121 | <!-- only output hex digit if:-                   --> | 
| 122 | <!--     non-zero has already been encountered OR --> | 
| 123 | <!--     on the last digit OR                     --> | 
| 124 | <!--     the number of required digits says so    --> | 
| 125 | <xsl:if test="$nonzero-encountered or ($hex-power = 0) or ((($hex-power div 4) + 1) <= $digits)"> | 
| 126 | <xsl:value-of select="substring('0123456789ABCDEF',($this-nybble)+1,1)"/> | 
| 127 | </xsl:if> | 
| 128 | <!-- recursive call until all digits have been dealt with --> | 
| 129 | <xsl:if test="$hex-power > 0"> | 
| 130 | <xsl:call-template name="Dec2Hex"> | 
| 131 | <xsl:with-param name="value" select="$remainder"/> | 
| 132 | <xsl:with-param name="hex" select="$hex div 16"/> | 
| 133 | <xsl:with-param name="hex-power" select="$hex-power - 4"/> | 
| 134 | <xsl:with-param name="digits" select="$digits"/> | 
| 135 | <xsl:with-param name="nonzero-encounters" select="$nonzero-encountered"/> | 
| 136 | </xsl:call-template> | 
| 137 | </xsl:if> | 
| 138 | </xsl:template> | 
| 139 |  | 
| 140 | <!-- ======================================================== --> | 
| 141 | <!-- Function: Dec2Bin(<value>) => Binary string              --> | 
| 142 | <!-- Parameters:-                                             --> | 
| 143 | <!--   <value>  - the decimal value to be converted to binary --> | 
| 144 | <!--              (must be a positive)                        --> | 
| 145 | <xsl:template name="Dec2Bin"> | 
| 146 | <xsl:param name="value" select="number(0)"/> | 
| 147 | <!-- the following paremeters are used only during recursion --> | 
| 148 | <xsl:param name="bin" select="number(2147483648)"/> | 
| 149 | <xsl:param name="bin-power" select="number(31)"/> | 
| 150 | <xsl:param name="one-encounters" select="false()"/> | 
| 151 | <!-- calculate the left over value to be passed to next recursion --> | 
| 152 | <xsl:variable name="remainder" select="$value mod $bin"/> | 
| 153 | <!-- calculate the value of this bit (this binary digit) --> | 
| 154 | <xsl:variable name="this-bit" select="$value - $remainder"/> | 
| 155 | <!-- determine whether a non-zero digit has been encountered yet --> | 
| 156 | <xsl:variable name="one-encountered" select="boolean($one-encounters or ($this-bit > 0))"/> | 
| 157 | <!-- only output digit if:                        --> | 
| 158 | <!--     non-zero has already been encountered OR --> | 
| 159 | <!--     on the last digit                        --> | 
| 160 | <xsl:if test="$one-encountered or ($bin-power = 0)"> | 
| 161 | <xsl:value-of select="substring('01',($this-bit div $bin)+1,1)"/> | 
| 162 | </xsl:if> | 
| 163 | <!-- recursive call until all digits have been dealt with --> | 
| 164 | <xsl:if test="$bin-power > 0"> | 
| 165 | <xsl:call-template name="Dec2Bin"> | 
| 166 | <xsl:with-param name="value" select="$remainder"/> | 
| 167 | <xsl:with-param name="bin" select="$bin div 2"/> | 
| 168 | <xsl:with-param name="bin-power" select="$bin-power - 1"/> | 
| 169 | <xsl:with-param name="one-encounters" select="$one-encountered"/> | 
| 170 | </xsl:call-template> | 
| 171 | </xsl:if> | 
| 172 | </xsl:template> | 
| 173 |  | 
| 174 | <!-- ======================================================== --> | 
| 175 | <!-- Function: BinAND(<bin1>,<bin2>) => Binary string         --> | 
| 176 | <!-- Parameters:-                                             --> | 
| 177 | <!--   <bin1>  - the first binary string number to be ANDed   --> | 
| 178 | <!--   <bin2>  - the second binary string number to be ANDed  --> | 
| 179 | <xsl:template name="BinAND"> | 
| 180 | <xsl:param name="bin1" select="'0'"/> | 
| 181 | <xsl:param name="bin2" select="'0'"/> | 
| 182 | <!-- param used for recursion iteration --> | 
| 183 | <xsl:param name="i" select="number(1)"/> | 
| 184 | <xsl:variable name="max-len"> | 
| 185 | <xsl:choose> | 
| 186 | <xsl:when test="string-length($bin1) > string-length($bin2)"><xsl:value-of select="string-length($bin1)"/></xsl:when> | 
| 187 | <xsl:otherwise><xsl:value-of select="string-length($bin2)"/></xsl:otherwise> | 
| 188 | </xsl:choose> | 
| 189 | </xsl:variable> | 
| 190 | <xsl:variable name="sbin1" select="substring(concat(substring('00000000000000000000000000000000',1,$max-len - string-length($bin1)),$bin1),$i,1)"/> | 
| 191 | <xsl:variable name="sbin2" select="substring(concat(substring('00000000000000000000000000000000',1,$max-len - string-length($bin2)),$bin2),$i,1)"/> | 
| 192 | <xsl:choose> | 
| 193 | <xsl:when test="$sbin1 = '1' and $sbin2 = '1'"><xsl:text>1</xsl:text></xsl:when> | 
| 194 | <xsl:otherwise><xsl:text>0</xsl:text></xsl:otherwise> | 
| 195 | </xsl:choose> | 
| 196 | <xsl:if test="$i < $max-len"> | 
| 197 | <xsl:call-template name="BinAND"> | 
| 198 | <xsl:with-param name="bin1" select="$bin1"/> | 
| 199 | <xsl:with-param name="bin2" select="$bin2"/> | 
| 200 | <xsl:with-param name="i" select="$i + 1"/> | 
| 201 | </xsl:call-template> | 
| 202 | </xsl:if> | 
| 203 | </xsl:template> | 
| 204 |  | 
| 205 | <!-- ======================================================== --> | 
| 206 | <!-- Function: BinOR(<bin1>,<bin2>) => Binary string          --> | 
| 207 | <!-- Parameters:-                                             --> | 
| 208 | <!--   <bin1>  - the first binary string number to be ORed    --> | 
| 209 | <!--   <bin2>  - the second binary string number to be ORed   --> | 
| 210 | <xsl:template name="BinOR"> | 
| 211 | <xsl:param name="bin1" select="'0'"/> | 
| 212 | <xsl:param name="bin2" select="'0'"/> | 
| 213 | <!-- param used for recursion iteration --> | 
| 214 | <xsl:param name="i" select="number(1)"/> | 
| 215 | <xsl:variable name="max-len"> | 
| 216 | <xsl:choose> | 
| 217 | <xsl:when test="string-length($bin1) > string-length($bin2)"><xsl:value-of select="string-length($bin1)"/></xsl:when> | 
| 218 | <xsl:otherwise><xsl:value-of select="string-length($bin2)"/></xsl:otherwise> | 
| 219 | </xsl:choose> | 
| 220 | </xsl:variable> | 
| 221 | <xsl:variable name="sbin1" select="substring(concat(substring('00000000000000000000000000000000',1,$max-len - string-length($bin1)),$bin1),$i,1)"/> | 
| 222 | <xsl:variable name="sbin2" select="substring(concat(substring('00000000000000000000000000000000',1,$max-len - string-length($bin2)),$bin2),$i,1)"/> | 
| 223 | <xsl:choose> | 
| 224 | <xsl:when test="$sbin1 = '1' or $sbin2 = '1'"><xsl:text>1</xsl:text></xsl:when> | 
| 225 | <xsl:otherwise><xsl:text>0</xsl:text></xsl:otherwise> | 
| 226 | </xsl:choose> | 
| 227 | <xsl:if test="$i < $max-len"> | 
| 228 | <xsl:call-template name="BinOR"> | 
| 229 | <xsl:with-param name="bin1" select="$bin1"/> | 
| 230 | <xsl:with-param name="bin2" select="$bin2"/> | 
| 231 | <xsl:with-param name="i" select="$i + 1"/> | 
| 232 | </xsl:call-template> | 
| 233 | </xsl:if> | 
| 234 | </xsl:template> | 
| 235 |  | 
| 236 | <!-- ======================================================== --> | 
| 237 | <!-- Function: BinXOR(<bin1>,<bin2>) => Binary string         --> | 
| 238 | <!-- Parameters:-                                             --> | 
| 239 | <!--   <bin1>  - the first binary string number to be XORed   --> | 
| 240 | <!--   <bin2>  - the second binary string number to be XORed  --> | 
| 241 | <xsl:template name="BinXOR"> | 
| 242 | <xsl:param name="bin1" select="'0'"/> | 
| 243 | <xsl:param name="bin2" select="'0'"/> | 
| 244 | <!-- param used for recursion iteration --> | 
| 245 | <xsl:param name="i" select="number(1)"/> | 
| 246 | <xsl:variable name="max-len"> | 
| 247 | <xsl:choose> | 
| 248 | <xsl:when test="string-length($bin1) > string-length($bin2)"><xsl:value-of select="string-length($bin1)"/></xsl:when> | 
| 249 | <xsl:otherwise><xsl:value-of select="string-length($bin2)"/></xsl:otherwise> | 
| 250 | </xsl:choose> | 
| 251 | </xsl:variable> | 
| 252 | <xsl:variable name="sbin1" select="substring(concat(substring('00000000000000000000000000000000',1,$max-len - string-length($bin1)),$bin1),$i,1)"/> | 
| 253 | <xsl:variable name="sbin2" select="substring(concat(substring('00000000000000000000000000000000',1,$max-len - string-length($bin2)),$bin2),$i,1)"/> | 
| 254 | <xsl:choose> | 
| 255 | <xsl:when test="$sbin1 = '1' and $sbin2 = '1'"><xsl:text>0</xsl:text></xsl:when> | 
| 256 | <xsl:when test="$sbin1 = '1' or $sbin2 = '1'"><xsl:text>1</xsl:text></xsl:when> | 
| 257 | <xsl:otherwise><xsl:text>0</xsl:text></xsl:otherwise> | 
| 258 | </xsl:choose> | 
| 259 | <xsl:if test="$i < $max-len"> | 
| 260 | <xsl:call-template name="BinXOR"> | 
| 261 | <xsl:with-param name="bin1" select="$bin1"/> | 
| 262 | <xsl:with-param name="bin2" select="$bin2"/> | 
| 263 | <xsl:with-param name="i" select="$i + 1"/> | 
| 264 | </xsl:call-template> | 
| 265 | </xsl:if> | 
| 266 | </xsl:template> | 
| 267 |  | 
| 268 | <!-- ======================================================== --> | 
| 269 | <!-- Function: BinNOT(<bin>) => Binary string                 --> | 
| 270 | <!-- Parameters:-                                             --> | 
| 271 | <!--   <bin>  - the binary string number to be NOTed          --> | 
| 272 | <xsl:template name="BinNOT"> | 
| 273 | <xsl:param name="bin" select="'0'"/> | 
| 274 | <xsl:param name="max-bits" select="number(32)"/> | 
| 275 | <xsl:variable name="not1" select="translate($bin,'01','10')"/> | 
| 276 | <xsl:value-of select="concat(substring('11111111111111111111111111111111',1,$max-bits - string-length($not1)),$not1)"/> | 
| 277 | </xsl:template> | 
| 278 |  | 
| 279 | <!-- ======================================================== --> | 
| 280 | <!-- Function: BooleanOR(<value1>,<value2>) => number         --> | 
| 281 | <!-- Parameters:-                                             --> | 
| 282 | <!--   <value1>  - the first number to be ORed                --> | 
| 283 | <!--   <value2>  - the second number to be ORed               --> | 
| 284 | <!-- NB. Only works with positive numbers!                    --> | 
| 285 | <xsl:template name="BooleanOR"> | 
| 286 | <xsl:param name="value1" select="number(0)"/> | 
| 287 | <xsl:param name="value2" select="number(0)"/> | 
| 288 | <!-- recurse parameters --> | 
| 289 | <xsl:param name="bitval" select="number(2147483648)"/> | 
| 290 | <xsl:param name="accum" select="number(0)"/> | 
| 291 | <!-- calc bits present on values --> | 
| 292 | <xsl:variable name="bit1" select="floor($value1 div $bitval)"/> | 
| 293 | <xsl:variable name="bit2" select="floor($value2 div $bitval)"/> | 
| 294 | <!-- do the OR on the bits --> | 
| 295 | <xsl:variable name="thisbit"> | 
| 296 | <xsl:choose> | 
| 297 | <xsl:when test="($bit1 != 0) or ($bit2 != 0)"><xsl:value-of select="$bitval"/></xsl:when> | 
| 298 | <xsl:otherwise>0</xsl:otherwise> | 
| 299 | </xsl:choose> | 
| 300 | </xsl:variable> | 
| 301 | <!-- if last recurse then output the value --> | 
| 302 | <xsl:choose> | 
| 303 | <xsl:when test="$bitval = 1"><xsl:value-of select="$accum + $thisbit"/></xsl:when> | 
| 304 | <xsl:otherwise> | 
| 305 | <!-- recurse required --> | 
| 306 | <xsl:call-template name="BooleanOR"> | 
| 307 | <xsl:with-param name="value1" select="$value1 mod $bitval"/> | 
| 308 | <xsl:with-param name="value2" select="$value2 mod $bitval"/> | 
| 309 | <xsl:with-param name="bitval" select="$bitval div 2"/> | 
| 310 | <xsl:with-param name="accum" select="$accum + $thisbit"/> | 
| 311 | </xsl:call-template> | 
| 312 | </xsl:otherwise> | 
| 313 | </xsl:choose> | 
| 314 | </xsl:template> | 
| 315 |  | 
| 316 | <!-- ======================================================== --> | 
| 317 | <!-- Function: BooleanAND(<value1>,<value2>) => number        --> | 
| 318 | <!-- Parameters:-                                             --> | 
| 319 | <!--   <value1>  - the first number to be ANDed               --> | 
| 320 | <!--   <value2>  - the second number to be ANDed              --> | 
| 321 | <!-- NB. Only works with positive numbers!                    --> | 
| 322 | <xsl:template name="BooleanAND"> | 
| 323 | <xsl:param name="value1" select="number(0)"/> | 
| 324 | <xsl:param name="value2" select="number(0)"/> | 
| 325 | <!-- recurse parameters --> | 
| 326 | <xsl:param name="bitval" select="number(2147483648)"/> | 
| 327 | <xsl:param name="accum" select="number(0)"/> | 
| 328 | <!-- calc bits present on values --> | 
| 329 | <xsl:variable name="bit1" select="floor($value1 div $bitval)"/> | 
| 330 | <xsl:variable name="bit2" select="floor($value2 div $bitval)"/> | 
| 331 | <!-- do the OR on the bits --> | 
| 332 | <xsl:variable name="thisbit"> | 
| 333 | <xsl:choose> | 
| 334 | <xsl:when test="($bit1 != 0) and ($bit2 != 0)"><xsl:value-of select="$bitval"/></xsl:when> | 
| 335 | <xsl:otherwise>0</xsl:otherwise> | 
| 336 | </xsl:choose> | 
| 337 | </xsl:variable> | 
| 338 | <!-- if last recurse then output the value --> | 
| 339 | <xsl:choose> | 
| 340 | <xsl:when test="$bitval = 1"><xsl:value-of select="$accum + $thisbit"/></xsl:when> | 
| 341 | <xsl:otherwise> | 
| 342 | <!-- recurse required --> | 
| 343 | <xsl:call-template name="BooleanAND"> | 
| 344 | <xsl:with-param name="value1" select="$value1 mod $bitval"/> | 
| 345 | <xsl:with-param name="value2" select="$value2 mod $bitval"/> | 
| 346 | <xsl:with-param name="bitval" select="$bitval div 2"/> | 
| 347 | <xsl:with-param name="accum" select="$accum + $thisbit"/> | 
| 348 | </xsl:call-template> | 
| 349 | </xsl:otherwise> | 
| 350 | </xsl:choose> | 
| 351 | </xsl:template> | 
| 352 |  | 
| 353 | <!-- ======================================================== --> | 
| 354 | <!-- Function: BooleanXOR(<value1>,<value2>) => number        --> | 
| 355 | <!-- Parameters:-                                             --> | 
| 356 | <!--   <value1>  - the first number to be XORed               --> | 
| 357 | <!--   <value2>  - the second number to be XORed              --> | 
| 358 | <!-- NB. Only works with positive numbers!                    --> | 
| 359 | <xsl:template name="BooleanXOR"> | 
| 360 | <xsl:param name="value1" select="number(0)"/> | 
| 361 | <xsl:param name="value2" select="number(0)"/> | 
| 362 | <!-- recurse parameters --> | 
| 363 | <xsl:param name="bitval" select="number(2147483648)"/> | 
| 364 | <xsl:param name="accum" select="number(0)"/> | 
| 365 | <!-- calc bits present on values --> | 
| 366 | <xsl:variable name="bit1" select="floor($value1 div $bitval)"/> | 
| 367 | <xsl:variable name="bit2" select="floor($value2 div $bitval)"/> | 
| 368 | <!-- do the XOR on the bits --> | 
| 369 | <xsl:variable name="thisbit"> | 
| 370 | <xsl:choose> | 
| 371 | <xsl:when test="(($bit1 != 0) and ($bit2 = 0)) or (($bit1 = 0) and ($bit2 != 0))"><xsl:value-of select="$bitval"/></xsl:when> | 
| 372 | <xsl:otherwise>0</xsl:otherwise> | 
| 373 | </xsl:choose> | 
| 374 | </xsl:variable> | 
| 375 | <!-- if last recurse then output the value --> | 
| 376 | <xsl:choose> | 
| 377 | <xsl:when test="$bitval = 1"><xsl:value-of select="$accum + $thisbit"/></xsl:when> | 
| 378 | <xsl:otherwise> | 
| 379 | <!-- recurse required --> | 
| 380 | <xsl:call-template name="BooleanXOR"> | 
| 381 | <xsl:with-param name="value1" select="$value1 mod $bitval"/> | 
| 382 | <xsl:with-param name="value2" select="$value2 mod $bitval"/> | 
| 383 | <xsl:with-param name="bitval" select="$bitval div 2"/> | 
| 384 | <xsl:with-param name="accum" select="$accum + $thisbit"/> | 
| 385 | </xsl:call-template> | 
| 386 | </xsl:otherwise> | 
| 387 | </xsl:choose> | 
| 388 | </xsl:template> | 
| 389 |  | 
| 390 | </xsl:stylesheet> |