ResultTreeFragment and XT extension mechanism

Subject: ResultTreeFragment and XT extension mechanism
From: Denys Duchier <Denys.Duchier@xxxxxxxxxxxx>
Date: 07 Aug 1999 23:32:56 +0200
Hi James,

Sorry to bug you again, but I have been trying to figure out how to
use the extension mechanism to build a database of result tree
fragments (to speed up various transformations).  My test example
below simply allows to save and retrieve one result tree fragment.
>From looking at the code I thought that I needed to invoke an instance
method for the `wrapping' process to work (correct me if I am wrong),
but that still didn't quite do the trick.  With the example below, XT
gives me the following output/error:

*** PUT ***
*** NEW ***
*** GET ***
<one xmlns:save="http://www.jclark.com/xt/java/Save";>
[1]
<two>HELLO</two><two xmlns:save="http://www.jclark.com/xt/java/Save";>HELLO</two>Exception in thread "main" java.lang.NullPointerException
	at com.jclark.xsl.sax.XMLOutputHandler.put(Compiled Code)
	at com.jclark.xsl.sax.XMLOutputHandler.writeRaw(Compiled Code)
	at com.jclark.xsl.sax.XMLOutputHandler.characters(Compiled Code)
	at com.jclark.xsl.sax.ResultBase.flush(Compiled Code)
	at com.jclark.xsl.sax.ResultBase.endElement(Compiled Code)
	at com.jclark.xsl.tr.LiteralElementAction.invoke(Compiled Code)
	at com.jclark.xsl.tr.AppendAction.invoke(Compiled Code)
	at com.jclark.xsl.tr.SheetImpl$ProcessContextImpl.processSafe(Compiled Code)
	at com.jclark.xsl.tr.SheetImpl.process(Compiled Code)
	at com.jclark.xsl.sax.XSLProcessorImpl.parse(Compiled Code)
	at com.jclark.xsl.sax.Driver.transform(Compiled Code)
	at com.jclark.xsl.sax.Driver.transformFile(Compiled Code)
	at com.jclark.xsl.sax.Driver.main(Compiled Code)

I have tracked the problem down to method endDocument of
XMLOutputHandler.  It appears to clean things up too early.  When I
comment out the clean ups as shown below, then my test example works
as expected:

  public void endDocument() throws SAXException {
    if (bufUsed != 0)
      flushBuf();
//    try {
//	out.close();
//    }
//    catch (java.io.IOException e) {
//      throw new SAXException(e);
//    }
//    out = null;
//    buf = null;
  }

Here are the 3 files for my test example:

==== FILE: Save.java

import com.jclark.xsl.sax.ResultTreeFragment;

public class Save {
    private static ResultTreeFragment tree;

    public Save() {
	System.err.println("*** NEW ***");
    }

    public static boolean put(ResultTreeFragment t) {
	System.err.println("*** PUT ***");
	tree = t;
	return true;
    }

    public ResultTreeFragment get() {
	System.err.println("*** GET ***");
	return tree;
    }
}

==== FILE: save.xsl

<xsl:stylesheet xmlns:xsl="http://www.w3.org/XSL/Transform/1.0";
  xmlns:save="http://www.jclark.com/xt/java/Save";
  result-ns="">

<xsl:template match="/">
  <one>
    <xsl:variable name="x">
      <two>HELLO</two>
    </xsl:variable>
    <xsl:if test="save:put($x)"/>
    <xsl:text>
[1]
</xsl:text>
    <xsl:copy-of select="$x"/>
    <xsl:text>
[2]
</xsl:text>
    <xsl:copy-of select="save:get(save:new())"/>
  <xsl:text>
[3]
</xsl:text>
  </one>
</xsl:template>

</xsl:stylesheet>

==== FILE: save.xml

<hello>
  <world>How are you?</world>
</hello>


-- 
Dr. Denys Duchier			Denys.Duchier@xxxxxxxxxxxx
Forschungsbereich Programmiersysteme	(Programming Systems Lab)
Universitaet des Saarlandes, Geb. 45	http://www.ps.uni-sb.de/~duchier
Postfach 15 11 50			Phone: +49 681 302 5618
66041 Saarbruecken, Germany		Fax:   +49 681 302 5615


 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list


Current Thread