Re: [xsl] How to: Returning HTML Elements From a Saxon Extension Function (6.5.x)

Subject: Re: [xsl] How to: Returning HTML Elements From a Saxon Extension Function (6.5.x)
From: "W. Eliot Kimber" <eliot@xxxxxxxxxx>
Date: Fri, 18 Apr 2003 10:29:27 -0500
W. Eliot Kimber wrote:
W. Eliot Kimber wrote:

My analysis is correct--turns out one of my collegues had already figured this out and I didn't know it. What I had missed was the the "Parse()" method on the Saxon DocumentBuilderImpl class, which allows you to pass in a string to be parsed more or less directly. Here's the basic pattern:

public NodeInfo generateResultTree(String markup) {
  java.io.ByteArrayInputStream bais = new
                      ByteArrayInputStream(markup.getBytes());
  org.xml.sax.InputSource isource = null;
  try {
     isource = new InputSource(bais);
  } catch (org.xml.sax.SAXException e) {
     e.printStackTrace();
  }
  org.w3c.dom.Document root = new
            com.icl.saxon.om.DocumentBuilderImpl().parse(isource);
  return (NodeInfo)(root.getDocumentElement());
}

I discovered it's not quite so simple because the byte array you get from String.getBytes() is a UTF-16 byte sequence, but Aelfred (which Saxon uses in it's DocumentBuilderImpl) only handles UTF-8, so you have to convert the Java UTF-16 string to a UTF-8 byte array, which I did like so:


public NodeInfo generateMarkup(String markupString) {
  ByteArrayOutputStream baos = new ByteArrayOutputStream();

  OutputStreamWriter osw = null;
  // NOTE: the following exceptions should never happen,
  //       so there's no point in trapping them.
  try {
    osw = new OutputStreamWriter(baos, "UTF-8");
  } catch (UnsupportedEncodingException e2) {
    e2.printStackTrace();
  }
  try {
    osw.write(markupString);
  } catch (IOException e3) {
    e3.printStackTrace();
  }
  try {
    osw.flush();
    osw.close();
  } catch (IOException e4) {
    e4.printStackTrace();
  }
  ByteArrayInputStream bais = new
        ByteArrayInputStream(baos.toByteArray());
  InputSource isource = new InputSource(bais);
  Document root = null;
  try {
    root = new DocumentBuilderImpl().parse(isource);
  } catch (SAXException e1) {
    e1.printStackTrace();
  }
  return (NodeInfo)(root.getDocumentElement());
}



--
W. Eliot Kimber, eliot@xxxxxxxxxx
Consultant, ISOGEN International

1016 La Posada Dr., Suite 240
Austin, TX  78752 Phone: 512.656.4139


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



Current Thread