Subject: Re: [xsl] xslt 2.0: grouping flat element structures to make lists From: JBryant@xxxxxxxxx Date: Wed, 25 May 2005 14:30:21 -0500 |
Hi, Derek, The trick is picking just the bits you want in the list. I took your sample lists and made a sample XML file and a stylesheet to demonstrate one way to do it (with apply-templates). Here's the XML file (with non-list elements intermingled with the lists): <?xml version="1.0" encoding="UTF-8"?> <lists> <par class="Listbegin">Fruit</par> <par class="Listitem">Apple</par> <par class="Listitem">Orange</par> <par class="Listitem">Pear</par> <something>thing1</something> <something>thing2</something> <par class="Listbegin">Colours</par> <par class="Listitem">Red</par> <par class="Listitem">Green</par> <par class="Listitem">Blue</par> </lists> And here's the XSL: <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="lists"> <lists> <xsl:for-each-group select="*" group-starting-with="par[@class='Listbegin']"> <list> <xsl:apply-templates select="current-group()/self::par[@class='Listbegin']|current-group()/self::par[@class='Listitem']"/> </list> </xsl:for-each-group> </lists> </xsl:template> <xsl:template match="par[@class='Listbegin']"> <head><xsl:value-of select="."/></head> </xsl:template> <xsl:template match="par[@class='Listitem']"> <item><xsl:value-of select="."/></item> </xsl:template> </xsl:stylesheet> And here's the resulting output: <?xml version="1.0" encoding="UTF-8"?> <lists> <list> <head>Fruit</head> <item>Apple</item> <item>Orange</item> <item>Pear</item> </list> <list> <head>Colours</head> <item>Red</item> <item>Green</item> <item>Blue</item> </list> </lists> Does that come near the mark or did I misunderstand? (And this time I remembered to use the self axis. Thanks again to David Carlisle.) Jay Bryant Bryant Communication Services (presently consulting at Synergistic Solution Technologies) "Derek Revill" <derek@xxxxxxxxxxxxxxxxxx> 05/25/2005 01:07 PM Please respond to xsl-list@xxxxxxxxxxxxxxxxxxxxxx To <xsl-list@xxxxxxxxxxxxxxxxxxxxxx> cc Subject [xsl] xslt 2.0: grouping flat element structures to make lists Hello Using XSLT 2.0 (running Saxon 8.4) I am grappling with a pretty standard grouping issue, attempting to utilize some of XSLT v2 grouping possibilities but with no success (reading the W3C spec and a scan of the archive haven't proved helpful, MK book is on order!). Mid flow I have: .. .. <par class="Listbegin">Fruit</par> <par class="Listitem>Apple</par> <par class="Listitem>Orange</par> <par class="Listitem>Pear</par> <par class="Listbegin">Colours</par> <par class="Listitem>Red</par> <par class="Listitem>Green</par> <par class="Listitem>Blue</par> .. .. I just need to output .. .. <list> <head>Fruit</head> <item>Apple</item> <item>Orange</item> <item>Pear</item> </list> <list> <head>Colours</head> <item>Red</item> <item>Green</item> <item>Blue</item> </list> Note: I'm midway through processing any section when I encounter the <par class="Listbegin">. The signal that a list has ended can be any following-sibling that isn't <par class="Listitem>..</par> or the end of the parent element I'm in. Of course, lists don't always come in pairs like above. Should I try to match on the <par class="Listbegin"> then scoop-up all relevant following nodes, which was my strategy up to now? Haven't been able to find a way to scoop-up only the following nodes that are relevant. Any advice gratefully received. Numerous attempts using for-each-group and various group-by strategies have been fruitless, probably I just haven't quite grasped it! Thanks Derek Revill
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] How to escape "$" in outp, Wendell Piez | Thread | RE: [xsl] xslt 2.0: grouping flat e, Derek Revill |
RE: [xsl] How to trim leading and t, JBryant | Date | Re: [xsl] How to escape "$" in outp, Wendell Piez |
Month |