Here is the input xml
<code><rows>
<row xmlns:xsi="http://www.w3.org/2001/XMLSchemainstance">
<SOURCEID__C>0000001Z</SOURCEID__C>
<SOURCESYSTEM__C/>
<NAME/>
<Account.SourceId__c/>
<Product2.SourceId__c/>
<STATUS>Inactive</STATUS>
<SERIALNUMBER/>
<MACHINE_MODEL__C/>
<MACHINE_TYPE__C/>
<CANCELLATION_DATE__C>20240411</CANCELLATION_DATE__C>
<CANCELLATION_REASON__C>Cancelled invalid data</CANCELLATION_REASON__C>
<EFFECTIVE_CANCELLATION_DATE__C>20240411</EFFECTIVE_CANCELLATION_DATE__C>
</row>
<row xmlns:xsi="http://www.w3.org/2001/XMLSchemainstance">
<SOURCEID__C>0000013</SOURCEID__C>
<SOURCESYSTEM__C/>
<NAME/>
<Account.SourceId__c/>
<Product2.SourceId__c/>
<STATUS>Inactive</STATUS>
<SERIALNUMBER/>
<MACHINE_MODEL__C/>
<MACHINE_TYPE__C/>
<CANCELLATION_DATE__C>20240411</CANCELLATION_DATE__C>
<CANCELLATION_REASON__C>Cancelled invalid data</CANCELLATION_REASON__C>
<EFFECTIVE_CANCELLATION_DATE__C>20240411</EFFECTIVE_CANCELLATION_DATE__C>
</row>
</rows>
</code>
<code><rows>
<row xmlns:xsi="http://www.w3.org/2001/XMLSchemainstance">
<SOURCEID__C>0000001Z</SOURCEID__C>
<SOURCESYSTEM__C/>
<NAME/>
<Account.SourceId__c/>
<Product2.SourceId__c/>
<STATUS>Inactive</STATUS>
<SERIALNUMBER/>
<MACHINE_MODEL__C/>
<MACHINE_TYPE__C/>
<CANCELLATION_DATE__C>20240411</CANCELLATION_DATE__C>
<CANCELLATION_REASON__C>Cancelled invalid data</CANCELLATION_REASON__C>
<EFFECTIVE_CANCELLATION_DATE__C>20240411</EFFECTIVE_CANCELLATION_DATE__C>
</row>
<row xmlns:xsi="http://www.w3.org/2001/XMLSchemainstance">
<SOURCEID__C>0000013</SOURCEID__C>
<SOURCESYSTEM__C/>
<NAME/>
<Account.SourceId__c/>
<Product2.SourceId__c/>
<STATUS>Inactive</STATUS>
<SERIALNUMBER/>
<MACHINE_MODEL__C/>
<MACHINE_TYPE__C/>
<CANCELLATION_DATE__C>20240411</CANCELLATION_DATE__C>
<CANCELLATION_REASON__C>Cancelled invalid data</CANCELLATION_REASON__C>
<EFFECTIVE_CANCELLATION_DATE__C>20240411</EFFECTIVE_CANCELLATION_DATE__C>
</row>
</rows>
</code>
<rows>
<row xmlns:xsi="http://www.w3.org/2001/XMLSchemainstance">
<SOURCEID__C>0000001Z</SOURCEID__C>
<SOURCESYSTEM__C/>
<NAME/>
<Account.SourceId__c/>
<Product2.SourceId__c/>
<STATUS>Inactive</STATUS>
<SERIALNUMBER/>
<MACHINE_MODEL__C/>
<MACHINE_TYPE__C/>
<CANCELLATION_DATE__C>20240411</CANCELLATION_DATE__C>
<CANCELLATION_REASON__C>Cancelled invalid data</CANCELLATION_REASON__C>
<EFFECTIVE_CANCELLATION_DATE__C>20240411</EFFECTIVE_CANCELLATION_DATE__C>
</row>
<row xmlns:xsi="http://www.w3.org/2001/XMLSchemainstance">
<SOURCEID__C>0000013</SOURCEID__C>
<SOURCESYSTEM__C/>
<NAME/>
<Account.SourceId__c/>
<Product2.SourceId__c/>
<STATUS>Inactive</STATUS>
<SERIALNUMBER/>
<MACHINE_MODEL__C/>
<MACHINE_TYPE__C/>
<CANCELLATION_DATE__C>20240411</CANCELLATION_DATE__C>
<CANCELLATION_REASON__C>Cancelled invalid data</CANCELLATION_REASON__C>
<EFFECTIVE_CANCELLATION_DATE__C>20240411</EFFECTIVE_CANCELLATION_DATE__C>
</row>
</rows>
Here is the xslt:
<code><?xml version="1.0" encoding="UTF-8"?>
<!-- produce comma separated values output -->
<!-- follow all except last value by comma -->
<!-- if value contains a comma, enclose it in double quotes -->
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="yes" media-type="string"/>
<xsl:template match="/rows">
<xsl:element name="csvRoot">
<xsl:element name="csvString">
<xsl:for-each select="./row[1]">
<xsl:for-each select="./*">
<xsl:choose>
<xsl:when test="contains(current(),',')">"<xsl:value-of select="name(.)"/>"</xsl:when>
<xsl:otherwise>
<xsl:text>"</xsl:text><xsl:value-of select="name(.)"/><xsl:text>"</xsl:text>
</xsl:otherwise>
</xsl:choose>
<xsl:if test="position()!=last()">,</xsl:if>
</xsl:for-each>
<xsl:text>
</xsl:text>
</xsl:for-each>
<xsl:for-each select="./row">
<xsl:for-each select="./*">
<xsl:choose>
<xsl:when test="lower-case(name(.)) = 'contact.sourceid__c' and current() = ''"><xsl:text>""</xsl:text></xsl:when>
<xsl:when test="lower-case(name(.)) = 'recordtypeid' and current() = ''"><xsl:text>""</xsl:text></xsl:when>
<xsl:when test="lower-case(name(.)) = 'business_hours_id__c' and current() = ''"><xsl:text>""</xsl:text></xsl:when>
<xsl:when test="lower-case(name(.)) = 'businesshoursid' and current() = ''"><xsl:text>""</xsl:text></xsl:when>
<xsl:when test="lower-case(name(.)) = 'accountid__r.sourceid__c' and current() = ''"><xsl:text>""</xsl:text></xsl:when>
<xsl:when test="lower-case(name(.)) = 'account.sourceid__c' and current() = ''"><xsl:text>""</xsl:text></xsl:when>
<xsl:when test="lower-case(name(.)) = 'product2.sourceid__c' and current() = ''"><xsl:text>""</xsl:text></xsl:when>
<xsl:when test="lower-case(name(.)) = 'location.sourceid__c' and current() = ''"><xsl:text>""</xsl:text></xsl:when>
<xsl:when test="lower-case(name(.)) = 'asset.sourceid__c' and current() = ''"><xsl:text>""</xsl:text></xsl:when>
<xsl:when test="lower-case(name(.)) = 'servicecontract.sourceid__c' and current() = ''"><xsl:text>""</xsl:text></xsl:when>
<xsl:when test="lower-case(name(.)) = 'parent.sourceid__c' and current() = ''"><xsl:text>""</xsl:text></xsl:when>
<xsl:when test="current() = ''"><xsl:text>"#N/A"</xsl:text></xsl:when>
<xsl:when test="contains(current(),'"')"><xsl:text>"</xsl:text><xsl:value-of select="replace(., '"', '""')" /><xsl:text>"</xsl:text></xsl:when>
<xsl:otherwise>
<xsl:text>"</xsl:text><xsl:value-of select="."/><xsl:text>"</xsl:text>
</xsl:otherwise>
</xsl:choose>
<xsl:if test="position()!=last()">,</xsl:if>
</xsl:for-each>
<xsl:text>
</xsl:text>
</xsl:for-each>
</xsl:element>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
</code>
<code><?xml version="1.0" encoding="UTF-8"?>
<!-- produce comma separated values output -->
<!-- follow all except last value by comma -->
<!-- if value contains a comma, enclose it in double quotes -->
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="yes" media-type="string"/>
<xsl:template match="/rows">
<xsl:element name="csvRoot">
<xsl:element name="csvString">
<xsl:for-each select="./row[1]">
<xsl:for-each select="./*">
<xsl:choose>
<xsl:when test="contains(current(),',')">"<xsl:value-of select="name(.)"/>"</xsl:when>
<xsl:otherwise>
<xsl:text>"</xsl:text><xsl:value-of select="name(.)"/><xsl:text>"</xsl:text>
</xsl:otherwise>
</xsl:choose>
<xsl:if test="position()!=last()">,</xsl:if>
</xsl:for-each>
<xsl:text>
</xsl:text>
</xsl:for-each>
<xsl:for-each select="./row">
<xsl:for-each select="./*">
<xsl:choose>
<xsl:when test="lower-case(name(.)) = 'contact.sourceid__c' and current() = ''"><xsl:text>""</xsl:text></xsl:when>
<xsl:when test="lower-case(name(.)) = 'recordtypeid' and current() = ''"><xsl:text>""</xsl:text></xsl:when>
<xsl:when test="lower-case(name(.)) = 'business_hours_id__c' and current() = ''"><xsl:text>""</xsl:text></xsl:when>
<xsl:when test="lower-case(name(.)) = 'businesshoursid' and current() = ''"><xsl:text>""</xsl:text></xsl:when>
<xsl:when test="lower-case(name(.)) = 'accountid__r.sourceid__c' and current() = ''"><xsl:text>""</xsl:text></xsl:when>
<xsl:when test="lower-case(name(.)) = 'account.sourceid__c' and current() = ''"><xsl:text>""</xsl:text></xsl:when>
<xsl:when test="lower-case(name(.)) = 'product2.sourceid__c' and current() = ''"><xsl:text>""</xsl:text></xsl:when>
<xsl:when test="lower-case(name(.)) = 'location.sourceid__c' and current() = ''"><xsl:text>""</xsl:text></xsl:when>
<xsl:when test="lower-case(name(.)) = 'asset.sourceid__c' and current() = ''"><xsl:text>""</xsl:text></xsl:when>
<xsl:when test="lower-case(name(.)) = 'servicecontract.sourceid__c' and current() = ''"><xsl:text>""</xsl:text></xsl:when>
<xsl:when test="lower-case(name(.)) = 'parent.sourceid__c' and current() = ''"><xsl:text>""</xsl:text></xsl:when>
<xsl:when test="current() = ''"><xsl:text>"#N/A"</xsl:text></xsl:when>
<xsl:when test="contains(current(),'"')"><xsl:text>"</xsl:text><xsl:value-of select="replace(., '"', '""')" /><xsl:text>"</xsl:text></xsl:when>
<xsl:otherwise>
<xsl:text>"</xsl:text><xsl:value-of select="."/><xsl:text>"</xsl:text>
</xsl:otherwise>
</xsl:choose>
<xsl:if test="position()!=last()">,</xsl:if>
</xsl:for-each>
<xsl:text>
</xsl:text>
</xsl:for-each>
</xsl:element>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
</code>
<?xml version="1.0" encoding="UTF-8"?>
<!-- produce comma separated values output -->
<!-- follow all except last value by comma -->
<!-- if value contains a comma, enclose it in double quotes -->
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="yes" media-type="string"/>
<xsl:template match="/rows">
<xsl:element name="csvRoot">
<xsl:element name="csvString">
<xsl:for-each select="./row[1]">
<xsl:for-each select="./*">
<xsl:choose>
<xsl:when test="contains(current(),',')">"<xsl:value-of select="name(.)"/>"</xsl:when>
<xsl:otherwise>
<xsl:text>"</xsl:text><xsl:value-of select="name(.)"/><xsl:text>"</xsl:text>
</xsl:otherwise>
</xsl:choose>
<xsl:if test="position()!=last()">,</xsl:if>
</xsl:for-each>
<xsl:text>
</xsl:text>
</xsl:for-each>
<xsl:for-each select="./row">
<xsl:for-each select="./*">
<xsl:choose>
<xsl:when test="lower-case(name(.)) = 'contact.sourceid__c' and current() = ''"><xsl:text>""</xsl:text></xsl:when>
<xsl:when test="lower-case(name(.)) = 'recordtypeid' and current() = ''"><xsl:text>""</xsl:text></xsl:when>
<xsl:when test="lower-case(name(.)) = 'business_hours_id__c' and current() = ''"><xsl:text>""</xsl:text></xsl:when>
<xsl:when test="lower-case(name(.)) = 'businesshoursid' and current() = ''"><xsl:text>""</xsl:text></xsl:when>
<xsl:when test="lower-case(name(.)) = 'accountid__r.sourceid__c' and current() = ''"><xsl:text>""</xsl:text></xsl:when>
<xsl:when test="lower-case(name(.)) = 'account.sourceid__c' and current() = ''"><xsl:text>""</xsl:text></xsl:when>
<xsl:when test="lower-case(name(.)) = 'product2.sourceid__c' and current() = ''"><xsl:text>""</xsl:text></xsl:when>
<xsl:when test="lower-case(name(.)) = 'location.sourceid__c' and current() = ''"><xsl:text>""</xsl:text></xsl:when>
<xsl:when test="lower-case(name(.)) = 'asset.sourceid__c' and current() = ''"><xsl:text>""</xsl:text></xsl:when>
<xsl:when test="lower-case(name(.)) = 'servicecontract.sourceid__c' and current() = ''"><xsl:text>""</xsl:text></xsl:when>
<xsl:when test="lower-case(name(.)) = 'parent.sourceid__c' and current() = ''"><xsl:text>""</xsl:text></xsl:when>
<xsl:when test="current() = ''"><xsl:text>"#N/A"</xsl:text></xsl:when>
<xsl:when test="contains(current(),'"')"><xsl:text>"</xsl:text><xsl:value-of select="replace(., '"', '""')" /><xsl:text>"</xsl:text></xsl:when>
<xsl:otherwise>
<xsl:text>"</xsl:text><xsl:value-of select="."/><xsl:text>"</xsl:text>
</xsl:otherwise>
</xsl:choose>
<xsl:if test="position()!=last()">,</xsl:if>
</xsl:for-each>
<xsl:text>
</xsl:text>
</xsl:for-each>
</xsl:element>
</xsl:element>
</xsl:template>
</xsl:stylesheet>
Here is the output:
<code><csvRoot><csvString>"SOURCEID__C","SOURCESYSTEM__C","NAME","Account.SourceId__c","Product2.SourceId__c","STATUS","SERIALNUMBER","MACHINE_MODEL__C","MACHINE_TYPE__C","CANCELLATION_DATE__C","CANCELLATION_REASON__C","EFFECTIVE_CANCELLATION_DATE__C"
"0000001Z","#N/A","#N/A","","","Inactive","#N/A","#N/A","#N/A","20240411","Cancelled invalid data","20240411"
"0000013","#N/A","#N/A","","","Inactive","#N/A","#N/A","#N/A","20240411","Cancelled invalid data","20240411"
</csvString></csvRoot>
</code>
<code><csvRoot><csvString>"SOURCEID__C","SOURCESYSTEM__C","NAME","Account.SourceId__c","Product2.SourceId__c","STATUS","SERIALNUMBER","MACHINE_MODEL__C","MACHINE_TYPE__C","CANCELLATION_DATE__C","CANCELLATION_REASON__C","EFFECTIVE_CANCELLATION_DATE__C"
"0000001Z","#N/A","#N/A","","","Inactive","#N/A","#N/A","#N/A","20240411","Cancelled invalid data","20240411"
"0000013","#N/A","#N/A","","","Inactive","#N/A","#N/A","#N/A","20240411","Cancelled invalid data","20240411"
</csvString></csvRoot>
</code>
<csvRoot><csvString>"SOURCEID__C","SOURCESYSTEM__C","NAME","Account.SourceId__c","Product2.SourceId__c","STATUS","SERIALNUMBER","MACHINE_MODEL__C","MACHINE_TYPE__C","CANCELLATION_DATE__C","CANCELLATION_REASON__C","EFFECTIVE_CANCELLATION_DATE__C"
"0000001Z","#N/A","#N/A","","","Inactive","#N/A","#N/A","#N/A","20240411","Cancelled invalid data","20240411"
"0000013","#N/A","#N/A","","","Inactive","#N/A","#N/A","#N/A","20240411","Cancelled invalid data","20240411"
</csvString></csvRoot>
It is working fine. I want to add additional logic to display certain fields if SOURCEID__C is null then populate only SOURCEID__C, CANCELLATION_DATE, EFFECTIVE_CANCELLATION_DATE, CANCELLATION_REASON
else populate all fields like i have in the output currently.