|
[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message] Re: xslt 2.0: grouping flat element structures to make
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
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
|
PURCHASE STYLUS STUDIO ONLINE TODAY!Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced! Download The World's Best XML IDE!Accelerate XML development with our award-winning XML IDE - Download a free trial today! Subscribe in XML format
|

Cart








