[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message]

How to get unique attribute values for nodes having fe

Subject: How to get unique attribute values for nodes having few constraint
From: Dipesh Khakhkhar <dkhakhkh@xxxxxxxxxxxxxxx>
Date: Tue, 2 Sep 2003 15:54:28 -0400
xsl get unique attribute
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>&#10;</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>&#10;</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>&#10;</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>&#10;</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[@NAME=current()/@NAME])"/>
			<xsl:if test="position()!=last()">`</xsl:if>
		</xsl:for-each>
		<xsl:text>&#10;</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[@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>&#10;</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[@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>&#10;</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[@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>&#10;</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


Current Thread

PURCHASE STYLUS STUDIO ONLINE TODAY!

Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced!

Buy Stylus Studio Now

Download The World's Best XML IDE!

Accelerate XML development with our award-winning XML IDE - Download a free trial today!

Don't miss another message! Subscribe to this list today.
Email
First Name
Last Name
Company
Subscribe in XML format
RSS 2.0
Atom 0.3
Site Map | Privacy Policy | Terms of Use | Trademarks
Free Stylus Studio XML Training:
W3C Member
Stylus Studio® and DataDirect XQuery ™are products from DataDirect Technologies, is a registered trademark of Progress Software Corporation, in the U.S. and other countries. © 2004-2013 All Rights Reserved.