I'm trying to create generic xslt for XML to CSV.
Facing issues when elements not available in particular child doesn't produce blank value and if the node
Is it possible to achieve generic xslt for for different xmls which has similar tree structure with only difference in element nodes
Root- Child - Element1,Element2 Child - Element3 Child - Element4
Sample input XML
<?xml version="1.0" encoding="UTF-8"?>
<queryResponse>
<User>
<Id>rti</Id>
</User>
<User>
<Id>qwe</Id>
<EmployeeNumber>emp1</EmployeeNumber>
<IsActive>false</IsActive>
</User>
<User>
<Id>Abc</Id>
<IsActive>false</IsActive>
</User>
<User>
<Id>123</Id>
<EmployeeNumber>emp4</EmployeeNumber>
<IsActive>false</IsActive>
</User>
</queryResponse>
Expected Output
"Id","EmployeeNumber","IsActive"
"rti","",""
"qwe","emp1","false"
"Abc","","false"
"123","emp4","false"
Tried XSLT
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" />
<xsl:param name="delim" select="','" />
<xsl:param name="break" select="'
'" /><!-- xA = NL, xD = CR -->
<xsl:param name="colnames" select="'y'"/>
<xsl:strip-space elements="*" />
<xsl:template match="/*/child::*">
<!--headerline-->
<xsl:if test="$colnames = 'y'">
<!-- <xsl:if test="position() = 1"> -->
<xsl:for-each select="child::*">
<xsl:text>"</xsl:text>
<xsl:value-of select="name()"/>
<xsl:text>"</xsl:text>
<xsl:if test="position() != last()">
<xsl:value-of select="$delim"/>
</xsl:if>
</xsl:for-each>
<!-- hardcode version newline -->
<!--<xsl:text>
</xsl:text>-->
<!-- linebreak, nicer -->
<xsl:value-of select="$break" />
<!-- </xsl:if> -->
</xsl:if>
<!--dataline-->
<xsl:for-each select="child::*">
<xsl:if test="position() != last()">
<xsl:text>"</xsl:text>
<xsl:value-of select="normalize-space(.)"/>
<xsl:text>"</xsl:text>
<xsl:value-of select="$delim" />
</xsl:if>
<xsl:if test="position() = last()">
<xsl:text>"</xsl:text>
<xsl:value-of select="normalize-space(.)"/>
<xsl:text>"</xsl:text>
<xsl:value-of select="$break" />
</xsl:if>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
Resulted output
"Id"
"rti"
"qwe","emp1","false"
"Abc","false"
"123","emp4","false"