1

I want to find nodes of type asset and put them in CSV via xslt . Can someone help with xslt to trsform below xml.

<AssetData >
     <AssetMapping>
        <Owner>0</Owner>
        <AssetList>
          <Asset >
            <Name>SBS</Name>
            <Type>RealEstate</Type>
            <Location>Newzealand</Location>           
          </Asset>
    <Asset >
            <Name>KMK</Name>
            <Type>Equity</Type>
            <Location>NYSE</Location>        
          </Asset>             
    </AssetList>
 </AssetMapping>
</AssetData>

and I want text output like

Name,Type,Location
SBS,RealEstate,Newzealand
KMK,Equity,NYSE
TRS
  • 1,947
  • 4
  • 26
  • 49

1 Answers1

1

XSLT:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>

<xsl:template match="/*">
    <xsl:for-each select="descendant::Asset">
        <xsl:if test="position()=1">
            <xsl:for-each select="*">
                <xsl:value-of select="name()"/><xsl:if test="not(position()=last())"><xsl:text>,</xsl:text></xsl:if>
            </xsl:for-each>
            <xsl:text>&#10;</xsl:text>
        </xsl:if>
        <xsl:for-each select="*">
            <xsl:value-of select="."/><xsl:if test="not(position()=last())"><xsl:text>,</xsl:text></xsl:if>
        </xsl:for-each>
            <xsl:text>&#10;</xsl:text>
   </xsl:for-each>
</xsl:template>

</xsl:stylesheet>

XSLT to hide particular Column based on Name:

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>

<xsl:template match="/*">
    <xsl:for-each select="descendant::Asset">
        <xsl:variable name="varName"><xsl:text>Name</xsl:text></xsl:variable><!--Mention the name of column to hide here -->
        <xsl:variable name="varColPos">
            <xsl:value-of select="count(*[name()=$varName]/preceding-sibling::*)+1"/>
        </xsl:variable>
        <xsl:if test="position()=1">
            <xsl:for-each select="*">
                <xsl:if test="not(position()=number($varColPos))"><xsl:value-of select="name()"/></xsl:if>
                <xsl:if test="not(position()=last()) and not(position()=number($varColPos))"><xsl:text>,</xsl:text></xsl:if>
            </xsl:for-each>
            <xsl:text>&#10;</xsl:text>
        </xsl:if>
        <xsl:for-each select="*">
                <xsl:if test="not(position()=number($varColPos))"><xsl:value-of select="."/></xsl:if>
                <xsl:if test="not(position()=last()) and not(position()=number($varColPos))"><xsl:text>,</xsl:text></xsl:if>
            </xsl:for-each>
            <xsl:text>&#10;</xsl:text>
    </xsl:for-each>
</xsl:template>

</xsl:stylesheet>
Rudramuni TP
  • 1,268
  • 2
  • 16
  • 26
  • Could you please also let me know how to exclude complete column like Name from CSV? – TRS Nov 26 '19 at 14:23
  • 1
    @TRS, to exclude 'Name' column also addressed in my post, pls check. – Rudramuni TP Nov 27 '19 at 05:30
  • Thanks , I see that you exclude column by position. Its possible that position of element may change.Is it possible to exclude by name of the node like you do when selecting node select="descendant::Asset" – TRS Nov 27 '19 at 07:37
  • 1
    @TRS, I have updated the scripts to 'exclude the column based on Name'... – Rudramuni TP Nov 27 '19 at 08:57