Subject: RE: [xsl] Another Grouping question From: "Michael Kay" <mike@xxxxxxxxxxxx> Date: Thu, 17 Feb 2005 12:32:45 -0000 |
$next-marker is a node, not a number, so comparing it with position() isn't going to be useful. You can use this approach in XSLT 2.0, where you would write following-sibling::*[. << $next-marker] but of course XPath 1.0 doesn't have the "<<" operator. The usual way of tackling this in 1.0 is <xsl:variable name="this" select="generate-id()"/> <xsl:for-each select="following-sibling::*[generate-id(preceding-sibling::marker[1])=$this ]"> that is, select all the following siblings whose first preceding marker is the node you started at. A recursive scan of the siblings is likely to be more efficient if there are many of them. Michael Kay http://www.saxonica.com/ > -----Original Message----- > From: Paul Clarke [mailto:pclarke@xxxxxxxxxxxxxxxx] > Sent: 17 February 2005 12:07 > To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx > Subject: [xsl] Another Grouping question > > Hello, > > Thank you to those who responded to my previous question. > > I now realise that the key to a lot of my current problems > are to create the > correct groupings. > > Before coming back to the list I spent a lot of time reading > Michael Kay's > Programmer Reference but I'm still struggling with > constructing the correct > predictate. > > I have the following XML: > > <frag> > <p/> > <p/> > <table/> > <list/> > <marker/> > <p/> > <p/> > <p/> > <p/> > <table/> > <p/> > <p/> > <table/> > <list/> > <marker/> > <p/> > <p/> > <table/> > <list/> > </frag> > > I need to create a grouping that selects a marker element > followed by all > its siblings up but not including to the next marker. > > An attempted solution is shown below, but it didn't work. (No > chuckling > please). > > I've tried to do this by creating a template that matches a > marker and then > calculating the position of the following-sibling::marker and > placing this > in a variable. I then try to group all the required elements > by testing for > the position of the context being less than the next marker. > > <xsl:template match="marker"> > <xsl:variable name="next-marker" > select="following-sibling::marker[1]"/> > <xsl:variable name="chunk" select=". | > following-sibling::*[position()< $next-marker]"/> > <div> > <mblock><xsl:apply-templates select="$chunk"/></mblock> > </div> > </xsl:template> > > Thanks > > Paul Clarke
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
[xsl] Another Grouping question, Paul Clarke | Thread | [xsl] Re: xsl-list Digest 17 Feb 20, Carl Jenkins |
RE: [xsl] Performance problem, Michael Kay | Date | [xsl] Re: xsl-list Digest 17 Feb 20, Carl Jenkins |
Month |