You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@xalan.apache.org by bu...@apache.org on 2003/01/07 10:25:35 UTC

DO NOT REPLY [Bug 15830] New: - NullPointerException in translet

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

http://nagoya.apache.org/bugzilla/show_bug.cgi?id=15830

NullPointerException in translet

           Summary: NullPointerException in translet
           Product: XalanJ2
           Version: 2.4
          Platform: PC
        OS/Version: Windows XP
            Status: NEW
          Severity: Normal
          Priority: Other
         Component: Xalan-Xsltc
        AssignedTo: xalan-dev@xml.apache.org
        ReportedBy: fackel@dosco.de


XSLT stylesheet "mytransform.xsl" compiled with Xalan-J 2.4.1 (binary
distribution from apache.org) crashes with following stack trace in template
named "xref1". 

There are some workarounds for it (use templates named "xref2" or "xref3" as a
replacement for "xref1"), but error is not obvious for me as a stylesheet
developer. BTW: The stylesheet works without exception when invoked directly
without being compiled as a translet.

PS: I can provide all the files required to reproduce this bug, if one tells me
where to send it to.

-- Stack trace --
java.lang.NullPointerException
        at MyTranslet.xref1()
        at MyTranslet.applyTemplates()
        at MyTranslet.applyTemplates()
        at MyTranslet.root()
        at MyTranslet.applyTemplates()
        at MyTranslet.transform()
        at
org.apache.xalan.xsltc.runtime.AbstractTranslet.transform(AbstractTranslet.java:497)
        at org.apache.xalan.xsltc.cmdline.Transform.doTransform(Transform.java:216)
        at org.apache.xalan.xsltc.cmdline.Transform.main(Transform.java:370)
Translet error(s): null


-- Stylesheet including workaround templates (mytransform.xsl) --
<?xml version='1.0' encoding="ISO-8859-1"?>

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output method="html" version="1.0"/> 
 
  <xsl:template match="/" name="root">
    <html>
      <head>
        <title>Tranform</title>
      </head>
      <body>
        <xsl:apply-templates/>
      </body>
    </html>
  </xsl:template>


  <!-- 
   This template fails as a translet with Xalan-J 2.4.1
   -->
  <xsl:template match="xref" name="xref1">
    <xsl:variable name="target">
      <xsl:value-of select="@target"/>
    </xsl:variable> 

    <xsl:variable name="num">
      <xsl:for-each select="id($target)">
      	<xsl:number level="multiple" count="app" format="1.1.1.1"/> 
      </xsl:for-each> 
    </xsl:variable>

    <span class="xref">[1]
      <xsl:element name="a">
        <xsl:attribute name="href">
          <xsl:value-of select="$target"/>
        </xsl:attribute>
      </xsl:element> 
    </span>
  </xsl:template> 


  <!-- 
   This is a suitable workaround for xref1. 
   Note: Change match="xref2" to match="xref" to use this template.
   -->
  <xsl:template match="xref2" name="xref2">
    <xsl:variable name="target" select="@target"/>

    <xsl:variable name="num">
      <xsl:for-each select="id($target)">
      	<xsl:number level="multiple" count="app" format="1.1.1.1"/> 
      </xsl:for-each> 
    </xsl:variable>

    <span class="xref">[2]
      <xsl:element name="a">
        <xsl:attribute name="href">
          <xsl:value-of select="$target"/>
        </xsl:attribute>
      </xsl:element> 
    </span>
  </xsl:template> 


  <!-- 
   This is one works too, but in real life it wouldn't be a suitable solution if
   the variable num is required by the program logic.
   Note: Change match="xref3" to match="xref" to use this template.
   -->
  <xsl:template match="xref3" name="xref3">
    <xsl:variable name="target">
      <xsl:value-of select="@target"/>
    </xsl:variable> 

    <span class="xref">[3]
      <xsl:element name="a">
        <xsl:attribute name="href">
          <xsl:value-of select="$target"/>
        </xsl:attribute>
      </xsl:element> 
    </span>
  </xsl:template> 

</xsl:stylesheet>


-- Sample XML instance (sample.xml) --
<?xml version="1.0" encoding="utf-8"?>
<app><xref target="id1"/></app>


-- Batch file to invoke translet (transform.bat) --
@echo off

REM Here lives our java stuff
set JREDIR=c:\sgml-prg\jre\1.3.1
set XALANDIR=c:\sgml-prg\xalan\xalan-j_2_4_1

set ORIG_CLASSPATH=%CLASSPATH%

REM Setup java stuff
set JAVACALL=%JREDIR%\bin\java
set CLASSPATH=%JREDIR%\lib\rt.jar
set CLASSPATH=%CLASSPATH%;%XALANDIR%\bin\xercesImpl.jar
set CLASSPATH=%CLASSPATH%;%XALANDIR%\bin\xml-apis.jar
set CLASSPATH=%CLASSPATH%;%XALANDIR%\bin\xalan.jar
set CLASSPATH=%CLASSPATH%;%XALANDIR%\bin\runtime.jar
set CLASSPATH=%CLASSPATH%;transform.jar

REM Transformation *******************************************
%JAVACALL% org.apache.xalan.xslt.Process -xsl mytransform.xsl -in sample.xml
-out sample.htm
if errorlevel 1 echo Some error happend

:ende
set CLASSPATH=%ORIG_CLASSPATH%


-- Batch file to build translet (make.bat) --
@echo off

REM Here lives our java stuff
set JREDIR=c:\sgml-prg\jre\1.3.1
set XALANDIR=c:\sgml-prg\xalan\xalan-j_2_4_1

REM Setup java stuff
set ORIG_CLASSPATH=%CLASSPATH%
set CLASSPATH=%JREDIR%\lib\rt.jar
set CLASSPATH=%CLASSPATH%;%XALANDIR%\bin\xsltc.jar
set CLASSPATH=%CLASSPATH%;%XALANDIR%\bin\xercesImpl.jar
set CLASSPATH=%CLASSPATH%;%XALANDIR%\bin\xml-apis.jar
set CLASSPATH=%CLASSPATH%;%XALANDIR%\bin\runtime.jar
set CLASSPATH=%CLASSPATH%;%XALANDIR%\bin\BCEL.jar
set CLASSPATH=%CLASSPATH%;%XALANDIR%\bin\java_cup.jar
set CLASSPATH=%CLASSPATH%;%XALANDIR%\bin\JLex.jar
set CLASSPATH=%CLASSPATH%;%XALANDIR%\bin\regexp.jar

REM Deltree command
set DELTREE=rmdir /Q /S
if exist %windir%\command\deltree.exe set DELTREE=deltree /Y


REM Make
set BUILDDIR=build
set JARFILE=transform.jar

if exist %BUILDDIR%\nul %DELTREE% %BUILDDIR%
if exist %JARFILE% del %JARFILE%
mkdir %BUILDDIR%

java org.apache.xalan.xsltc.cmdline.Compile -x -o MyTranslet -d %BUILDDIR%
mytransform.xsl
jar cvfM %JARFILE% -C %BUILDDIR% .

if exist %BUILDDIR%\nul %DELTREE% %BUILDDIR%

REM Cleanup
set CLASSPATH=%ORIG_CLASSPATH%