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