Home > Enterprise >  Not able to write XML data in CSV file using XSL
Not able to write XML data in CSV file using XSL

Time:12-08

I have a XML file like this:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:pro="http://www.liquibase.org/xml/ns/pro" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/pro http://www.liquibase.org/xml/ns/pro/liquibase-pro-4.1.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-4.1.xsd">
    <changeSet author="253503 (generated)" id="1638881200824-1">
        <insert tableName="sampletable">
            <column name="id" valueNumeric="2"/>
            <column name="name" value="k"/>
            <column name="active" valueBoolean="true"/>
            <column name="age" valueNumeric="2"/>
        </insert>
        <insert tableName="sampletable">
            <column name="id" valueNumeric="23"/>
            <column name="name" value="kathir"/>
            <column name="active" valueBoolean="true"/>
            <column name="age" valueNumeric="29"/>
        </insert>
        <insert tableName="sampletable">
            <column name="id" valueNumeric="24"/>
            <column name="name" value="gowtham"/>
            <column name="active" valueBoolean="true"/>
            <column name="age" valueNumeric="28"/>
        </insert>
        <insert tableName="sampletable">
            <column name="id" valueNumeric="25"/>
            <column name="name" value="varshan"/>
            <column name="active" valueBoolean="false"/>
            <column name="age" valueNumeric="5"/>
        </insert>
        <insert tableName="sampletable">
            <column name="id" valueNumeric="45"/>
            <column name="name" value="heal"/>
            <column name="active" valueBoolean="true"/>
            <column name="age" valueNumeric="65"/>
        </insert>
    </changeSet>
</databaseChangeLog>

And my XSL file is:
<?xml version="1.0" encoding="UTF-8"?>
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:dbc="http://www.liquibase.org/xml/ns/dbchangelog"
    version="1.0">

  <xsl:output method="text"/>

  <xsl:template match="/">
    <!-- Header -->
    <xsl:apply-templates select="dbc:databaseChangeLog/dbc:changeSet/dbc:insert[1]">
      <xsl:with-param name="header">true</xsl:with-param>
    </xsl:apply-templates>
    <!-- Data -->
    <xsl:apply-templates select="dbc:databaseChangeLog/dbc:changeSet/dbc:insert"/>
  </xsl:template>
  
  <xsl:template match="dbc:insert">
    <xsl:param name="header"/>
    <xsl:for-each select="dbc:column">
      <!-- For the header take the name attribute, else take the attribute starting with value-->
      <xsl:choose>
        <xsl:when test="$header='true'">
          <xsl:value-of select="@name"/>
        </xsl:when>
        <xsl:otherwise>
          <xsl:value-of select="@*[starts-with(name(),'value')]"/>
        </xsl:otherwise>
      </xsl:choose>
      <!-- Insert comma between values, except for last value insert new line -->
      <xsl:choose>
        <xsl:when test="position()=last()">
          <xsl:text>&#xa;</xsl:text>
        </xsl:when>
        <xsl:otherwise>
          <xsl:text>,</xsl:text>
        </xsl:otherwise>
      </xsl:choose>
    </xsl:for-each>
  </xsl:template>  
</xsl:stylesheet>

my Java code is :
 public static void main(String args[]) throws Exception { 
            File stylesheet = new File("NewStylesheet1.xsl");
            File xmlSource = new File("db.changelog9.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("/tmp/x.csv"));
            transformer.transform(source, outputTarget);
            }

I am to perform direct transformation(i.e. Right click on XML file -> Run as XSLT transformation and add the XSL file) and it generates the output as expected like below: id,name,active,age 2,k,true,2 23,kathir,true,29 24,gowtham,true,28 25,varshan,false,5 45,heal,true,65

But when I try to perform the same action using the java code it is not able to write the values in CSV file. It returns an empty file without any values. Can someone help with resolving the issue?

CodePudding user response:

Try to make the DocumentBuilderFactory namespace aware by calling the method https://docs.oracle.com/javase/8/docs/api/javax/xml/parsers/DocumentBuilderFactory.html#setNamespaceAware-boolean- for that before creating the DocumentBuilder and parsing XML input:

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
DocumentBuilder builder = factory.newDocumentBuilder();
...
  • Related