Link to home
Start Free TrialLog in
Avatar of Mani Pazhana
Mani PazhanaFlag for United States of America

asked on

XSLT: Generate CSV file with .CSV extension

Hello,
I want to generate .csv file using XSLT.

I am getting .txt file using the below XSLT, i want .CSV file from the below XSLT...

Any idea how to do that?

Here is my XSLT:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:csv="csv:csv"
xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
                        
      <xsl:output method="text" encoding="iso-8859-1"/>

      <xsl:key name="kRequestId" match="/VCAResponse/Response" use="RequestId"/>

      <!-- DL being used (Comma in this case) -->
      <xsl:param name="DL" select="'&#44;'"/>

      <!-- Checking for carriage return -->
      <xsl:param name="CR" select="'&#xA;'"/>

      <xsl:strip-space elements="*"/>

      <!-- Column Headers -->
      <!--Create header row of element names
            (All fields are sent to JDE that are in the CIM, single line per request details)-->

      <!--
      IssuerId
      FileId
      RequestId
      Action
      PurchaseId
      Status
      AVV
      Expiry
      PAN
      ErrorCode
      ErrorMessage
      SupplierPaymentNotificationEMail
      PurchaseSupplierNotificationEMail
      PurchaseSupplierNotificationAutoSend
      -->

      <xsl:variable name="headers" >
            <headers>IssuerId</headers> <!-- 1 -->
            <headers>FileId</headers> <!-- 2 -->
            <headers>RequestId</headers> <!-- 3 -->
            <headers>Action</headers> <!-- 4 -->
            <headers>PurchaseId</headers> <!-- 5 -->
            <headers>Status</headers> <!-- 6 -->
            <headers>AVV</headers> <!-- 7 -->
            <headers>Expiry</headers> <!-- 8 -->
            <headers>PAN</headers> <!-- 9 -->
            <headers>ErrorCode</headers> <!-- 10 -->
            <headers>ErrorMessage</headers> <!-- 11 -->
            <headers>SupplierPaymentNotificationEMail</headers> <!-- 12 -->
            <headers>PurchaseSupplierNotificationEMail</headers> <!-- 13 -->
            <headers>PurchaseSupplierNotificationAutoSend</headers> <!-- 14 -->
      </xsl:variable>      

      <xsl:variable name="columns" >
            <columns>IssuerId</columns> <!-- 1 -->
            <columns>FileId</columns> <!-- 2 -->
            <columns>RequestId</columns> <!-- 3 -->
            <columns>Action</columns> <!-- 4 -->
            <columns>PurchaseId</columns> <!-- 5 -->
            <columns>Status</columns> <!-- 6 -->
            <columns>AVV</columns> <!-- 7 -->
            <columns>Expiry</columns> <!-- 8 -->
            <columns>PAN</columns> <!-- 9 -->
            <columns>ErrorCode</columns> <!-- 10 -->
            <columns>ErrorMessage</columns> <!-- 11 -->
            <columns>SupplierPaymentNotificationEMail</columns> <!-- 12-->
            <columns>PurchaseSupplierNotificationEMail</columns> <!-- 13 -->
            <columns>PurchaseSupplierNotificationAutoSend</columns> <!-- 14 -->
      </xsl:variable>      

      <!--Invoice hierarchy structure of Invoice/InvoiceLineItemDetail is flattened into a single line per InvoiceLineItemDetail-->
      <xsl:template match="/">
      
            <!--Create header row of attribute names-->
            <xsl:for-each select="msxsl:node-set($headers)/headers">
                  <xsl:text>"</xsl:text>
                  <xsl:value-of select="."/>
                  <xsl:text>"</xsl:text>
                  <xsl:if test="position() != last()">
                        <xsl:value-of select="$DL"/>
                  </xsl:if>
            </xsl:for-each>
            <xsl:value-of select="$CR"/>
            
            <xsl:for-each select="/*/*">
                  <xsl:variable name="NodeName" select="name(current())"/>
                  <!-- If node is Response, get the values based on their element name (from the columns above -->
                  <xsl:if test="$NodeName = 'Response'">
                        <xsl:variable name="property" select="ancestor-or-self::node()|descendant::node()"/>
                        <xsl:for-each select="msxsl:node-set($columns)/columns">
                              <!-- Extract the column name and value -->                  
                              <xsl:variable name="column" select="."/>      
                              <xsl:variable name="value" select="$property/*[name() = $column]"/>            
                              <xsl:text>"</xsl:text>
                              <xsl:value-of select="$value" disable-output-escaping="yes"/>
                              <xsl:text>"</xsl:text>
                              <xsl:if test="position() != last()">
                                    <xsl:value-of select="$DL"/>
                              </xsl:if>
                        </xsl:for-each>
                        <xsl:value-of select="$CR"/>
                  </xsl:if>
            </xsl:for-each>

      </xsl:template>

</xsl:stylesheet>


Thanks
ASKER CERTIFIED SOLUTION
Avatar of zc2
zc2
Flag of United States of America image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Avatar of Mani Pazhana

ASKER

Thanks
Thanks