DO NOT REPLY TO THIS EMAIL, BUT PLEASE POST YOUR BUG 
RELATED COMMENTS THROUGH THE WEB INTERFACE AVAILABLE AT
<http://issues.apache.org/bugzilla/show_bug.cgi?id=28213>.
ANY REPLY MADE TO THIS MESSAGE WILL NOT BE COLLECTED AND 
INSERTED IN THE BUG DATABASE.

http://issues.apache.org/bugzilla/show_bug.cgi?id=28213

xslt silently changes numerical values

           Summary: xslt silently changes numerical values
           Product: XalanJ2
           Version: CurrentCVS
          Platform: All
        OS/Version: All
            Status: NEW
          Severity: Critical
          Priority: Other
         Component: org.apache.xpath
        AssignedTo: [EMAIL PROTECTED]
        ReportedBy: [EMAIL PROTECTED]


There is a bug in the file XStringForFSB.java in method toDouble(). The code 
works by converting the input string into two long values - a values 
called "longResult" that contains the number without any decimal point; and a 
value called "scale" that contains a scaling factor determined by the position 
of the decimal point. 

This works fine when "longResult" and "scale" can fit into a signed 64-bit 
quantity, but goes horrendously wrong if they can't. This is easy to have 
happen: if the value "1234567890.0987654321" is pumped through the toDouble() 
method it comes out as -0.3708569905531746. This is a very bad thing. 

The problem is affecting Sun JDK 1.4.2 and BEA jRockit 1.4.2.

I attach a couple of files to illustrate. They are called "elements.xml" 
and "elements.xsl". Put them into a directory and then (using a Sun or BEA JDK 
1.4.2 release) run "java org.apache.xalan.xslt.Process -Q -IN elements.xml -XSL 
elements.xsl". You'll see that the reported "atomic weight" for hydrogen is 
right (it's 18 characters long), but the reported "atomic weight" for helium is 
completely wrong (it's 20 characters long).

File 1: elements.xml:
<?xml version="1.0"?>
<?xml-stylesheet type="text/xml" href="17-2.xsl"?> <PERIODIC_TABLE>
  <ATOM STATE="GAS">
    <NAME>Hydrogen</NAME>
    <SYMBOL>H</SYMBOL>
    <ATOMIC_NUMBER>1</ATOMIC_NUMBER>
    <ATOMIC_WEIGHT>1.00794736038591744</ATOMIC_WEIGHT>
    <BOILING_POINT UNITS="Kelvin">20.28</BOILING_POINT>
    <MELTING_POINT UNITS="Kelvin">13.81</MELTING_POINT>
    <DENSITY UNITS="grams/cubic centimeter">
      <!-- At 300K, 1 atm -->
      0.0000899
    </DENSITY>
  </ATOM>
  <ATOM STATE="GAS">
    <NAME>Helium</NAME>
    <SYMBOL>He</SYMBOL>
    <ATOMIC_NUMBER>2</ATOMIC_NUMBER>
    <ATOMIC_WEIGHT>4.00260222345678901235</ATOMIC_WEIGHT>
    <BOILING_POINT UNITS="Kelvin">4.216</BOILING_POINT>
    <MELTING_POINT UNITS="Kelvin">0.95</MELTING_POINT>
    <DENSITY UNITS="grams/cubic centimeter"><!-- At 300K -->
      0.0001785
    </DENSITY>
  </ATOM>
</PERIODIC_TABLE>

File 2: elements.xsl :
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"; version="1.0">
<xsl:template match="/">
<html>
<body>
<xsl:for-each select="PERIODIC_TABLE/ATOM">
<xsl:value-of select="NAME"/>
<xsl:value-of select="number(ATOMIC_WEIGHT)"/>
<br/>
</xsl:for-each>
</body>
</html>
</xsl:template>
</xsl:stylesheet>

This is a really really bad bug - it silently changes values from the input xml 
document. I really can't think of anything worse for xslt to do.

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to