Altova Mailing List Archives>Archive Index >comp.text.xml Archive Home >Recent entries >Thread Prev - Help needed with transition [Thread Next] Re: Help needed with transitionTo: NULL Date: 11/19/2008 12:21:00 AM Hvid Hat wrote: > Hi > > Can anyone help me with the following transition? My problem is how to create > a fieldset each time I run into a heading and then include the following text > elements within the fieldset. > Don't think of it that way it will lead to pain, xslt doesn't assume a processing order so it is hard to say stop one fieldset and start another when you see a heading. Instead give a global description: you want to group all the fields in order, with groups starting at each heading. the XSLT2 version follws immediately from this, and teh XSLT 1 version is a standard rewriting of that to the muenchian grouping idiom, which looks a bit srange but google will show dozens of examples. <x> <field> <heading>First heading</heading> </field> <field> <text>Lorem</text> </field> <field> <text>Ipsum</text> </field> <field> <heading>Second heading</heading> </field> <field> <text>Dolor</text> </field> <field> <text>Sit</text> </field> <field> <heading>Third heading</heading> </field> <field> <text>Amet</text> </field> </x> <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:strip-space elements="*"/> <xsl:output indent="yes"/> <xsl:template match="x"> <xsl:for-each-group select="field" group-starting-with="field[heading]"> <fieldset> <xsl:apply-templates select="current-group()"/> </fieldset> </xsl:for-each-group> </xsl:template> <xsl:template match="heading"> <legend><xsl:value-of select="."/></legend> </xsl:template> <xsl:template match="text"> <p><xsl:value-of select="."/></p> </xsl:template> </xsl:stylesheet> or if you are still using xslt1: <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:strip-space elements="*"/> <xsl:output indent="yes"/> <xsl:key name="f" match="text" use="(../preceding-sibling::field/heading)[last()]"/> <xsl:template match="x"> <xsl:for-each select="field/heading"> <fieldset> <xsl:apply-templates select=".|key('f',.)"/> </fieldset> </xsl:for-each> </xsl:template> <xsl:template match="heading"> <legend><xsl:value-of select="."/></legend> </xsl:template> <xsl:template match="text"> <p><xsl:value-of select="."/></p> </xsl:template> </xsl:stylesheet> > <?xml version="1.0" encoding="ISO-8859-1"?> > <field> > <heading>First heading</heading> > </field> > <field> That input isn't well formed so I put in a surrounding x element > -- http://dpcarlisle.blogspot.com | ||||||
| Company | Legal | Press | Partners | Careers | Sitemap | Contact Us | Altova Blog | Mobile | Full Site | |||
|
