Consider the following XML document called example.xml. As you can see, the document has two elements named sourcefield which contain multiple attributes.
<source>
<sourcefield businessname ="" datatype ="DATE" description ="" fieldnumber ="1"
fieldproperty ="0" fieldtype ="ELEMITEM" hidden ="NO" keytype ="NOT A KEY" length ="19"
level ="0" name ="BUSINESS_DATE" nullable ="NULL" occurs ="0" offset ="0" physicallength ="19"
physicaloffset ="0" picturetext ="" precision ="19" scale ="0" usage_flags =""/>
<sourcefield businessname ="JOHNSON" datatype ="DATE" description ="SHOEMAKER" fieldnumber ="1"
fieldproperty ="1" fieldtype ="ELEMITEM" hidden ="NO" keytype ="NOT A KEY" length ="19"
level ="3" name ="BUSINESS_DATE" nullable ="NULL" occurs ="0" offset ="0" physicallength ="19"
physicaloffset ="0" picturetext ="" precision ="19" scale ="0" usage_flags ="jj"/>
</source>
Suppose you wish to convert the contents of the sourcefield elements into CSV (Comma Separated Values) using XSLT.
This stylesheet (example1.xsl) is one way of transformating the above XML document:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="iso-8859-1"/>
<xsl:strip-space elements="*" />
<xsl:template match="*">
<xsl:copy>
<xsl:for-each select="@*">
<xsl:if test="position() != last()"> "<xsl:value-of select="normalize-space(.)"/>",</xsl:if>
<xsl:if test="position() = last()">"<xsl:value-of select="normalize-space(.)"/>"<xsl:text> </xsl:text>
</xsl:if>
</xsl:for-each>
<xsl:apply-templates />
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
Here is the output of the transformation of example.xml using the above stylesheet.
$ xstlproc example1.xsl example.xml "", "DATE", "", "1", "0", "ELEMITEM", "NO", "NOT A KEY", "19", "0", "BUSINESS_DATE", "NULL", "0", "0", "19", "0", "", " 19", "0","" "JOHNSON", "DATE", "SHOEMAKER", "1", "1", "ELEMITEM", "NO", "NOT A KEY", "19", "3", "BUSINESS_DATE", "NULL", "0", "0", "19", "0", "", "19", "0","JJ"
Suppose that instead of converting the attributes into CVS data, you wished to convert them into elements.
Here is a stylesheet that will do exactly that:
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output indent="yes" />
<xsl:strip-space elements="*" />
<xsl:template match="*">
<xsl:copy>
<xsl:if test="@*">
<xsl:for-each select="@*">
<xsl:element name="{name()}">
<xsl:value-of select="." />
</xsl:element>
</xsl:for-each>
</xsl:if>
<xsl:apply-templates />
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
and here is the output of the transformation of example.xml using that stylesheet.
$ xsltproc example2.xsl example.xml
<?xml version="1.0"?>
<source>
<sourcefield>
<businessname></businessname>
<datatype>DATE</datatype>
<description></description>
<fieldnumber>1</fieldnumber>
<fieldproperty>0</fieldproperty>
<fieldtype>ELEMITEM</fieldtype>
<hidden>NO</hidden>
<keytype>NOT A KEY</keytype>
<length>19</length>
<level>0</level>
<name>BUSINESS_DATE</name>
<nullable>NULL</nullable>
<occurs>0</occurs>
<offset>0</offset>
<physicallength>19</physicallength>
<physicaloffset>0</physicaloffset>
<picturetext></picturetext>
<precision>19</precision>
<scale>0</scale>
<usage_flags></usage_flags>
</sourcefield>
<sourcefield>
<businessname>JOHNSON</businessname>
<datatype>DATE</datatype>
<description>SHOEMAKER</description>
<fieldnumber>1</fieldnumber>
<fieldproperty>1</fieldproperty>
<fieldtype>ELEMITEM</fieldtype>
<hidden>NO</hidden>
<keytype>NOT A KEY</keytype>
<length>19</length>
<level>3</level>
<name>BUSINESS_DATE</name>
<nullable>NULL</nullable>
<occurs>0</occurs>
<offset>0</offset>
<physicallength>19</physicallength>
<physicaloffset>0</physicaloffset>
<picturetext></picturetext>
<precision>19</precision>
<scale>0</scale>
<usage_flags>jj</usage_flags>
</sourcefield>
</source>
$
Enjoy!





