Subject: RE: [xsl] XSL Template Match using z:row attributes From: "Ivan Pedruzzi" <ivan@xxxxxxxxxxxxxxx> Date: Thu, 13 Dec 2001 00:21:22 -0500 |
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] 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
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] XSL Template Match using , Mike Brown | Thread | RE: [xsl] XSL Template Match using , Michael McCarty |
Re: [xsl] XSL Template Match using , Mike Brown | Date | [xsl] RE: [xsl] Re: [xsl] RE: [xsl], Kevin Burges |
Month |