[XSL-LIST Mailing List Archive Home] [By Thread] [By Date]

[xsl] XSL Template Match using z:row attributes


Subject: [xsl] XSL Template Match using z:row attributes
From: "Michael McCarty" <mccarty@xxxxxxxxxx>
Date: Tue, 11 Dec 2001 19:47:15 -0800

I'm kind of new to XSL and am having trouble.  I guess I don't fully
understand the way templates are matched or applied.  Any help is greatly
appreciated.  I also don't know if the problem is in the namespaces or
do I fully understand those.

My XML file is in the format that MS ADO produces from a recordset with
<rs:data> and <z:row> elements (sorry for the long file/word wrapping):

*************** File: CategoryTree.xml *************** 
<?xml-stylesheet type="text/xsl" href="CategoryTree.xsl" ?>

<xml xmlns:s='uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882'
	xmlns:dt='uuid:C2F41010-65B3-11d1-A29F-00AA00C14882'
	xmlns:rs='urn:schemas-microsoft-com:rowset'
	xmlns:z='#RowsetSchema'>
<s:Schema id='RowsetSchema'>
	<s:ElementType name='row' content='eltOnly'>
		<s:AttributeType name='LEVEL' rs:number='1' rs:nullable='true'
rs:writeunknown='true'>
			<s:datatype dt:type='number' rs:dbtype='varnumeric'
dt:maxLength='20' rs:scale='0' rs:precision='38'/>
		</s:AttributeType>
		<s:AttributeType name='CATEGORYNAME' rs:number='2' rs:writeunknown='true'>
			<s:datatype dt:type='string' rs:dbtype='str'
dt:maxLength='50' rs:maybenull='false'/>
		</s:AttributeType>
		<s:AttributeType name='CATEGORYID' rs:number='3' rs:writeunknown='true'>
			<s:datatype dt:type='number' rs:dbtype='numeric'
dt:maxLength='19' rs:scale='0' rs:precision='10' rs:fixedlength='true'
			 rs:maybenull='false'/>
		</s:AttributeType>
		<s:AttributeType name='PARENTCATEGORYID' rs:number='4'
rs:writeunknown='true'>
			<s:datatype dt:type='number' rs:dbtype='numeric'
dt:maxLength='19' rs:scale='0' rs:precision='10' rs:fixedlength='true'
			 rs:maybenull='false'/>
		</s:AttributeType>
		<s:AttributeType name='CHILDSORTORDER' rs:number='5'
rs:nullable='true' rs:writeunknown='true'>
			<s:datatype dt:type='number' rs:dbtype='numeric'
dt:maxLength='19' rs:scale='0' rs:precision='4' rs:fixedlength='true'/>
		</s:AttributeType>
		<s:extends type='rs:rowbase'/>
	</s:ElementType>
</s:Schema>
<rs:data>
	<z:row LEVEL='1' CATEGORYNAME='Product 1' CATEGORYID='1' PARENTCATEGORYID='0'
CHILDSORTORDER='10'/>
	<z:row LEVEL='2' CATEGORYNAME='Department A' CATEGORYID='2' PARENTCATEGORYID='1'
CHILDSORTORDER='20'/>
	<z:row LEVEL='2' CATEGORYNAME='Department B' CATEGORYID='3' PARENTCATEGORYID='1'
CHILDSORTORDER='30'/>
	<z:row LEVEL='2' CATEGORYNAME='Department C' CATEGORYID='4' PARENTCATEGORYID='1'
CHILDSORTORDER='40'/>
	<z:row LEVEL='3' CATEGORYNAME='Prospect' CATEGORYID='5' PARENTCATEGORYID='4'
CHILDSORTORDER='50'/>
	<z:row LEVEL='4' CATEGORYNAME='Appointment' CATEGORYID='49' PARENTCATEGORYID='5'
CHILDSORTORDER='51'/>
	<z:row LEVEL='4' CATEGORYNAME='Follow Up' CATEGORYID='50' PARENTCATEGORYID='5'
CHILDSORTORDER='52'/>
	<z:row LEVEL='4' CATEGORYNAME='Invitation' CATEGORYID='51' PARENTCATEGORYID='5'
CHILDSORTORDER='53'/>
	<z:row LEVEL='4' CATEGORYNAME='Referral' CATEGORYID='52' PARENTCATEGORYID='5'
CHILDSORTORDER='54'/>
	<z:row LEVEL='3' CATEGORYNAME='Book' CATEGORYID='6' PARENTCATEGORYID='4'
CHILDSORTORDER='60'/>
	<z:row LEVEL='4' CATEGORYNAME='Appointment' CATEGORYID='41' PARENTCATEGORYID='6'
CHILDSORTORDER='61'/>
	<z:row LEVEL='4' CATEGORYNAME='Follow Up' CATEGORYID='42' PARENTCATEGORYID='6'
CHILDSORTORDER='62'/>
	<z:row LEVEL='4' CATEGORYNAME='Invitation' CATEGORYID='43' PARENTCATEGORYID='6'
CHILDSORTORDER='63'/>
	<z:row LEVEL='4' CATEGORYNAME='Referral' CATEGORYID='44' PARENTCATEGORYID='6'
CHILDSORTORDER='64'/>
	<z:row LEVEL='1' CATEGORYNAME='Product 2' CATEGORYID='21' PARENTCATEGORYID='0'
CHILDSORTORDER='100'/>
	<z:row LEVEL='2' CATEGORYNAME='Department B' CATEGORYID='22'
PARENTCATEGORYID='21' CHILDSORTORDER='120'/>
	<z:row LEVEL='2' CATEGORYNAME='Department A' CATEGORYID='23'
PARENTCATEGORYID='21' CHILDSORTORDER='110'/>
	<z:row LEVEL='2' CATEGORYNAME='Department C' CATEGORYID='24'
PARENTCATEGORYID='21' CHILDSORTORDER='130'/>
	<z:row LEVEL='3' CATEGORYNAME='Prospect' CATEGORYID='25' PARENTCATEGORYID='24'
CHILDSORTORDER='140'/>
	<z:row LEVEL='4' CATEGORYNAME='Appointment' CATEGORYID='53' PARENTCATEGORYID='25'
CHILDSORTORDER='141'/>
	<z:row LEVEL='4' CATEGORYNAME='Follow Up' CATEGORYID='54' PARENTCATEGORYID='25'
CHILDSORTORDER='142'/>
	<z:row LEVEL='4' CATEGORYNAME='Invitation' CATEGORYID='55' PARENTCATEGORYID='25'
CHILDSORTORDER='143'/>
	<z:row LEVEL='4' CATEGORYNAME='Referral' CATEGORYID='56' PARENTCATEGORYID='25'
CHILDSORTORDER='144'/>
	<z:row LEVEL='3' CATEGORYNAME='Book' CATEGORYID='26' PARENTCATEGORYID='24'
CHILDSORTORDER='150'/>
	<z:row LEVEL='4' CATEGORYNAME='Appointment' CATEGORYID='45' PARENTCATEGORYID='26'
CHILDSORTORDER='151'/>
	<z:row LEVEL='4' CATEGORYNAME='Follow Up' CATEGORYID='46' PARENTCATEGORYID='26'
CHILDSORTORDER='152'/>
	<z:row LEVEL='4' CATEGORYNAME='Invitation' CATEGORYID='47' PARENTCATEGORYID='26'
CHILDSORTORDER='153'/>
	<z:row LEVEL='4' CATEGORYNAME='Referral' CATEGORYID='48' PARENTCATEGORYID='26'
CHILDSORTORDER='154'/>
</rs:data>
</xml>
********** End of File: CategoryTree.xml *************** 

*************** File: CategoryTree.xsl *************** 
<?xml version='1.0'?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">

<xsl:template match="/">
	<HTML>
	<BODY topmargin="0" leftmargin="0">
	<xsl:apply-templates select="xml/rs:data/z:row[@LEVEL='1']"/>
	</BODY>
	</HTML>
</xsl:template>

<xsl:template match="xml/rs:data/z:row[@LEVEL='1']">
	<div class="clsItem">
		<span class="clsSpace" type="img"><span class="clsCollapse">+</span></span><span
class="clsLabel" type="label">
			<xsl:attribute name="id"><xsl:value-of select="@CATEGORYID"/></xsl:attribute>
			<xsl:attribute name="parentid"><xsl:value-of
