Subject: RE: [xsl] counting nodes before a certain node From: "Michael Kay" <mike@xxxxxxxxxxxx> Date: Tue, 1 Dec 2009 23:58:26 -0000 |
Right, so you don't actually want to count the nodes between the two book elements, you only asked to count them because you thought that was a means to an end? I think what you probably want is something like <xsl:template match="books"> <xsl:for-each-group select="*" group-starting-with="book"> <elem1> <xsl:copy-of select="current-group()/(book/title, notes)"/> </elem1> </xsl:for-each-group> </xsl:template> Regards, Michael Kay http://www.saxonica.com/ http://twitter.com/michaelhkay > -----Original Message----- > From: a kusa [mailto:akusa8@xxxxxxxxx] > Sent: 01 December 2009 22:02 > To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx > Subject: Re: [xsl] counting nodes before a certain node > > Hi > > Thank you for all your response. I am sorry that I haven't > been able to express my problem clearly. I will try it again. > What I need is this: > My input: > <books> > <book> > <title>First title</title> > </book> > <notes>The following books talk about history.</notes> > <notes>For further information please log on to </notes> > <notes>Thank you for choosing.. </notes> <book> > <title>Abraham Lincoln </title> </book> > > <authors> > sample data > > </authors> > <notes>Please call... </notes> > <notes>Copyright Information </notes> > <book> > > sample data > </book> > </books> > > When I am in the template called book, I want to display all > notes after the first book up to the second book element. > > So in my XSLT when I say: > > <xsl:template match="books"> > <xsl:apply-templates select="book"/> > </xsl:template> > <xsl:template match="book"> > <elem1> > <title> > <xsl:apply-templates select="title[1]"/> > </title> > <notes> > <xsl:apply-templates > select="following::notes[following-sibling::*[1][self::book]]"/> > </notes> > </elem1> > </xsl:template> > > It selects only the last <notes> element and it selects both > the notes elements right after <book> and after <author>. > Output: > <elem1> > <title>First title</title> > <notes>Thank you for choosing.. Copyright Information > </notes> </elem1> <elem1> > <title>Abraham Lincoln </title> > <notes>Copyright Information </notes> > </elem1> > <elem1> > <title/> > <notes/> > </elem1> > > My desired output is: > > <elem1> > <title>First title</title> > <notes>The following books talk about history.For > further information please log on to. Thank you for > choosing.. </notes> </elem1> <elem1> > <title>Abraham Lincoln </title> > <notes>Please call... Copyright Information </notes> > </elem1> <elem1> > <title/> > <notes/> > </elem1> > > Please let me know if I am more clear now. > > > > On Mon, Nov 30, 2009 at 6:01 PM, Wendell Piez > <wapiez@xxxxxxxxxxxxxxxx> wrote: > > Hi, > > > > At 06:02 PM 11/30/2009, Mike wrote: > >> > >> Given XSLT 2.0, you can select two elements $a and $b, and > then the > >> number of elements between these two is > >> > >> count($b/preceding-sibling::*) - count($b/preceding-sibling::*) - 1 > >> > >> This is probably more efficient than > >> > >> count(*[. >> $a and $b >> .]) > >> > >> but you can use that if it's more convenient. > > > > This answers the question as posed. > > > > A better solution, however, might be available if you > specified your > > count differently. > > > > For example, you might be better off asking "how do I count notes > > elements that do not have book or author element > ancestors", or "how > > do I count notes elements that are directly inside books, but not > > deeper". (From your problem statement it's impossible to > know whether > > one of these might not be the > > case.) > > > > Cheers, > > Wendell > > > >> > -----Original Message----- > >> > From: a kusa [mailto:akusa8@xxxxxxxxx] > >> > Sent: 30 November 2009 22:40 > >> > To: xsl-list > >> > Subject: [xsl] counting nodes before a certain node > >> > > >> > Hi > >> > > >> > How do I count nodes up to a certain point in XSLT? > >> > > >> > Example: > >> > > >> > My xml file looks like this: > >> > > >> > <books> > >> > <book> > >> > <title>First title</book> > >> > </book> > >> > <notes>The following books talk about history.</notes> > <notes>For > >> > further information please log on to </notes> > <notes>Thank you for > >> > choosing.. </notes> <book> <title>Abraham Lincoln > </title> </book> > >> > > >> > <authors> > >> > sample data > >> > > >> > </authors> > >> > <notes>Please call... </notes> > >> > <notes>Copyright Information </notes> <book> > >> > > >> > sample data > >> > </book> > >> > </books> > >> > > >> > In my XSLT file, I want to count all <notes> just before > the second > >> > <book> element but immediately after the first book > element or just > >> > after <authors>. > >> > > >> > How do I count all the notes elements here? > > > > > > > ====================================================================== > > Wendell Piez > mailto:wapiez@xxxxxxxxxxxxxxxx > > Mulberry Technologies, Inc. > http://www.mulberrytech.com > > 17 West Jefferson Street Direct Phone: > 301/315-9635 > > Suite 207 Phone: > 301/315-9631 > > Rockville, MD 20850 Fax: > 301/315-8285 > > > ---------------------------------------------------------------------- > > Mulberry Technologies: A Consultancy Specializing in SGML and XML > > > ======================================================================
Current Thread |
---|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] counting nodes before a c, a kusa | Thread | Re: [xsl] counting nodes before a c, a kusa |
Re: [xsl] counting nodes before a c, a kusa | Date | [xsl] Why doesn't this simple XSLT , ohaya |
Month |