xsl-list
[Top] [All Lists]

Re: [xsl] For-each-group problem

2006-10-02 08:40:20
On 10/2/06, Mario Madunic <hajduk(_at_)imag(_dot_)net> wrote:
Can't seem to get the results I want using for-each-group

Using Saxon 8 and XSLT 2

Sample doc

<root>
  <body>
    <heading>
    <p></p>
    <p></p>

    <li></li>
    <div>
      <p></p>
      <p></p>
    </div>

    <li></li>
    <div>
      <p></p>
      <p></p>
      <p></p>
      <p></p>
    </div>

    <li></li>
    <div>
      <p></p>
      <p></p>
    </div>

    <p></p>
    <p></p>
    <footer></footer>
  <body>
</root>

I want it to look like the following

<root>
  <body>
    <heading>
    <p></p>
    <p></p>

    <li>
      <div>
        <p></p>
        <p></p>
      </div>
    </li>

    <li>
      <div>
        <p></p>
        <p></p>
        <p></p>
        <p></p>
      </div>
    </li>

    <li>
      <div>
        <p></p>
        <p></p>
      </div>
    </li>

    <p></p>
    <p></p>
    <footer></footer>
  <body>
</root>

I've followed the example in MK's XSLT 2 book page # 297 and haven't achieved
the same results. I have a bunch of elements that this must be done to.

Firstly your samples aren't well-formed XML, which doesn't help.  However...

you don't need grouping here, just a variation of the identity transform:

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
<xsl:template match="@*|node()">
        <xsl:copy>
                <xsl:apply-templates select="@*|node()"/>
        </xsl:copy>
</xsl:template>

<xsl:template match="heading">
        <xsl:copy>
                <xsl:apply-templates select="*[not(self::div)]"/>
        </xsl:copy>
</xsl:template>

<xsl:template match="li">
        <xsl:copy>
                <xsl:apply-templates 
select="following-sibling::*[1][self::div]"/>
        </xsl:copy>
</xsl:template>
</xsl:stylesheet>

produces:

<root>
        <body>
                <heading>
                        <p/>
                        <p/>
                        <li>
                                <div>
                                        <p/>
                                        <p/>
                                </div>
                        </li>
                        <li>
                                <div>
                                        <p/>
                                        <p/>
                                        <p/>
                                        <p/>
                                </div>
                        </li>
                        <li>
                                <div>
                                        <p/>
                                        <p/>
                                </div>
                        </li>
                        <p/>
                        <p/>
                </heading>
                <footer/>
        </body>
</root>

cheers
andrew

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