Uploaded image for project: 'Xerces2-J'
  1. Xerces2-J
  2. XERCESJ-1147

Parsed document is not fully initialized until getFirstChild() is called

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Resolved
    • Major
    • Resolution: Fixed
    • 2.8.0
    • 2.8.1
    • DOM (Level 3 Core)
    • None
    • java version "1.5.0_06"
      Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_06-b05)
      Java HotSpot(TM) Client VM (build 1.5.0_06-b05, mixed mode, sharing)

      Saxon: saxonb8-7j

    Description

      I have problems with Xerces bundled with JDK 1.5 as well as Xerces-J 2.8.0, I was usin XSLT 2.0 transformer Saxon 8.7 to access document produced by java extension. Problems go away when I call document.getFirstChild(); before returning document for the transformation, the side-effect of getFirstChild() makes me believe that there is something wrong with implementation of the Document.

      Here is simple code to demostrate the problem Test .java:

      import org.w3c.dom.Document;
      import org.xml.sax.InputSource;

      import javax.xml.parsers.DocumentBuilder;
      import javax.xml.parsers.DocumentBuilderFactory;
      import javax.xml.transform.Transformer;
      import javax.xml.transform.TransformerException;
      import javax.xml.transform.TransformerFactory;
      import javax.xml.transform.stream.StreamResult;
      import javax.xml.transform.stream.StreamSource;
      import java.io.StringReader;
      import java.io.StringWriter;

      public class Test {

      // this will call test1() which DOES call getFirstChild() before document is returned
      static String XSL1 = "<?xml version=\"1.0\"?>\n" +
      "<xsl:stylesheet xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\" version=\"2.0\" xmlns:test=\"Test\">\n" +
      " <xsl:template match=\"/\">\n" +
      " <xsl:copy-of select=\"test:test1()\"/>\n" +
      " </xsl:template>\n" +
      "</xsl:stylesheet>";

      // this will call test2() which DOES NOT call getFirstChild() before document is returned
      static String XSL2 = "<?xml version=\"1.0\"?>\n" +
      "<xsl:stylesheet xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\" version=\"2.0\" xmlns:test=\"Test\">\n" +
      " <xsl:template match=\"/\">\n" +
      " <xsl:copy-of select=\"test:test2()\"/>\n" +
      " </xsl:template>\n" +
      "</xsl:stylesheet>";

      public static void main(String[] args) throws Exception

      { transform(XSL1); // Result is: <?xml version="1.0" encoding="UTF-8"?><y/> transform(XSL2); // Result is: }

      private static void transform(String xsl) throws TransformerException

      { Transformer transformer = TransformerFactory.newInstance().newTransformer(new StreamSource(new StringReader(xsl))); StringWriter out = new StringWriter(); transformer.transform(new StreamSource(new StringReader("<x/>")), new StreamResult(out)); System.out.println("Result is: " + out); }

      public static Document test1() throws Exception

      { DocumentBuilder documentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); Document document = documentBuilder.parse(new InputSource(new StringReader("<y/>"))); // next call has some side-effect that make things work, synchronizeChildren() ? // likely bug in com.sun.org.apache.xerces.internal.dom.DeferredDocumentImpl document.getFirstChild(); return document; }

      public static Document test2() throws Exception

      { DocumentBuilder documentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); Document document = documentBuilder.parse(new InputSource(new StringReader("<y/>"))); return document; }

      }

      I do not know how Saxon is using the document, but whatever it does, it should behave same way for test1() and test2()

      Attachments

        Activity

          People

            mrglavas@ca.ibm.com Michael Glavassevich
            liborvalenta Libor Valenta
            Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: