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

RE: XSL Template Match using z:row attributes

Subject: RE: XSL Template Match using z:row attributes
From: "Michael McCarty" <mccarty@xxxxxxxxxx>
Date: Thu, 13 Dec 2001 15:18:40 -0800
rowsetschema row attributes
Thanks, that did it.  However, it's not producing what I expected.  Sorry
for my ignorance, but here's what I'd like to do:

I'm trying to build a heirarchy based on the @LEVEL attrbiute
in my input XML.

So, if my input xml is:

<rs:data>
<z:row LEVEL='1' CATEGORYNAME='Product 1' CATEGORYID='1' PARENTID='0'
/>
<z:row LEVEL='2' CATEGORYNAME='Department A' CATEGORYID='2'
PARENTID='1' />
<z:row LEVEL='2' CATEGORYNAME='Department B' CATEGORYID='3'
PARENTID='1' />
<z:row LEVEL='3' CATEGORYNAME='Prospect' CATEGORYID='5' PARENTID='4'
/>
<z:row LEVEL='4' CATEGORYNAME='Appointment' CATEGORYID='49'
PARENTID='5' />
</rs:data>

I want to create output that's something like this:

<div level=1>
    Product 1
    <div level=2>
        Department A
    </div>
    <div level=2>
        Department B
        <div level=3>
            Prospect
            <div level=4>
                Appointment
            </div>
        </div>
    </div>
</div>

I realize that this would be easier if my imput data was already in a
traditional hierarchical format, but I'm using MS ADO XML output
format.

Any more ideas??

Thanks,

Mike =:-)

---- "Ivan Pedruzzi" <ivan@xxxxxxxxxxxxxxx> wrote:
> 
> Hi Michael,
> 
> with this small change works as you expected.
> 
> <xsl:apply-templates select="../z:row[(@LEVEL=current()/@LEVEL + 1)
> and
> (@PARENTID=current()/@CATID) and not(current()=preceding-sibling::*)]"/>
> 
> Ivan Pedruzzi
> eXcelon Corporation
> http://www.stylusstudio.com
> 
> 
> 
> > -----Original Message-----
> > From: owner-xsl-list@xxxxxxxxxxxxxxxxxxxxxx 
> > [mailto:owner-xsl-list@xxxxxxxxxxxxxxxxxxxxxx] On Behalf Of 
> > Michael McCarty
> > Sent: Wednesday, December 12, 2001 11:22 PM
> > To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> > Subject: RE:  XSL Template Match using z:row attributes
> > 
> > 
> > Ok, you might need to ignore my previous reply.  I've been 
> > playing with the XSL and (with the help of that Xselerator 
> > tool) I think I understand better, but not completly.
> > 
> > My problem is that I'm getting duplicate output.  The XML 
> > (trimmed) is:
> > 
> > <?xml-stylesheet type="text/xsl" href="CategoryTree2.xsl" ?> 
> > <xml xmlns:rs='urn:schemas-microsoft-com:rowset'
> > 	 xmlns:z='#RowsetSchema'>
> > <rs:data>
> > 	<z:row LEVEL='1' CATNAME='Level 1' CATID='1' PARENTID='0'
> />
> > 	<z:row LEVEL='2' CATNAME='Level 2' CATID='3' PARENTID='1'
> />
> > 	<z:row LEVEL='2' CATNAME='Level 2' CATID='4' PARENTID='1'
> />
> > 	<z:row LEVEL='3' CATNAME='Level 3' CATID='5' PARENTID='4'
> />
> > 	<z:row LEVEL='3' CATNAME='Level 3' CATID='6' PARENTID='4'
> />
> > 	<z:row LEVEL='1' CATNAME='Level 1' CATID='21' PARENTID='0'
> />
> > 	<z:row LEVEL='2' CATNAME='Level 2' CATID='22' 
> > PARENTID='21' /> </rs:data> </xml>
> > 
> > The XSL is:
> > 
> > <?xml version='1.0'?>
> > <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
> 
> > 		xmlns:rs='urn:schemas-microsoft-com:rowset'
> > 		xmlns:z='#RowsetSchema'	version="1.0">
> > 
> > <xsl:template match="/">
> > 	<HTML>
> > 	<BODY topmargin="0" leftmargin="0">
> > 	<xsl:apply-templates select="/xml/rs:data"/>
> > 	</BODY>
> > 	</HTML>
> > </xsl:template>
> > 
> > <xsl:template match="z:row">
> > <div class="clsItem">
> > 	CatId_<xsl:value-of select="@CATID"/> - 
> > 	<b><xsl:value-of select="@CATNAME"/></b> - 
> > 	Parent_<xsl:value-of select="@PARENTID"/>
> >   <div id="container">
> > 	<xsl:apply-templates select="../z:row[(@LEVEL=current()/@LEVEL
> > + 1) and (@PARENTID=current()/@CATID)]"/>
> >   </div>
> > </div>
> > </xsl:template>
> > </xsl:stylesheet> 
> > 
> > Here's what I get:
> > 
> > CatId_1 - Level 1 - Parent_0
> > CatId_3 - Level 2 - Parent_1
> > CatId_4 - Level 2 - Parent_1
> > CatId_5 - Level 3 - Parent_4
> > CatId_6 - Level 3 - Parent_4
> > CatId_3 - Level 2 - Parent_1   <!-- duplicate -->
> > CatId_4 - Level 2 - Parent_1   <!-- duplicate -->
> > CatId_5 - Level 3 - Parent_4   <!-- duplicate -->
> > CatId_6 - Level 3 - Parent_4   <!-- duplicate -->
> > CatId_5 - Level 3 - Parent_4   <!-- duplicate -->
> > CatId_6 - Level 3 - Parent_4   <!-- duplicate -->
> > CatId_21 - Level 1 - Parent_0
> > CatId_22 - Level 2 - Parent_21
> > CatId_22 - Level 2 - Parent_21   <!-- duplicate -->
> > 
> > I think I'm going crazy learning this... =:-)
> > As always, your help is greatly appreciated.
> > 
> > Michael =:-)
> > 
> > ---- TSchutzerWeissmann@xxxxxxxxxxxxxxxx wrote:
> > > Michael wrote:
> > > 
> > > >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.
> > > 
> > > Hi Michael,
> > > 
> > > the problem here is something like this: your input isn't 
> > nested, and 
> > > you want to nest it according to a LEVEL attribute.
> > > There are three problems with your approach.
> > > 
> > > 1. You're doing the same thing in 5 different templates. 
> > Try recursion 
> > > instead, then you don't need to worry about how many levels 
> > you have.
> > > 
> > > 
> > > 2. The location paths in your <xsl:apply-templates>.
> > >  You use paths fine when you select attributes, so I assume you're
> 
> > > using the full path (xml/rs:data/z:row) here because you 
> > want to get 
> > > up out of your
> > > current context (a qualified z:row).
> > > To make your paths work, either use /xml/rs:data/z:row - 
> > the "/" will
> > > get
> > > you back to the document node, or use ../z:row[@LEVEL=2]- 
> > in longhand
> > > that's
> > > parent::node()/z:row[@LEVEL=2]. It's just like file directories.
> > > 
> > > BUT: it still won't work...
> > > 3. Matching children with parents.
> > > To get the nesting right you have to put the right children 
> > with the 
> > > right parents. In your input you have CATEGORYID and 
> > PARENTCATEGORYID. 
> > > A revised
> > > path, still using your approach would be
> > > 	"../z:row[(@LEVEL=2) and (@PARENTCATEGORYID =
> > > current()/@CATEGORYID)"
> > > or even 
> > > 	"../z:row[(@LEVEL=current()/@LEVEL + 1) and (@PARENTCATEGORYID
> > > =
> > > current()/@CATEGORYID)"
> > > You need current() not . because inside a predicate expression
> . is
> > > the node
> > > being evaluated, not the node matched by the current template.
> > > 
> > > Only recurse...
> > > Tom S-W
> > > 
> > >  XSL-List info and archive:  
> > http://www.mulberrytech.com/xsl/xsl-list
> > > 
> > > 
> > 
> > 
> > __________________________________________________
> > 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
> > 
> > 
> 
> 
>  XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
> 
> 

__________________________________________________
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

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.