HL7 / CDA-core-xsl

Informative stylesheet based on XSLT 1.0 to render all CDA documents
35 stars 20 forks source link

NPE trying to use XSL file #6

Closed angelaszek closed 3 years ago

angelaszek commented 3 years ago

Hello,

I was trying to use the CDA.xsl file but I encounter the following NPE. I didn't have much luck trying to resolve it. Does anyone have any experience resolving this?

ERROR:  ''
Exception in thread "main" javax.xml.transform.TransformerException: java.lang.NullPointerException
    at java.xml/com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:783)
    at java.xml/com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:370)

Here is some example code I was using.

         StreamSource source = new StreamSource(xml);
        InputStream is = FileUtils.getInternalFile("cda/CDA.xsl").openStream();
        StreamSource styleSource = new StreamSource(new BufferedReader(new InputStreamReader(is, "UTF-8")));

        TransformerFactory factory = TransformerFactory.newInstance();
        Transformer transformer = factory.newTransformer(styleSource);

        transformer.setParameter("vocFile", Thread.currentThread().getContextClassLoader().getResource("cda/cda_l10n.xml").toString());

        StringWriter writer = new StringWriter();
        StreamResult result = new StreamResult(writer);
        transformer.transform(source, result);
ahenket commented 3 years ago

You reading CDA.xsl from a different directory than you are reading cda/cda_l10n.xml from. They are normally in the same place. Could it be that you need to read both from the same path?

angelaszek commented 3 years ago

There was a mistake in the previous comment. I updated it. I have CDA.xsl and cda_l10n.xml in the same directory and I still get that error.

ahenket commented 3 years ago

Using Java 15 and the code from stackoverflow I got a more meaningful NPE, that may or may not be like yours. I could not use your code because I didn't know what FileUtils is. You should not need to specify the l10n file unless you aim to override it.

My code:

import javax.xml.transform.*;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import java.io.File;
import java.io.IOException;
import java.net.URISyntaxException;

public class RunXsl {
    public static void main(String[] args) throws IOException, URISyntaxException, TransformerException {
        TransformerFactory factory = TransformerFactory.newInstance();
        Source xslt = new StreamSource(new File("cda-core-xsl/CDA.xsl"));

        Transformer transformer = factory.newTransformer(xslt);

        Source text = new StreamSource(new File("examples/cda.xml"));
        transformer.transform(text, new StreamResult(new File("examples/cda.html")));
    }
}

My output:

Exception in thread "main" javax.xml.transform.TransformerException: java.lang.NullPointerException: Cannot invoke "String.length()" because "to" is null
    at java.xml/com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:797)
    at java.xml/com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:383)
    at RunXsl.main(RunXsl.java:17)
Caused by: java.lang.NullPointerException: Cannot invoke "String.length()" because "to" is null
    at java.xml/com.sun.org.apache.xalan.internal.xsltc.runtime.BasisLibrary.translateF(BasisLibrary.java:359)
    at jdk.translet/die.verwandlung.CDA.caseDown()
    at jdk.translet/die.verwandlung.CDA.topLevel()
    at jdk.translet/die.verwandlung.CDA.transform()
    at java.xml/com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet.transform(AbstractTranslet.java:624)
    at java.xml/com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:790)
    ... 2 more
---------
java.lang.NullPointerException: Cannot invoke "String.length()" because "to" is null
    at java.xml/com.sun.org.apache.xalan.internal.xsltc.runtime.BasisLibrary.translateF(BasisLibrary.java:359)
    at jdk.translet/die.verwandlung.CDA.caseDown()
    at jdk.translet/die.verwandlung.CDA.topLevel()
    at jdk.translet/die.verwandlung.CDA.transform()
    at java.xml/com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet.transform(AbstractTranslet.java:624)
    at java.xml/com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:790)
    at java.xml/com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:383)
    at RunXsl.main(RunXsl.java:17)

I can try to see why the function translate() is misbehaving. BasisLibrary.translateF is about that function, but I'm not sure it would fix your issue per se.

ahenket commented 3 years ago

I've fixed the NPE I had with Xalan. Let me know if that helps you as well @angelaszek

angelaszek commented 3 years ago

Thank you for your help. This did fix the problem I was having as well.