'XSLT Transformation using Xalan-Java Extensions

I am trying to convert XML to CSV by using "Xalan-Java Extensions" [XSLT Template include Java Coding] , but I unfortunately with no positive results.

I added external libs (bsf.jar;js.jar;xalan.jar;xercesImpl.jar;xml-apis.jar) to my java projects before, but it seems that this one is not working, I'm getting this error:

Error during transformation - java.lang.NullPointerException; Line#: 55; Column#: 45

My Java code:

public class transformCSV {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub

            try {
                File stylesheet = new File("style.xsl");
                File xmlSource = new File("data.xml");

                DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
                DocumentBuilder builder = factory.newDocumentBuilder();
                Document document = builder.parse(xmlSource);

                StreamSource stylesource = new StreamSource(stylesheet);
                Transformer transformer = TransformerFactory.newInstance().newTransformer(stylesource);
                Source source = new DOMSource(document);
                Result outputTarget = new StreamResult(new File("result.csv"));
                transformer.transform(source, outputTarget);
                System.out.println(outputTarget);
                System.out.println("TEST");

            } catch (TransformerConfigurationException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (ParserConfigurationException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (SAXException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (TransformerFactoryConfigurationError e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (TransformerException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

    }

}

How can I call org.apache.xalan.xslt.Process within in java code? Without Using commandline and classpath settings.

Here are XSl-Template (taken from Apache Example) and Data.xml:

<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:xalan="http://xml.apache.org/xalan"
                xmlns:counter="MyCounter"
                extension-element-prefixes="counter"
                version="1.0">

    <xalan:component prefix="counter"
                   elements="init incr" functions="read">
        <xalan:script lang="javascript">
      var counters = new Array();

      function init (xslproc, elem) {
        name = elem.getAttribute ("name");
        value = parseInt(elem.getAttribute ("value"));
        counters[name] = value;
        return null;
      }

      function read (name) {
        return "" + (counters[name]);
      }

      function incr (xslproc, elem)
      {
        name = elem.getAttribute ("name");
        counters[name]++;
        return null;
      }
        </xalan:script>
    </xalan:component>

    <xsl:template match="/">
        <HTML>
            <H1>JavaScript Example.</H1>
            <counter:init name="index" value="1"/>
            <p>Here are the names in alphabetical order by last name:</p>
            <xsl:for-each select="doc/name">
                <xsl:sort select="@last"/>
                <xsl:sort select="@first"/>
                <p>
                    <xsl:text>[</xsl:text>
                    <xsl:value-of select="counter:read('index')"/>
                    <xsl:text>]. </xsl:text>
                    <xsl:value-of select="@last"/>
                    <xsl:text>, </xsl:text>
                    <xsl:value-of select="@first"/>
                </p>
                <counter:incr name="index"/>
            </xsl:for-each>
        </HTML>
    </xsl:template>

</xsl:stylesheet>

Data.xml:

<?xml version="1.0"?>
<doc>
  <name first="Sanjiva" last="Weerawarana"/>
  <name first="Joseph" last="Kesselman"/>
  <name first="Stephen" last="Auriemma"/>
  <name first="Igor" last="Belakovskiy"/>    
  <name first="David" last="Marston"/>
  <name first="David" last="Bertoni"/>
  <name first="Donald" last="Leslie"/>
  <name first="Emily" last="Farmer"/>
  <name first="Myriam" last="Midy"/>
  <name first="Paul" last="Dick"/>
  <name first="Scott" last="Boag"/>
  <name first="Shane" last="Curcuru"/>
  <name first="Marcia" last="Hoffman"/>
  <name first="Noah" last="Mendelsohn"/>
  <name first="Alex" last="Morrow"/>    
</doc>


Solution 1:[1]

it works for me

        TransformerFactory oFactory = TransformerFactory.newInstance();

        String xml = "test.xml";
        String xsl = "test.xsl";

        javax.xml.transform.Templates oTemplates = oFactory.newTemplates(
                new javax.xml.transform.stream.StreamSource(xsl)
        );

        javax.xml.transform.Transformer transformer = oTemplates.newTransformer();

        transformer.transform(
                new javax.xml.transform.stream.StreamSource(xml),
                new javax.xml.transform.stream.StreamResult(System.out));

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Inshua