Subject: Re: [xsl] Finding wanted nodes in complex document From: Geoff <ghank@xxxxxxxxxxx> Date: 14 Oct 2002 12:43:33 -0500 |
Thanks. For the record this is how I accomplished it: <xsl:template match="bookmarks"> <bookmarks> <xsl:apply-templates select="DL/DL/DT"/> </bookmarks> </xsl:template> <xsl:template match="DL/DL/DT"> <category> <xsl:apply-templates select="H3"/> <xsl:apply-templates select="following-sibling::DL[1]/DT"/> </category> </xsl:template> <xsl:template match="DL/DL/DL/DT"> <subcat> <xsl:apply-templates select="H3"/> </subcat> </xsl:template> <xsl:template match="H3"> <xsl:attribute name="name"> <xsl:value-of select="."/> </xsl:attribute> </xsl:template> <xsl:template match="DT"> <subcat> <xsl:attribute name="name"> <xsl:value-of select="H3"/> </xsl:attribute> </subcat> </xsl:template> On Fri, 2002-10-11 at 15:31, Joerg Heinicke wrote: > Hi Geoff, > > for such tasks it's better to use <xsl:template/> instead of > <xsl:for-each/>. With templates it's easier to walk down the tree to > different levels: > > <xsl:template match="bookmarks"> > <bookmarks> > <category> > <xsl:apply-templates select="DT/H3"/> > <xsl:apply-templates select="DL[DT/H3]"/> > </category> > </bookmarks> > </xsl:template> > > <xsl:template match="DL"> > <subcat level="{count(ancestor::DL)}"> > <xsl:apply-templates select="DT/H3"/> > <xsl:apply-templates select="DL[DT/H3]"/> > </subcat> > </xsl:template> > > <xsl:template match="H3"> > <xsl:attribute name="name"> > <xsl:value-of select="."/> > </xsl:attribute> > </xsl:template> > > I don't think that you get the expected output, but it should give you > an idea how templates work. > > I explained your error below ... > > Geoff wrote: > > I have a big,complicate, messy xml document (originally a Mozilla > > bookmark file that I made into well-formed xml) that I wish to transform > > into a lean, mean and clean xml document and I am having some trouble. > > > > > > Here is part of the document: > > <?xml version="1.0" encoding="UTF-8"?> > > <bookmarks> > > <DT> > > <H3 ADD_DATE="1032875519" ID="NC:BookmarksRoot#$f68320c5" > > LAST_MODIFIED="1033072101">Consumer Guides</H3> > > </DT> > > <DL> > > <p/> > > <DT> > > <H3 ADD_DATE="1032876491" > > ID="NC:BookmarksRoot#$f68320c6">Alabama</H3> > > </DT> > > <DL> > > <p/> > > </DL> > > <p/> > > <DT> > > <H3 ADD_DATE="1032876720" ID="NC:BookmarksRoot#$f68320dc" > > LAST_MODIFIED="1033071828">Minnesota</H3> > > </DT> > > <DL> > > What you are doing wrong? From your category <H3/> elements you always > go up to the <DL> element above (first part '../../' of the XPath in > <xsl:value-of/>). Now with the rest of the XPath you go down the tree to > the first DL/DT/H3. And this is always the <H3>Mediation</H3> element. > > Regards, > > Joerg > > > <p/> > > <DT> > > <H3 ADD_DATE="1033068848" ID="NC:BookmarksRoot#$c0ebfb0" > > LAST_MODIFIED="1033077022">Alternative Dispute > > Resolution</H3> > > </DT> > > <DL> > > <p/> > > <DT> > > <H3 ADD_DATE="1032902327" > > ID="NC:BookmarksRoot#$f6832141" > > LAST_MODIFIED="1033077446">Mediation</H3> > > </DT> > > <DL> > > <p/> > > <DT> > > <A ADD_DATE="1033077149" > > > > HREF="http://www.co.hennepin.mn.us/courts/ConcCt/ccmediation.htm" > > LAST_CHARSET="ISO-8859-1" > > LAST_MODIFIED="1033077270">Mediation in > > Conciliation Court [From the Hennepin County > > District Court]</A> > > </DT> > > </DL> > > <p/> > > <DT> > > <A ADD_DATE="1033076751" > > HREF="http://www.courts.state.mn.us/adr/adr_info.htm" > > LAST_CHARSET="ISO-8859-1" > > LAST_MODIFIED="1033076778">Minnesota Alternative > > Dispute Resolution [From the Judicial > > System]</A> > > </DT> > > <DT> > > <A ADD_DATE="1033076913" > > > > HREF="http://www.co.hennepin.mn.us/courts/Arbitration/arbmain.htm" > > LAST_CHARSET="ISO-8859-1" > > LAST_MODIFIED="1033076983" > > LAST_VISIT="1033077513">What You Need to Know > > About Arbitration [From the > > Hennepin County District Court]</A> > > </DT> > > </DL> > > <shortened/> > > > OK I told you it was messy. > > So first I want to get all the "categories" which I do like this: > > > > <xsl:for-each select="bookmarks/DL/DL/DT/H3"> > > <category> > > <xsl:attribute name="name"> > > <xsl:value-of select="."/> > > </xsl:attribute> > > </category> > > </xsl:for-each> > > This gives me a nice clean document like this: > > <category name="Alternative Dispute Resolution"/> > > <category name="Bankruptcy"/> > > <category name="Business Law"/> > > <category name="Charities"/> > > <category name="Civil Rights Law"/> > > <category name="Courts"/> > > <category name="Consumer Law"/> > > <category name="Contracts"/> > > etc.... > > Now I want to get the "subcategories" related to the "categories" which > > are at "bookmarks/DL/DL/DL/DT/H3" or "../../DL/DT/H3" when compared to > > the "category" node. > > > > So what I want is something like this: > > <category name="Alternative Dispute Resolution"> > > <subcat name="Mediation"/> > > </category> > > <category name="Bankruptcy"/> > > <category name="Business Law"> > > <subcat name="Corporations"/> > > </category> > > > > I am attempting to do this like this: > > <xsl:for-each select="bookmarks/DL/DL/DT/H3"> > > <category> > > <xsl:attribute name="name"> > > <xsl:value-of select="."/> > > </xsl:attribute> > > > > <subcat> > > <xsl:attribute name="name"> > > <xsl:value-of select="../../DL/DT/H3"/> > > </xsl:attribute> > > </subcat> > > > > </category> > > </xsl:for-each> > > But this produces this: > > <category name="Alternative Dispute Resolution"> > > <subcat name="Mediation"/> > > </category> > > <category name="Bankruptcy"> > > <subcat name="Mediation"/> > > </category> > > <category name="Business Law"> > > <subcat name="Mediation"/> > > </category> > > <category name="Charities"> > > <subcat name="Mediation"/> > > </category> > > XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] Finding wanted nodes in c, Joerg Heinicke | Thread | [xsl] Attribute as a Variable, Suvarna Gadgil |
Re: [xsl] [xsl-fo] generating the c, Michael H. Semcheski | Date | RE: [xsl] [xsl-fo] generating the c, El Hage Camille |
Month |