select="@PARENTCATEGORYID"/></xsl:attribute>
			<xsl:attribute name="title"><xsl:value-of select="@CATEGORYNAME"/></xsl:attribute>
			<xsl:value-of select="@CATEGORYNAME"/>
		</span>
	  <div>
	<xsl:apply-templates select="xml/rs:data/z:row[@LEVEL='2']"/>
	  </div>
	</div>
</xsl:template>

<xsl:template match="xml/rs:data/z:row[@LEVEL='2']">
	<div class="clsItem">
		<span class="clsSpace" type="img"><span class="clsCollapse">+</span></span><span
class="clsLabel" type="label">
			<xsl:attribute name="id"><xsl:value-of select="@CATEGORYID"/></xsl:attribute>
			<xsl:attribute name="parentid"><xsl:value-of
select="@PARENTCATEGORYID"/></xsl:attribute>
			<xsl:attribute name="title"><xsl:value-of select="@CATEGORYNAME"/></xsl:attribute>
			<xsl:value-of select="@CATEGORYNAME"/>
		</span>
	  <div>
	<xsl:apply-templates select="xml/rs:data/z:row[@LEVEL='3']"/>
	  </div>
	</div>
</xsl:template>

<xsl:template match="xml/rs:data/z:row[@LEVEL='3']">
	<div class="clsItem">
		<span class="clsSpace" type="img"><span class="clsCollapse">+</span></span><span
class="clsLabel" type="label">
			<xsl:attribute name="id"><xsl:value-of select="@CATEGORYID"/></xsl:attribute>
			<xsl:attribute name="parentid"><xsl:value-of
select="@PARENTCATEGORYID"/></xsl:attribute>
			<xsl:attribute name="title"><xsl:value-of select="@CATEGORYNAME"/></xsl:attribute>
			<xsl:value-of select="@CATEGORYNAME"/>
		</span>
	  <div>
	<xsl:apply-templates select="xml/rs:data/z:row[@LEVEL='4']"/>
	  </div>
	</div>
</xsl:template>

<xsl:template match="xml/rs:data/z:row[@LEVEL='4']">
	<div class="clsItem">
		<span class="clsSpace" type="img"><span class="clsCollapse">+</span></span><span
class="clsLabel" type="label">
			<xsl:attribute name="id"><xsl:value-of select="@CATEGORYID"/></xsl:attribute>
			<xsl:attribute name="parentid"><xsl:value-of
select="@PARENTCATEGORYID"/></xsl:attribute>
			<xsl:attribute name="title"><xsl:value-of select="@CATEGORYNAME"/></xsl:attribute>
			<xsl:value-of select="@CATEGORYNAME"/>
		</span>
	  <div>
	<xsl:apply-templates select="xml/rs:data/z:row[@LEVEL='5']"/>
	  </div>
	</div>
</xsl:template>

</xsl:stylesheet> 
********** End of File: CategoryTree.xsl *************** 


You can see that the LEVEL attribute of each z:row should determine the
nested heirarchy.  What I expect to get, wrapped in <DIV> tags hierarchically,
is something like this:

+ Product 1 
	+ Department A 
	+ Department B 
	+ Department C 
		+ Prospect 
			+ Appointment 
			+ Follow Up 
			+ Invitation 
			+ Referral 
		+ Book 
			+ Appointment 
			+ Follow Up 
			+ Invitation 
			+ Referral 
+ Product 2 
	+ Department B 
	+ Department A 
	+ Department C 
		+ Prospect 
			+ Appointment 
			+ Follow Up 
			+ Invitation 
			+ Referral 
		+ Book 
			+ Appointment 
			+ Follow Up 
			+ Invitation 
			+ Referral 


What I am getting is this:

+ Product 1 
+ Product 2 

It appears that I get the LEVEL='1', but not the remaining.  I wonder
if there's a way around 'hard coding' the LEVEL's in case I have more
than 4 or 5..??  I know it would be easier if my XML was is a different
format, but I'm forced to use the MS ADO export format.  Thank you, in
advance, for your help.

Michael =:-)

__________________________________________________
FREE voicemail, email, and fax...all in one place.
Sign Up Now! http://www.onebox.com


 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list



Current Thread
Keywords