Subject: Re: [xsl] alphabetic set of xsl:result-document From: James Cummings <cummings.james@xxxxxxxxx> Date: Mon, 22 Aug 2005 15:54:07 +0100 |
On 8/22/05, David Carlisle <davidc@xxxxxxxxx> wrote: > > You probably don't need both the key (the xslt1 way of grouping) and > for-each-group. > > after > <xsl:for-each-group select="//div[@type='psalm']//w" group-by="lower-case(.)"> > select="key('word', lower-case(.)" > is probably the same thing as > select="current-group()" > > so you are probably making saxon index everything twice. > > If I understand you correctly you just need to insert an extra layer of > grouping, just grouping on the first letter: > > <xsl:for-each-group select="//div[@type='psalm']//w" > group-by="lower-case(substring(.,1,1)"> > <xsl:result-file.... > > <xsl:for-each-group select="current-group()" group-by="lower-case(.)"> > <xsl:sort select="lower-case(.)" /> Ok, my brain just isn't working today... Let's expand this. Say I have an xml snippet of: ------ <div> <p id="p1"> <w>This</w> <w>is</w> <w>a</w> <w>test</w>, <w>only</w> <w>a</w> <w>test</w>. <w>This</w> <w>is</w> <w>a</w> <w>test</w>, <w>only</w> <w>a</w> <w>test</w>. </p> <p id="p2"> <w>This</w> <w>is</w> <w>a</w> <w>test</w>, <w>only</w> <w>a</w> <w>test</w>. <w>This</w> <w>Is</w> <w>a</w> <w>boring</w> <w>test</w>, <w>only</w> <w>a</w> <w>test</w>. <w>This</w> <w>is</w> <w>a</w> <w>simplified</w> <w>Test</w>, <w>only</w> <w>a</w> <w>test</w>. </p> </div> ----- If I abandon key() but still want to produce an word index broken down by alphabetic letter, are you saying I should do something along the (currently-broken) lines of: ----- <xsl:template match="/"> <xsl:for-each-group select="//w" group-by="lower-case(.)"> <xsl:sort select="lower-case(.)"/> <xsl:variable name="pID" select="ancestor::p/@id"/> <xsl:for-each-group select="lower-case(.)" group-by="lower-case(substring(.,1,1))"> <xsl:sort select="lower-case(substring(.,1,1))"/> <xsl:result-document href="FILE-{lower-case(substring(.,1,1))}.html"> <html> <body> <h1>Ouput for <xsl:value-of select="substring(lower-case(.),1,1)" /></h1> <div> <xsl:for-each-group select="current-group()" group-by="lower-case(.)"> <a href="htmlversion.html#{$pID}"><xsl:value-of select="current-group()" /></a> </xsl:for-each-group> </div> </body> </html> </xsl:result-document> </xsl:for-each-group> </xsl:for-each-group> </xsl:template> ----- This of course, doesn't work, because it is trying to write multiple output to the same URI. As you know, this grouping stuff has always confused me. :-( The actual xslt I've been hacking has an x:replace() function replacing certain characters (u/v i/y thorn/th) for comparison purchases based on a previous answer you once gave me ;-) best, -James -- James Cummings, Cummings dot James at GMail dot com
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] alphabetic set of xsl:res, David Carlisle | Thread | Re: [xsl] alphabetic set of xsl:res, David Carlisle |
RE: [xsl] () equivalent to () ?, Michael Kay | Date | Re: [xsl] () equivalent to () ?, andrew welch |
Month |