Hi,
I am having the following xml.
XML
===
<?xml version="1.0" encoding="UTF-8"?>
<!-- edited with XMLSPY v5 rel. 4 U (http://www.xmlspy.com) by Dipesh
Khakhkhar (Fidelity Investments) -->
<AEXDATAEXTRACT DTD_VERSION="2.2" EXTRACT_START_DATETIME="1/9/2003 4:49:39 PM"
EXTRACT_TYPE="FULL" EXTRACT_COLLECTION="">
<RESOURCE_TYPE GUID="{493435f7-3b17-4c4c-b07f-c23e7ab7781f}"
NAME="Computer"
DESCRIPTION="Asset Type definition for Computer" SOURCE="Asset"
CREATED_DATE="7/16/2002 5:22:23 PM" MODIFIED_DATE="9/23/2002 2:17:48 PM"
DELETED="0">
<RESOURCE GUID="{C116FCBF-5B94-4F15-BF95-5795DBD384CD}"
NAME="ALTIRISTEST_CPQ" SOURCE="" SITE_CODE="756win" DOMAIN="FIDD"
SYSTEM_TYPE="Win32" OS_NAME="Microsoft Windows XP" OS_TYPE="Professional"
OS_VERSION="5.1" OS_REVISION="Service Pack 1" LAST_LOGON_USER=""
LAST_LOGON_DOMAIN="">
<INVENTORY>
<ASSET>
<IDENTIFICATION IDentId="ytwyu">
<ATTRIBUTE
NAME="Name">ALTIRISTEST_CPQ</ATTRIBUTE>
<ATTRIBUTE
NAME="Domain">FIDDOMRTLSLC</ATTRIBUTE>
<ATTRIBUTE NAME="Altkey1"
NULL="FALSE"/>
<ATTRIBUTE
NAME="Altkey2">00-02-A5-1A-67-A6</ATTRIBUTE>
</IDENTIFICATION>
<CLASS NAME="Active_Directory_Details">
<OBJECT>
<ATTRIBUTE NAME="Agent
Name">Altiris eXpress NS Client</ATTRIBUTE>
<ATTRIBUTE
NAME="Product Version">5.5.0.517</ATTRIBUTE>
<ATTRIBUTE NAME="Build
Number">517</ATTRIBUTE>
<ATTRIBUTE
NAME="Install Path">C:\Program Files\Altiris\eXpress\NS
Client</ATTRIBUTE>
</OBJECT>
<OBJECT>
<ATTRIBUTE NAME="Agent
Name">Altiris eXpress NS Client</ATTRIBUTE>
<ATTRIBUTE
NAME="Product Version">5.5.0.517</ATTRIBUTE>
<ATTRIBUTE NAME="Build
Number">517</ATTRIBUTE>
<ATTRIBUTE
NAME="Install Path">C:\Program Files\Altiris\eXpress\NS
Client</ATTRIBUTE>
</OBJECT>
<OBJECT>
<ATTRIBUTE
NAME="Not_Counted">This is not catpured</ATTRIBUTE>
</OBJECT>
</CLASS>
<CLASS NAME="User_Contact_Details">
<OBJECT>
<ATTRIBUTE
NAME="Collection Time">1/9/2003 3:06:56 AM</ATTRIBUTE>
<ATTRIBUTE NAME="File
Count">3</ATTRIBUTE>
<ATTRIBUTE NAME="Total
Size">139271</ATTRIBUTE>
<ATTRIBUTE
NAME="Version">5: 5: 0: 423</ATTRIBUTE>
</OBJECT>
<OBJECT>
<ATTRIBUTE
NAME="Collection Time">Second Row First Column of
UCD</ATTRIBUTE>
<ATTRIBUTE NAME="File
Count">Second Row Second Column of
UCD</ATTRIBUTE>
<ATTRIBUTE NAME="Total
Size">Second Row Third Column of UCD</ATTRIBUTE>
<ATTRIBUTE
NAME="Version">Second Row Third Column of UCD</ATTRIBUTE>
</OBJECT>
</CLASS>
<CLASS NAME="User_General_Details">
<OBJECT>
<ATTRIBUTE
NAME="Collection Time">1/9/2003 3:06:56 AM</ATTRIBUTE>
<ATTRIBUTE NAME="File
Count">3</ATTRIBUTE>
<ATTRIBUTE NAME="Total
Size">139271</ATTRIBUTE>
<ATTRIBUTE
NAME="Version">5: 5: 0: 423</ATTRIBUTE>
</OBJECT>
<OBJECT>
<ATTRIBUTE
NAME="Collection Time">Second Row First Column of
UGD</ATTRIBUTE>
<ATTRIBUTE NAME="File
Count">Second Row Second Column of
UGD</ATTRIBUTE>
<ATTRIBUTE NAME="Total
Size">Second Row Third Column of UGD</ATTRIBUTE>
<ATTRIBUTE
NAME="Version">Second Row Third Column of UGD</ATTRIBUTE>
</OBJECT>
</CLASS>
</ASSET>
</INVENTORY>
</RESOURCE>
<RESOURCE GUID="{C116FCBF-5B94-4F15-BF95-5795DBD384CD}"
NAME="ALTIRISTEST_CPQ" SOURCE="" SITE_CODE="756win" DOMAIN="FIDD"
SYSTEM_TYPE="Win32" OS_NAME="Microsoft Windows XP" OS_TYPE="Professional"
OS_VERSION="5.1" AdditionalCol="Working Additional Col Value"
OS_REVISION="Service Pack 1" LAST_LOGON_USER="" LAST_LOGON_DOMAIN="">
<INVENTORY>
<ASSET>
<IDENTIFICATION>
<ATTRIBUTE
NAME="Name">ALTIRISTEST_CPQ</ATTRIBUTE>
<ATTRIBUTE NAME="Additional
Column">additional column value</ATTRIBUTE>
<ATTRIBUTE
NAME="Domain">FIDDOMRTLSLC</ATTRIBUTE>
<ATTRIBUTE NAME="Altkey1"
NULL="FALSE"/>
<ATTRIBUTE
NAME="Altkey2">00-02-A5-1A-67-A6</ATTRIBUTE>
</IDENTIFICATION>
<CLASS NAME="Active_Directory_Details">
<OBJECT>
<ATTRIBUTE NAME="Agent
Name">Altiris eXpress NS Client</ATTRIBUTE>
<ATTRIBUTE
NAME="Product Version">5.5.0.517</ATTRIBUTE>
<ATTRIBUTE NAME="Extra
Column">Extra COlumn Value1</ATTRIBUTE>
<ATTRIBUTE NAME="Build
Number">517</ATTRIBUTE>
<ATTRIBUTE
NAME="Install Path">C:\Program Files\Altiris\eXpress\NS
Client</ATTRIBUTE>
</OBJECT>
</CLASS>
</ASSET>
</INVENTORY>
</RESOURCE>
</RESOURCE_TYPE>
</AEXDATAEXTRACT>
---------------------------------------------------------------------
I wanted output like this.
Output
=======
SEQUENCEID`DTD_VERSION`EXTRACT_START_DATETIME`EXTRACT_TYPE`EXTRACT_COLLECTION`
SEQUENCEID`RESOURCE_TYPE.GUID`NAME`DESCRIPTION`SOURCE`CREATED_DATE`MODIFIED_DA
TE`DELETED`RESOURCE_TYPE.GUID`RESOURCE.GUID`NAME`SOURCE`SITE_CODE`DOMAIN`SYSTE
M_TYPE`OS_NAME`OS_TYPE`OS_VERSION`AdditionalCol`OS_REVISION`LAST_LOGON_USER`LA
ST_LOGON_DOMAIN`INVENTORYID`RESOURCE.GUID`INVENTORYID`ASSETID`NAME`IDENTIFICAT
IONID`ASSETID`Name`Additional
Column`Domain`Altkey1`Altkey2`ActiveDirectoryDetailsID`AssetID`Agent
Name`Product Version`Extra Column`Build Number`Install
Path`UserContactDetailsID`AssetID`Collection Time`File Count`Total
Size`Version`UserGeneralDetailsID`AssetID`Collection Time`File Count`Total
Size`Version
AutoSequence`2.2`1/9/2003 4:49:39
PM`FULL``SEQID`{493435f7-3b17-4c4c-b07f-c23e7ab7781f}`Computer`Asset Type
definition for Computer`Asset`7/16/2002 5:22:23 PM`9/23/2002 2:17:48
PM`0`{493435f7-3b17-4c4c-b07f-c23e7ab7781f}`{C116FCBF-5B94-4F15-BF95-5795DBD38
4CD}`ALTIRISTEST_CPQ``756win`FIDD`Win32`Microsoft Windows
XP`Professional`5.1``Service Pack
1```IDAEB2N`{C116FCBF-5B94-4F15-BF95-5795DBD384CD}`IDAEB2N`IDAGB2N`IDENTIFICAT
ION`IDAIB2N`IDAGB2N`ALTIRISTEST_CPQ``FIDDOMRTLSLC``00-02-A5-1A-67-A6
`````````````````````````````IDAGB2N`IDAEB2N`Active_Directory_Details````````I
DA4B2N`IDAGB2N`Altiris eXpress NS Client`5.5.0.517``517`C:\Program
Files\Altiris\eXpress\NS Client
```````````````````````````````````````IDARC2N`IDAGB2N`Altiris eXpress NS
Client`5.5.0.517``517`C:\Program Files\Altiris\eXpress\NS Client
`````````````````````````````IDAGB2N`IDAEB2N`User_Contact_Details`````````````
``IDAID2N`IDAGB2N`1/9/2003 3:06:56 AM`3`139271`5: 5: 0: 423
``````````````````````````````````````````````IDA1D2N`IDAGB2N`Second Row First
Column of UCD`Second Row Second Column of UCD`Second Row Third Column of
UCD`Second Row Third Column of UCD
`````````````````````````````IDAGB2N`IDAEB2N`User_General_Details`````````````
````````IDASE2N`IDAGB2N`1/9/2003 3:06:56 AM`3`139271`5: 5: 0: 423
````````````````````````````````````````````````````IDAFF2N`IDAGB2N`Second Row
First Column of UGD`Second Row Second Column of UGD`Second Row Third Column of
UGD`Second Row Third Column of UGD
`````````````{493435f7-3b17-4c4c-b07f-c23e7ab7781f}`{C116FCBF-5B94-4F15-BF95-5
795DBD384CD}`ALTIRISTEST_CPQ``756win`FIDD`Win32`Microsoft Windows
XP`Professional`5.1`Working Additional Col Value`Service Pack
1```IDALG2N`{C116FCBF-5B94-4F15-BF95-5795DBD384CD}`IDALG2N`IDANG2N`IDENTIFICAT
ION`IDAPG2N`IDANG2N`ALTIRISTEST_CPQ`additional column
value`FIDDOMRTLSLC``00-02-A5-1A-67-A6
`````````````````````````````IDANG2N`IDALG2N`Active_Directory_Details````````I
DAJH2N`IDANG2N`Altiris eXpress NS Client`5.5.0.517`Extra COlumn
Value1`517`C:\Program Files\Altiris\eXpress\NS Client
--------------------------------------------------------------------
I have written the following xsl
XSL
===
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output method="text"/>
<!-- Getting AeXDataExtract node with maximum attributes -->
<xsl:variable name="mostattForAexDataExtract">
<xsl:for-each select="//AEXDATAEXTRACT">
<xsl:sort select="count(attribute::*)"
order="descending"
data-type="number"/>
<xsl:if test="position()=1">
<xsl:value-of select="generate-id()"/>
</xsl:if>
</xsl:for-each>
</xsl:variable>
<xsl:variable name="maxAttADE-node" select="//node()[generate-id() =
$mostattForAexDataExtract]"/>
<!-- Getting Resource_Type node with maximum attributes -->
<xsl:variable name="mostattForResourceType">
<xsl:for-each select="//RESOURCE_TYPE">
<xsl:sort select="count(attribute::*)"
order="descending"
data-type="number"/>
<xsl:if test="position()=1">
<xsl:value-of select="generate-id()"/>
</xsl:if>
</xsl:for-each>
</xsl:variable>
<xsl:variable name="maxAttResType-node" select="//node()[generate-id()
=
$mostattForResourceType]"/>
<!-- Getting Resource node with maximum attributes -->
<xsl:variable name="mostattForResource">
<xsl:for-each select="//RESOURCE">
<xsl:sort select="count(attribute::*)"
order="descending"
data-type="number"/>
<xsl:if test="position()=1">
<xsl:value-of select="generate-id()"/>
</xsl:if>
</xsl:for-each>
</xsl:variable>
<xsl:variable name="maxAttResource-node" select="//node()[generate-id()
=
$mostattForResource]"/>
<!-- Getting Identification node with maximum childnodes i.e. having
maximum
columns-->
<xsl:variable name="mostattIdentification">
<xsl:for-each select="//IDENTIFICATION">
<xsl:sort select="count(ATTRIBUTE)" order="descending"/>
<xsl:if test="position()=1">
<xsl:value-of select="generate-id(.)"/>
</xsl:if>
</xsl:for-each>
</xsl:variable>
<xsl:variable name="maxAttIdentification-node"
select="//node()[generate-id()
= $mostattIdentification]"/>
<!-- Getting Active_Directory_Details node with maximum childnodes i.e.
having maximum columns-->
<xsl:variable name="mostattActDirDetTable">
<xsl:for-each
select="/AEXDATAEXTRACT/RESOURCE_TYPE/RESOURCE/INVENTORY/ASSET/CLASS[normalize
-space(@NAME)='Active_Directory_Details']/OBJECT">
<xsl:sort select="count(ATTRIBUTE)" data-type="number"
order="descending"/>
<xsl:if test="position()=1">
<xsl:value-of select="generate-id(.)"/>
</xsl:if>
</xsl:for-each>
</xsl:variable>
<xsl:variable name="maxattActDirDet-node" select="//node()[generate-id() =
$mostattActDirDetTable]"/>
<!-- Getting User_Contact_Details node with maximum childnodes i.e. having
maximum columns-->
<xsl:variable name="mostattUserConDetTable">
<xsl:for-each
select="/AEXDATAEXTRACT/RESOURCE_TYPE/RESOURCE/INVENTORY/ASSET/CLASS[normalize
-space(@NAME)='User_Contact_Details']/OBJECT">
<xsl:sort select="count(ATTRIBUTE)" data-type="number"
order="descending"/>
<xsl:if test="position()=1">
<xsl:value-of select="generate-id(.)"/>
</xsl:if>
</xsl:for-each>
</xsl:variable>
<xsl:variable name="maxattUserConDet-node" select="//node()[generate-id() =
$mostattUserConDetTable]"/>
<!-- Getting User_General_Details node with maximum childnodes i.e. having
maximum columns-->
<xsl:variable name="mostattUserGenDetTable">
<xsl:for-each
select="/AEXDATAEXTRACT/RESOURCE_TYPE/RESOURCE/INVENTORY/ASSET/CLASS[normalize
-space(@NAME)='User_General_Details']/OBJECT">
<xsl:sort select="count(ATTRIBUTE)" data-type="number"
order="descending"/>
<xsl:if test="position()=1">
<xsl:value-of select="generate-id(.)"/>
</xsl:if>
</xsl:for-each>
</xsl:variable>
<xsl:variable name="maxattUserGenDet-node" select="//node()[generate-id() =
$mostattUserGenDetTable]"/>
<!-- Outputting Column Header first and Then Data -->
<xsl:template match="/">
<!-- Printing header for AeXDataExtract -->
<xsl:text>SEQUENCEID`</xsl:text>
<xsl:for-each select="$maxAttADE-node/@*">
<xsl:value-of select="name(.)"/>
<xsl:if test="position()!=last()">`</xsl:if>
</xsl:for-each>
<!-- Printing header for resource type -->
<xsl:text>`SEQUENCEID`RESOURCE_TYPE.</xsl:text>
<xsl:for-each select="$maxAttResType-node/@*">
<xsl:value-of select="name(.)"/>
<xsl:if test="position()!=last()">`</xsl:if>
</xsl:for-each>
<!-- Printing header for resource -->
<xsl:text>`RESOURCE_TYPE.GUID`RESOURCE.</xsl:text>
<xsl:for-each select="$maxAttResource-node/@*">
<xsl:value-of select="name(.)"/>
<xsl:if test="position()!=last()">`</xsl:if>
</xsl:for-each>
<!-- Printing header for Inventory and Asset Tables -->
<xsl:text>`INVENTORYID`RESOURCE.GUID`INVENTORYID`ASSETID`NAME`</xsl:text>
<!-- Printing header for IDENTIFICATION -->
<xsl:text>IDENTIFICATIONID`ASSETID`</xsl:text>
<xsl:for-each select="$maxAttIdentification-node">
<xsl:for-each select="ATTRIBUTE/@NAME">
<xsl:value-of select="."/>
<xsl:if test="position()!=last()">`</xsl:if>
</xsl:for-each>
</xsl:for-each>
<!-- Printing header for Active_Directory_Details -->
<xsl:for-each select="$maxattActDirDet-node">
<xsl:text>`ActiveDirectoryDetailsID`AssetID`</xsl:text>
<xsl:for-each select="ATTRIBUTE/@NAME">
<xsl:value-of select="."/>
<xsl:if test="position()!=last()">`</xsl:if>
</xsl:for-each>
</xsl:for-each>
<!-- Printing header for User_Contact_Details -->
<xsl:for-each select="$maxattUserConDet-node">
<xsl:text>`UserContactDetailsID`AssetID`</xsl:text>
<xsl:for-each select="ATTRIBUTE/@NAME">
<xsl:value-of select="."/>
<xsl:if test="position()!=last()">`</xsl:if>
</xsl:for-each>
</xsl:for-each>
<!-- Printing header for User_General_Details -->
<xsl:for-each select="$maxattUserGenDet-node">
<xsl:text>`UserGeneralDetailsID`AssetID`</xsl:text>
<xsl:for-each select="ATTRIBUTE/@NAME">
<xsl:value-of select="."/>
<xsl:if test="position()!=last()">`</xsl:if>
</xsl:for-each>
</xsl:for-each>
<xsl:text> </xsl:text>
<!-- Now putting data data below the Column Headers -->
<xsl:apply-templates select="/AEXDATAEXTRACT"/>
</xsl:template>
<!-- Template for AEXDATAEXTRACT -->
<xsl:template match="AEXDATAEXTRACT">
<xsl:text>AutoSequence`</xsl:text>
<xsl:variable name="r" select="."/>
<xsl:for-each select="$maxAttADE-node">
<xsl:for-each select="@*">
<xsl:choose>
<xsl:when
test="$r/@*[name()=name(current())]">
<xsl:value-of select="."/>
<xsl:if
test="position()!=last()">`</xsl:if>
</xsl:when>
<xsl:otherwise>`</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
<!--<xsl:text> </xsl:text> -->
</xsl:for-each>
<xsl:apply-templates select="RESOURCE_TYPE"/>
</xsl:template>
<!-- Template for resouce Type -->
<xsl:template match="RESOURCE_TYPE">
<xsl:text>`SEQID`</xsl:text>
<xsl:variable name="r" select="."/>
<xsl:for-each select="$maxAttResType-node">
<xsl:for-each select="@*">
<xsl:choose>
<xsl:when
test="$r/@*[name()=name(current())]">
<xsl:value-of select="."/>
<xsl:if
test="position()!=last()">`</xsl:if>
</xsl:when>
<xsl:otherwise>`</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
<!--<xsl:text> </xsl:text> -->
</xsl:for-each>
<xsl:apply-templates select="RESOURCE"/>
<!-- I will count the attributes of parent node and dynamically
generate the
seperators -->
<xsl:if test="not (position()=last())">
<!-- <xsl:text>
`````</xsl:text> -->
<xsl:text>
</xsl:text>
<xsl:call-template name="do-quotes">
<xsl:with-param name="count"
select="count($maxAttADE-node/@*) + 1"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
<!-- Template for RESOURCE -->
<xsl:template match="RESOURCE">`<xsl:value-of
select="../@GUID"/>`<xsl:variable name="r" select="."/>
<xsl:for-each select="$maxAttResource-node">
<xsl:for-each select="@*">
<xsl:choose>
<xsl:when
test="$r/@*[name()=name(current())]">
<xsl:value-of select="."/>
<xsl:if
test="position()!=last()">`</xsl:if>
</xsl:when>
<xsl:otherwise>`</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
<!-- <xsl:text> </xsl:text> -->
</xsl:for-each>
<xsl:apply-templates select="INVENTORY"/>
<xsl:if test="not (position()=last())">
<!--<xsl:text>
````````````</xsl:text> -->
<!-- Calling doQuotes template which writes qoutes in
the output -->
<xsl:call-template name="do-quotes">
<xsl:with-param name="count"
select="count($maxAttADE-node/@*) + 1 +
count($maxAttResType-node/@*)"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
<!-- Template for INVENTORY -->
<xsl:template match="INVENTORY">`<xsl:value-of
select="generate-id(.)"/>`<xsl:value-of select="..//@GUID"/>
<xsl:apply-templates select="ASSET"/>
</xsl:template>
<!-- Template for ASSET -->
<xsl:template match="ASSET">`<xsl:value-of
select="generate-id(..)"/>`<xsl:value-of select="generate-id(.)"/>
<xsl:apply-templates select="IDENTIFICATION"/>
<xsl:apply-templates select="CLASS"/>
</xsl:template>
<!--Temaplate for IDENTIFICATION -->
<xsl:template match="IDENTIFICATION">`IDENTIFICATION`<xsl:value-of
select="generate-id(.)"/>`<xsl:value-of select="generate-id(..)"/>
<xsl:text>`</xsl:text>
<xsl:variable name="r" select="."/>
<xsl:for-each select="$maxAttIdentification-node/ATTRIBUTE">
<xsl:value-of
select="normalize-space($r/ATTRIBUTE[(_at_)NAME=current()/@NAME])"/>
<xsl:if test="position()!=last()">`</xsl:if>
</xsl:for-each>
<xsl:text> </xsl:text>
</xsl:template>
<xsl:template match="CLASS">
<xsl:choose>
<!-- When Name is Active Directory Details -->
<xsl:when
test="normalize-space(@NAME)='Active_Directory_Details'">`<xsl:call-template
name="do-quotes"><xsl:with-param name="count"
select="count($maxAttADE-node/@*) + 1 + count($maxAttResType-node/@*) +
count($maxAttResource-node/@*)+ 3"/></xsl:call-template><xsl:value-of
select="generate-id(..)"/>`<xsl:value-of
select="generate-id(../..)"/>`<xsl:value-of select="@NAME"/><xsl:call-template
name="do-quotes"><xsl:with-param name="count"
select="count($maxAttIdentification-node/ATTRIBUTE/@*)+
1"/></xsl:call-template><xsl:for-each select="OBJECT"><xsl:variable name="r"
select="."/>`<xsl:value-of select="generate-id(.)"/>`<xsl:value-of
select="generate-id(../..)"/><xsl:text>`</xsl:text>
<xsl:for-each select="$maxattActDirDet-node/ATTRIBUTE">
<xsl:value-of
select="normalize-space($r/ATTRIBUTE[(_at_)NAME=current()/@NAME])"/>
<xsl:if test="position()!=last()">`</xsl:if>
</xsl:for-each>
<xsl:if test="not (position()=last())">
<xsl:text>
</xsl:text>
<xsl:call-template name="do-quotes">
<xsl:with-param name="count" select="count($maxAttADE-node/@*) + 1 +
count($maxAttResType-node/@*) + count($maxAttResource-node/@*)+
count($maxAttIdentification-node/@*)+ 13"/>
</xsl:call-template>
</xsl:if>
</xsl:for-each>
<xsl:text> </xsl:text>
</xsl:when>
<!-- When name is User Contact Details -->
<xsl:when
test="normalize-space(@NAME)='User_Contact_Details'">`<xsl:call-template
name="do-quotes"><xsl:with-param name="count"
select="count($maxAttADE-node/@*) + 1 + count($maxAttResType-node/@*) +
count($maxAttResource-node/@*)+ 3"/></xsl:call-template><xsl:value-of
select="generate-id(..)"/>`<xsl:value-of
select="generate-id(../..)"/>`<xsl:value-of select="@NAME"/><xsl:call-template
name="do-quotes"><xsl:with-param name="count"
select="count($maxAttIdentification-node/ATTRIBUTE/@*)+count($maxattActDirDet-
node/ATTRIBUTE/@*)+ 3"/></xsl:call-template><xsl:for-each
select="OBJECT"><xsl:variable name="r" select="."/>`<xsl:value-of
select="generate-id(.)"/>`<xsl:value-of
select="generate-id(../..)"/><xsl:text>`</xsl:text>
<xsl:for-each select="$maxattUserConDet-node/ATTRIBUTE">
<xsl:value-of
select="normalize-space($r/ATTRIBUTE[(_at_)NAME=current()/@NAME])"/>
<xsl:if test="position()!=last()">`</xsl:if>
</xsl:for-each>
<xsl:if test="not (position()=last())">
<xsl:text>
</xsl:text>
<xsl:call-template name="do-quotes">
<xsl:with-param name="count" select="count($maxAttADE-node/@*) + 1 +
count($maxAttResType-node/@*) + count($maxAttResource-node/@*)+
count($maxAttIdentification-node/@*)+count($maxattUserConDet-node/ATTRIBUTE/@*
)+ 16"/>
</xsl:call-template>
</xsl:if>
</xsl:for-each>
<xsl:text> </xsl:text>
</xsl:when>
<!-- When name is User General Details -->
<xsl:when
test="normalize-space(@NAME)='User_General_Details'">`<xsl:call-template
name="do-quotes"><xsl:with-param name="count"
select="count($maxAttADE-node/@*) + 1 + count($maxAttResType-node/@*) +
count($maxAttResource-node/@*)+ 3"/></xsl:call-template><xsl:value-of
select="generate-id(..)"/>`<xsl:value-of
select="generate-id(../..)"/>`<xsl:value-of select="@NAME"/><xsl:call-template
name="do-quotes"><xsl:with-param name="count"
select="count($maxAttIdentification-node/ATTRIBUTE/@*)+count($maxattActDirDet-
node/ATTRIBUTE/@*)+count($maxattUserConDet-node/ATTRIBUTE/@*)+
5"/></xsl:call-template><xsl:for-each select="OBJECT"><xsl:variable name="r"
select="."/>`<xsl:value-of select="generate-id(.)"/>`<xsl:value-of
select="generate-id(../..)"/><xsl:text>`</xsl:text>
<xsl:for-each select="$maxattUserGenDet-node/ATTRIBUTE">
<xsl:value-of
select="normalize-space($r/ATTRIBUTE[(_at_)NAME=current()/@NAME])"/>
<xsl:if test="position()!=last()">`</xsl:if>
</xsl:for-each>
<xsl:if test="not (position()=last())">
<xsl:text>
</xsl:text>
<xsl:call-template name="do-quotes">
<xsl:with-param name="count" select="count($maxAttADE-node/@*) + 1 +
count($maxAttResType-node/@*) + count($maxAttResource-node/@*)+
count($maxAttIdentification-node/@*)+count($maxattActDirDet-node/ATTRIBUTE/@*)
+count($maxattUserConDet-node/ATTRIBUTE/@*)+ 17"/>
</xsl:call-template>
</xsl:if>
</xsl:for-each>
<xsl:text> </xsl:text>
</xsl:when>
</xsl:choose>
</xsl:template>
<!-- RECURSIVE TEMPLATE TO OUTPUT DELIMTER i.e " `" -->
<xsl:template name="do-quotes">
<xsl:param name="count" select="0"/>
<xsl:if test="$count">
<xsl:text>`</xsl:text>
<xsl:call-template name="do-quotes">
<xsl:with-param name="count" select="$count -
1"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
--------------------------------------------------------------------
This is working fine. I am trying to get the column headers first and then
data for respective columns. Column headers are the attributes. These i am
capturing sometimes directly and sometimes in a round about way (for CLASS
nodes).
To get the column headers i am finding node having maximum attribute and node
having maximum child nodes of type ATTRIBUTE.
To get the column data, I am comparing the node attribute by attribute and
wherever they are same, I am outputting the value and where they are not
putting delimiter.
Now I am having two issues.
1) As you can see in the input xml, if within
CLASS/@Name="'Active_Directory_Details'"/OBJECT node i have a node (ATTRIBUTE
)having only one attribute with name Not_Counted. I found the node
(CLASS/OBJECT) in which CLASS has attribute with name
"'Active_Directory_Details'" having maximum ATTRIBUTE nodes. From this i got
the column header. But i missed the column with name="Not_Counted".
Keeping everything as shown in the above xsl as it is, how do i get this into
column header. And how do i use it to get the data ?
2) My dtd says that i can have any number of CLASS nodes. Here after doing all
these i feel that I have hardcoded, infact i had.
To make it generic can i dynamically do this ? Will that be very tough ?
Eagerly waiting for reply. Thanks in the anticipation that I will get some
hints and suggestions.
Regards,
Dipesh
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list