XALAN: Text node of value 'null' - Is this illegal or does XSLTC have an issue here?

huizhe wang huizhe.wang at oracle.com
Tue Nov 8 17:58:18 UTC 2016



On 11/7/2016 11:31 PM, Langer, Christoph wrote:
>
> Hi Joe,
>
> thanks for your comments.
>
> Yes the customer does not really want to insert a null value but 
> create an empty text node. So they’ll fix their code anyway.
>
> However, I thought it would be a good Idea to make the Serializer more 
> robust with regards to such null data. Especially given that it’s 
> possible via the DOM API to construct such null nodes. So I take you 
> support this endeavor?
>

Sure. Some null-checks are welcome.

Thanks,
Joe

> Thanks
>
> Christoph
>
> *From:*huizhe wang [mailto:huizhe.wang at oracle.com]
> *Sent:* Dienstag, 8. November 2016 06:01
> *To:* Langer, Christoph <christoph.langer at sap.com>; Aleks Efimov 
> <aleksej.efimov at oracle.com>; Lance Andersen <lance.andersen at oracle.com>
> *Cc:* core-libs-dev at openjdk.java.net
> *Subject:* Re: XALAN: Text node of value 'null' - Is this illegal or 
> does XSLTC have an issue here?
>
> Looks like a null check-in is desirable. If the intention is to add a 
> text node, which I assume was his intention, he wouldn't want a null 
> node. If the intention is to create an empty element, then he didn't 
> need the line that added the null text node.
>
> As far as DOM goes, it would have been better if it was clearer on how 
> null be handled (a DOMException probably). But for a 10+ yr old API, 
> the case is not enough to call for a change of the behavior.
>
> Thanks,
> Joe
>
> On 11/7/2016 8:09 AM, Langer, Christoph wrote:
>
>     Hi Xalan experts,
>
>     I’ve recently handled a customer issue about Text Nodes of value
>     ‘null’ inside a DOM, causing an exception during XALAN XSLT
>     transformation. The repro case is quite simple. Consider the
>     following small Java sample [1] which creates a DOM from a very
>     basic XML, inserts a text node with value null into the DOM and
>     then runs an identity transformation on it. Without inserting the
>     null Text node, it would run without issues. However, the
>     com.sun.org.apache.xml.internal.serializer.ToUnknownStream class
>     stumbles over the null value and the transformation throws an NPE
>     [2]. I believe this could be easily fixed by adding a null check
>     in the serializer and handling null like “”. However, would you
>     agree that it is a real issue worth fixing or should one rather
>     stress the point that Text Nodes of null are illegal? (Is that
>     true, anyway? Didn’t find any specification about that…) Please
>     let me know your opinion – and if you agree I would work on a fix.
>
>     Thanks in advance for comments
>
>     Christoph
>
>     [1] Sample code:
>
>     import java.io.ByteArrayInputStream;
>
>     import java.io.ByteArrayOutputStream;
>
>     import java.io.IOException;
>
>     import javax.xml.parsers.DocumentBuilder;
>
>     import javax.xml.parsers.DocumentBuilderFactory;
>
>     import javax.xml.parsers.ParserConfigurationException;
>
>     import javax.xml.transform.TransformerException;
>
>     import javax.xml.transform.TransformerFactory;
>
>     import javax.xml.transform.dom.DOMSource;
>
>     import javax.xml.transform.stream.StreamResult;
>
>     import org.w3c.dom.Document;
>
>     import org.w3c.dom.Element;
>
>     import org.xml.sax.SAXException;
>
>     public class TestTransformWithNullText {
>
>     public static void main(String[] args) throws
>     ParserConfigurationException, SAXException, IOException,
>     TransformerException {
>
>     // create a small DOM
>
>     DocumentBuilder db =
>     DocumentBuilderFactory.newInstance().newDocumentBuilder();
>
>     Document doc = db.parse(new ByteArrayInputStream("<?xml
>     version=\"1.0\"?><DOCROOT/>".getBytes()));
>
>     // insert a bad element
>
>     Element e = doc.createElement("ERROR");
>
>     e.appendChild(doc.createTextNode(null));
>
>     doc.getDocumentElement().appendChild(e);
>
>     // transform
>
>     ByteArrayOutputStream bos = new ByteArrayOutputStream();
>
>     TransformerFactory.newInstance().newTransformer().transform(
>
>     new DOMSource(doc.getDocumentElement()), new StreamResult(bos));
>
>     System.out.println(bos);
>
>                     }
>
>     }
>
>     [2] Exception encountered:
>
>     Exception in thread "main"
>     javax.xml.transform.TransformerException:
>     java.lang.NullPointerException
>
>             at
>     com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(java.xml at 9.0.0.1-internal/TransformerImpl.java:789
>     <mailto:java.xml at 9.0.0.1-internal/TransformerImpl.java:789>)
>
>             at
>     com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(java.xml at 9.0.0.1-internal/TransformerImpl.java:376
>     <mailto:java.xml at 9.0.0.1-internal/TransformerImpl.java:376>)
>
>             at
>     com.sap.cl.xml.test.transform.TestTransformWithNullText.main(TestTransformWithNullText.java:33)
>
>     Caused by: java.lang.NullPointerException
>
>             at
>     com.sun.org.apache.xml.internal.serializer.ToUnknownStream.characters(java.xml at 9.0.0.1-internal/ToUnknownStream.java:342
>     <mailto:java.xml at 9.0.0.1-internal/ToUnknownStream.java:342>)
>
>             at
>     com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(java.xml at 9.0.0.1-internal/DOM2TO.java:244
>     <mailto:java.xml at 9.0.0.1-internal/DOM2TO.java:244>)
>
>             at
>     com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(java.xml at 9.0.0.1-internal/DOM2TO.java:230
>     <mailto:java.xml at 9.0.0.1-internal/DOM2TO.java:230>)
>
>             at
>     com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(java.xml at 9.0.0.1-internal/DOM2TO.java:230
>     <mailto:java.xml at 9.0.0.1-internal/DOM2TO.java:230>)
>
>             at
>     com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(java.xml at 9.0.0.1-internal/DOM2TO.java:94
>     <mailto:java.xml at 9.0.0.1-internal/DOM2TO.java:94>)
>
>             at
>     com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transformIdentity(java.xml at 9.0.0.1-internal/TransformerImpl.java:718
>     <mailto:java.xml at 9.0.0.1-internal/TransformerImpl.java:718>)
>
>             at
>     com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(java.xml at 9.0.0.1-internal/TransformerImpl.java:780
>     <mailto:java.xml at 9.0.0.1-internal/TransformerImpl.java:780>)
>
>             ... 2 more
>
>     ---------
>
>     java.lang.NullPointerException
>
>             at
>     com.sun.org.apache.xml.internal.serializer.ToUnknownStream.characters(java.xml at 9.0.0.1-internal/ToUnknownStream.java:342
>     <mailto:java.xml at 9.0.0.1-internal/ToUnknownStream.java:342>)
>
>             at
>     com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(java.xml at 9.0.0.1-internal/DOM2TO.java:244
>     <mailto:java.xml at 9.0.0.1-internal/DOM2TO.java:244>)
>
>             at
>     com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(java.xml at 9.0.0.1-internal/DOM2TO.java:230
>     <mailto:java.xml at 9.0.0.1-internal/DOM2TO.java:230>)
>
>             at
>     com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(java.xml at 9.0.0.1-internal/DOM2TO.java:230
>     <mailto:java.xml at 9.0.0.1-internal/DOM2TO.java:230>)
>
>             at
>     com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(java.xml at 9.0.0.1-internal/DOM2TO.java:94
>     <mailto:java.xml at 9.0.0.1-internal/DOM2TO.java:94>)
>
>             at
>     com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transformIdentity(java.xml at 9.0.0.1-internal/TransformerImpl.java:718
>     <mailto:java.xml at 9.0.0.1-internal/TransformerImpl.java:718>)
>
>             at
>     com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(java.xml at 9.0.0.1-internal/TransformerImpl.java:780
>     <mailto:java.xml at 9.0.0.1-internal/TransformerImpl.java:780>)
>
>             at
>     com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(java.xml at 9.0.0.1-internal/TransformerImpl.java:376
>     <mailto:java.xml at 9.0.0.1-internal/TransformerImpl.java:376>)
>
>     at
>     com.sap.cl.xml.test.transform.TestTransformWithNullText.main(TestTransformWithNullText.java:33)
>



More information about the core-libs-dev mailing list