xsl-list
[Top] [All Lists]

Re: [xsl] [XSLT2] Some common, generic grouping problems

2006-06-29 15:54:31

interesting little challenge...

<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>

<xsl:output indent="yes"/>

<xsl:template match="root">
  <root>
  <xsl:for-each-group select="*"
  group-starting-with="*[(_at_)color=('dark-red','light-red')]">
    <xsl:choose>
      <xsl:when test="@color=('light-red')"/>
      <xsl:when test="@color=('dark-red')">
      <red>
        <xsl:copy-of
  select="current-group(),current-group()[last()]/following-sibling::*"/>
  </red>
      </xsl:when>
      <xsl:otherwise>
      <xsl:copy-of select="current-group()"/>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:for-each-group>
  </root>
</xsl:template>
</xsl:stylesheet>


<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>

<xsl:output indent="yes"/>

<xsl:template match="root">
  <root>
  <xsl:for-each-group select="*"
  group-starting-with="*[(_at_)color=('dark-red')]">
    <xsl:choose>
      <xsl:when test="@color=('dark-red')">
      <xsl:variable name="l"
  select="current-group()[(_at_)color='red'][last()]"/>
  <red>
    <xsl:copy-of select="current-group()[. &lt;&lt; $l],$l"/>
    </red>
    <xsl:copy-of select="current-group()[. >> $l]"/>
      </xsl:when>
      <xsl:otherwise>
      <xsl:copy-of select="current-group()"/>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:for-each-group>
  </root>
</xsl:template>
</xsl:stylesheet>




<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>

<xsl:output indent="yes"/>

<xsl:template match="root">
  <root>
  <xsl:for-each-group select="*"
  group-adjacent="(replace(@color,'dark-',''),1)[1]">
    <xsl:choose>
      <xsl:when test="@color">
      <xsl:for-each-group select="current-group()"
  group-starting-with="*[starts-with(@color,'dark-')]">
  <xsl:element name="{replace(@color,'dark-','')}">
    <xsl:copy-of select="current-group()"/>
    </xsl:element>
    </xsl:for-each-group>
      </xsl:when>
      <xsl:otherwise>
      <xsl:copy-of select="current-group()"/>   
      </xsl:otherwise>
    </xsl:choose>
  </xsl:for-each-group>
  </root>
</xsl:template>
</xsl:stylesheet>




$ saxon8 gp1.xml gp1.xsl
<?xml version="1.0" encoding="UTF-8"?>
<root>
   <arbitrary/>
   <red>
      <elem color="dark-red"/>
      <elem color="red"/>
      <arbitrary color="none"/>
      <elem color="red"/>
      <elem color="light-red"/>
      <arbitrary/>
   </red>
</root>



$ saxon8 gp2.xml gp2.xsl
<?xml version="1.0" encoding="UTF-8"?>
<root>
   <arbitrary/>
   <red>
      <elem color="dark-red"/>
      <elem color="red"/>
      <arbitrary/>
      <elem color="red"/>
   </red>
   <arbitrary/>
   <red>
      <elem color="dark-red"/>
      <elem color="red"/>
      <arbitrary/>
      <elem color="red"/>
   </red>
   <arbitrary/>
</root>



$ saxon8 gp3.xml gp3.xsl
<?xml version="1.0" encoding="UTF-8"?>
<root>
   <arbitrary/>
   <red>
      <elem color="red"/>
      <elem color="red"/>
   </red>
   <red>
      <elem color="dark-red"/>
      <elem color="red"/>
   </red>
   <arbitrary/>
   <red>
      <elem color="red"/>
   </red>
   <red>
      <elem color="dark-red"/>
   </red>
   <arbitrary/>
</root>

--~------------------------------------------------------------------
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>
--~--