[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message]

xsl:for-each-group output control

Subject: xsl:for-each-group output control
From: Andreas Peter <info@xxxxxxxxxx>
Date: Fri, 23 Nov 2007 22:11:33 +0100
 xsl:for-each-group output control
Hello List!

Unfortunaltely I still have a problem with xsl:for-each-group and my
xml example.
For a better understanding the test-xml-file:

<root>
    <element>
        <h1>h1</h1>
        <h2>h2_1</h2>
        <para>para_1</para>
        <para>para_2<emp>auszeichnung</emp></para>
        <para>para_3</para>
        <para>para_4</para>
        <para>para_5</para>
        <h2>h2_2</h2>
        <para>para_6</para>
        <h3>h3_1</h3>
        <para>para_7</para>
        <h5>h5_1</h5>
        <para>para_8</para>
        <para>para_9<emp>auszeichnung</emp></para>
        <para>para_10</para>
        <h4>h4_1</h4>
        <para>para_11</para>
        <para>para_12</para>
        <h2>h2_3</h2>
        <para>para_13</para>
        <para>para_14</para>
        <para>para_15</para>
        <h3>h3_2</h3>
        <para>para_16<emp>auszeichnung</emp></para>
        <para>para_17</para>
        <para>para_18</para>
        <h4>h4_2</h4>
        <para>para_19</para>
        <para>para_20</para>
        <h5>h5_2</h5>
        <para>para_21</para>
        <para>para_22<emp>auszeichnung</emp></para>
        <para>para_23</para>
    </element>
</root>

I numbered the text nodes for a better visualization.

I try to use the following xsl file:

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

    <xsl:template match="/">
        <set>
            <book>
                <bookinfo/>
                <xsl:apply-templates/>
            </book>
        </set>
    </xsl:template>

    <xsl:template match="element">
        <xsl:apply-templates select="h1|h2[1]"/>
    </xsl:template>

    <xsl:template match="h1">
        <title>
            <xsl:apply-templates/>
        </title>
    </xsl:template>

    <xsl:template match="h2">
        <xsl:for-each-group select=".|following-sibling::*"
group-starting-with="h2|h3|h4|h5">
            <xsl:choose>
                <xsl:when test="current-group()[self::h2]">
                    <chapter>
                        <title>
                            <xsl:apply-templates/>
                        </title>
                        <xsl:copy-of select="current-group()[self::para]"/>
                        <xsl:choose>
                            <xsl:when
test="current-group()[following-sibling::h3]">
                                <xsl:call-template name="h3"/>
                            </xsl:when>
                        </xsl:choose>
                    </chapter>
                </xsl:when>
            </xsl:choose>
        </xsl:for-each-group>
    </xsl:template>

    <xsl:template name="h3">
        <sect1>
            <title>
                <xsl:apply-templates/>
            </title>
            <xsl:copy-of select="current-group()[self::para]"/>
        </sect1>
    </xsl:template>
</xsl:stylesheet>

My output looks like this:

<set>
   <book>
      <bookinfo/>
      <title>h1</title>
      <chapter>
         <title>h2_1</title>
         <para>para_1</para>
         <para>para_2<emp>auszeichnung</emp>
         </para>
         <para>para_3</para>
         <para>para_4</para>
         <para>para_5</para>
         <sect1>
            <title>h2_1</title>
            <para>para_1</para>
            <para>para_2<emp>auszeichnung</emp>
            </para>
            <para>para_3</para>
            <para>para_4</para>
            <para>para_5</para>
         </sect1>
      </chapter>
      <chapter>
         <title>h2_2</title>
         <para>para_6</para>
         <sect1>
            <title>h2_2</title>
            <para>para_6</para>
         </sect1>
      </chapter>
      <chapter>
         <title>h2_3</title>
         <para>para_13</para>
         <para>para_14</para>
         <para>para_15</para>
         <sect1>
            <title>h2_3</title>
            <para>para_13</para>
            <para>para_14</para>
            <para>para_15</para>
         </sect1>
      </chapter>
   </book>
</set>

But instead of
...
<sect1>
<title>h2_1</title>
<para>para_1</para>
<para>para_2<emp>auszeichnung</emp></para>
<para>para_3</para>
<para>para_4</para>
<para>para_5</para>
</sect1>
...

the output should look like this:

...
<sect1>
<h3>h3_1</h3>
<para>para_7</para>
</sect1>
...

and so on. Unfortunately I cannot see the problem. IsnB4t it possible
to grab the content out of a xsl:for-each-group as I tried it using a
separate template?

I am really sorry for that perhaps basic question but I am dispaired
about that problem.

Thanks for helping me. Perhaps one day I will be more firm to XSLT.

Andreas

Current Thread

PURCHASE STYLUS STUDIO ONLINE TODAY!

Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced!

Buy Stylus Studio Now

Download The World's Best XML IDE!

Accelerate XML development with our award-winning XML IDE - Download a free trial today!

Don't miss another message! Subscribe to this list today.
Email
First Name
Last Name
Company
Subscribe in XML format
RSS 2.0
Atom 0.3
Site Map | Privacy Policy | Terms of Use | Trademarks
Free Stylus Studio XML Training:
W3C Member
Stylus Studio® and DataDirect XQuery ™are products from DataDirect Technologies, is a registered trademark of Progress Software Corporation, in the U.S. and other countries. © 2004-2011 All Rights Reserved.