xsl-list
[Top] [All Lists]

Re: Sorted node set and following-sibling axis

2005-08-10 10:53:25
Hi Nick,

Tempore 19:11:02, die 08/10/2005 AD, hinc in 
xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com scripsit Nick Fitzsimons 
<nick(_at_)nickfitz(_dot_)co(_dot_)uk>:

What I require is the following:

<div>
  <p>first</p>
  <p>second</p>
</div>
<div>
  <p>third</p>
  <p>last</p>
</div>

Any suggestions as to how I can achieve the desired output would be
appreciated.

I've often come across this problem and I was always inclined to believe there 
was no solution to it. But now I seem to have found a working solution.
However, as I was typing this stylesheet out, I had the faint feeling that I 
later on would regret having posted it...

here's the xsl:

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
<xsl:output method="xml" indent="yes"/>

<xsl:key name="xID" match="article" use="generate-id()"/>

<xsl:variable name="groupSize" select="2"/>

<xsl:template match="articles">
<xsl:call-template name="group">
        <xsl:with-param name="idList">
          <xsl:for-each select="article">
                <xsl:sort select="@priority" data-type="number" order="descending" 
/>
                <xsl:value-of select="generate-id()"/>
                <xsl:text>-</xsl:text>
                <xsl:if test="position() mod $groupSize=0 or position()=last()">
                        <xsl:text>|</xsl:text>
                </xsl:if>
          </xsl:for-each>
        </xsl:with-param>
 </xsl:call-template>
</xsl:template>

<xsl:template name="group">
<xsl:param name="idList"/>
<xsl:variable name="PartIdlist" select="substring-before($idList,'|')"/>
<xsl:if test="$PartIdlist">
        <div>
                <xsl:call-template name="animate">
                        <xsl:with-param name="idList" select="$PartIdlist"/>
                </xsl:call-template>
        </div>
        <xsl:call-template name="group">
                <xsl:with-param name="idList" 
select="substring-after($idList,'|')"/>
        </xsl:call-template>
</xsl:if>
</xsl:template>

<xsl:template name="animate">
<xsl:param name="idList"/>
<xsl:variable name="id" select="substring-before($idList,'-')"/>
<xsl:if test="$id">
        <xsl:apply-templates select="key('xID',$id)"/>
        <xsl:call-template name="animate">
                <xsl:with-param name="idList" 
select="substring-after($idList,'-')"/>
        </xsl:call-template>
</xsl:if>
</xsl:template>

<xsl:template match="article">
  <p><xsl:value-of select="title" /><xsl:value-of select="@priority" /></p>
</xsl:template>

</xsl:stylesheet>


regards,
--
Joris Gillis (http://users.telenet.be/root-jg/me.html)
Vincit omnia simplicitas
Keep it simple

--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--