|
Subject: Dynamic Documents / Creating a node-set in Java From: "Clark C. Evans" <clark.evans@xxxxxxxxxxxxxxxxxxxx> Date: Tue, 5 Oct 1999 02:41:51 -0400 (EDT) |
James,
For several reasons, I'm trying to return a node-set
to XSL stylesheet from Java. My next step (after this one)
is to enable SQL queries to bring back "dynamic" documents
using a JDBC connection. Anyway, to get the ball rolling,
I've tried to build a HashtableAdapter; one that is
for-each friendly. I'm half way there, but I can't
figure out how to generate a good NameTable. Currently,
a list of nodes returns, but none of the axis seem
to be enabled (for children and attributes).
Could you look at it and give me a few pointers?
Thanks Tons!
Clark
......................................
package com.clarkevans.xtk;
import java.io.*;
import java.util.Hashtable;
import java.util.Enumeration;
import org.xml.sax.*;
import org.xml.sax.helpers.*;
import com.jclark.xsl.om.*;
import com.jclark.xsl.sax.*;
public class HashtableAdapter {
private static Hashtable table_of_tables = new Hashtable();
private static Exception last_error = null;
private static Hashtable getTable( String name )
{
Hashtable ret = (Hashtable) table_of_tables.get(name);
if( null == ret )
{
ret = new Hashtable();
table_of_tables.put(name,ret);
}
return ret;
}
public static void put( String table, String key, String value )
{
getTable(table).put(key,value);
}
public static String remove( String table, String key)
{
return (String) getTable(table).remove(key);
}
public static String get( String table, String key )
{
return (String) getTable(table).get(key);
}
public static int size(String table)
{
return getTable(table).size();
}
public static String toString(String table)
{
String list = new String();
Hashtable tab = getTable(table);
for (Enumeration e = tab.keys() ; e.hasMoreElements() ;) {
String key = (String) e.nextElement();
String value = (String) tab.get(key);
list += wrap("entry",wrap("key",key)+wrap("value",value));
}
return wrap("table",list);
}
public static String wrap(String element, String content)
{
return "<" + element + ">" + content + "</" + element + ">";
}
public static NodeIterator toNodeList(String table)
{
try
{
XMLProcessorImpl proc = new XMLProcessorImpl(
new HashtableParser(
getTable(table)));
Node root = proc.load( new InputSource(),
0, new LoadContextImpl(),
new NameTableImpl() );
return root.getChildren();
}
catch (Exception e)
{
last_error = e;
return null;
}
}
public static String getLastError()
{
if(null != last_error) {
StringWriter w = new StringWriter();
last_error.printStackTrace(new PrintWriter(w));
last_error = null;
return w.toString();
}
return "";
}
private static class LoadContextImpl implements LoadContext
{
public boolean getStripSource(Name elementTypeName) { return false;
}
public boolean getIncludeComments() { return true; }
public boolean getIncludeProcessingInstructions() { return true; }
}
private static class HashtableParser implements Parser
{
Hashtable table;
DocumentHandler handler;
public void setLocale (java.util.Locale locale) throws SAXException {}
public void setEntityResolver (EntityResolver resolver) {}
public void setDTDHandler (DTDHandler handler) {}
public void setErrorHandler (ErrorHandler handler) {}
public void setDocumentHandler (DocumentHandler handler) {
this.handler = handler;
}
public void parse (InputSource source) throws SAXException {
parse();
}
public void parse (String systemId) throws SAXException {
parse();
}
HashtableParser(Hashtable table)
{
this.table = table;
}
private void parse()
{
try
{
handler.startDocument();
for (Enumeration e = table.keys() ; e.hasMoreElements() ;) {
AttributeListImpl al = new AttributeListImpl();
String key = (String) e.nextElement();
String value = (String) table.get(key);
al.addAttribute("key","CDATA",key);
al.addAttribute("value","CDATA", value);
handler.startElement("entry",al);
handler.startElement("key", new AttributeListImpl() );
handler.characters( key.toCharArray(),0,key.length());
handler.endElement("key");
handler.startElement("value", new AttributeListImpl());
handler.characters( value.toCharArray(), 0, value.length());
handler.endElement("value");
handler.endElement("entry");
}
handler.endDocument();
}
catch( Exception e )
{
table.put("exception",e.toString());
}
}
}
}
/******** Here is a test stylesheet **************************
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/XSL/Transform/1.0"
xmlns="http://www.w3.org/TR/REC-html40"
xmlns:ht="http://www.jclark.com/xt/java/com.clarkevans.xtk.HashtableAdapter"
result-ns="">
<xsl:template match="/">
<html>
<xsl:value-of select="ht:put('table','a','1')" />
<xsl:value-of select="ht:put('table','b','2')" />
<xsl:for-each select="ht:to-node-list('table')" >
<xsl:if test="position()=1" > { </xsl:if>
Content: <xsl:value-of select="." />
Name: <xsl:value-of select="name()" />
Text: <xsl:value-of select="text()" />
KeyA: <xsl:value-of select="attribute::key" />
ValA: <xsl:value-of select="attribute::value" />
KeyC: <xsl:value-of select="child::key" />
ValC: <xsl:value-of select="child::value" />
<xsl:if test="position()=last()" >}</xsl:if>
</xsl:for-each>
<xsl:value-of select="ht:to-string('table')" />
<xsl:value-of select="ht:get-last-error()" />
</html>
</xsl:template>
</xsl:stylesheet>
************************************************************/
/****** Here is the current output **************************
{ Content: b2 Name: entry Text: KeyA: ValA: KeyC: ValC:
Content: a2 Name: entry Text: KeyA: ValA: KeyC: ValC:
}<table><entry><key>b</key><value>2</value></entry><entry><key>a</key>
<value>1</value></entry></table>
************************************************************/
/****** Here is the expected output **************************
{ Content: b2 Name: entry Text: b2 KeyA: b ValA: 2 KeyC: b ValC: 2
Content: a1 Name: entry Text: a1 KeyA: a ValA: 1 KeyC: a ValC: 1
}<table><entry><key>b</key><value>2</value></entry><entry><key>a</key>
<value>1</value></entry></table>
************************************************************/
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
| Current Thread |
|---|
|
| <- Previous | Index | Next -> |
|---|---|---|
| document scope difficulty (Was: de, Clark C. Evans | Thread | Re: document scope difficulty (Was, Steve Muench |
| RE: Is fo:block an area-container?, Bovone Stefano | Date | Re: FO samples at www.renderx.com, Steve Schafer |
| Month |