xsl-list
[Top] [All Lists]

Re: [xsl] grouping problem

2009-04-22 07:46:35
At 2009-04-22 10:36 +0530, M Balaji wrote:
I need to group the input.

Input:
<root>
  <num>This chapter is..:</num>
  <test>A class is a module of Java code:</test>
  <section>or</section>
  <title>Java 5.0</title>
  <test>The Java programming language</test>
  <p>Write Once, Run Anywhere.</p>
  <num>Java j2ee</num>
  <p>Broad Responsibilities:...</p>
  <num>Job Description Perform Oracle...</num>
</root>

Expected output:

<msgs>
  <msg>
     <num>This chapter is..:</num>
     <import>
        <test>A class is a module of Java code:</test>
        <title>Java 5.0</title>
        <section>or</section>

Are the above two lines supposed to be inverted?  I'm assuming not.

        <test>The Java programming language</test>
     </import>
     <p>Write Once, Run Anywhere.</p>
  </msg>
  <msg>
     <num>Java j2ee</num>
     <p>Broad Responsibilities:...</p>
  </msg>
  <msg>
     <num>Job Description Perform Oracle...</num>
  </msg>
</msgs>

I tried with the below stylesheet.

<xsl:template match="root">
<msgs>
<xsl:for-each-group select="*"
group-starting-with="*[starts-with(name(), 'num')]">
<msg>
<xsl:apply-templates select="." mode="msg"/>
<xsl:for-each-group select="current-group() except ."
group-ending-with="test[last()]">
<xsl:apply-templates select="." mode="msg"/>
<import>
<xsl:apply-templates select="current-group() except ." mode="msg"/>
</import>
</xsl:for-each-group>
</msg>
</xsl:for-each-group>
</msgs>
</xsl:template>

Output received:-

The following is not the output I get with your stylesheet.

<msgs>
   <msg>
      <num>This chapter is..:</num>
      <import>
         <test>A class is a module of Java code:</test>
         <section>or</section>
         <title>Java 5.0</title>
         <test>The Java programming language</test>
      </import>
      <import><!--Import tag need to remove -->
         <p>Write Once, Run Anywhere.</p>
      </import>
   </msg>
   <msg>
      <num>Java j2ee</num>
      <import> <!-- import tag need to remove -->
         <p>Broad Responsibilities:...</p>
      </import>
   </msg>
   <msg>
      <num>Job Description Perform Oracle...</num>
   </msg>
</msgs>

Where I need to modify the stylesheet to get the expected output?

The first step is to get the intermediate results above, which is done with the following changes to your stylesheet:

<?xml version="1.0" encoding="US-ASCII"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
                version="2.0">

<xsl:output indent="yes"/>

<xsl:template match="root">
<msgs>
<xsl:for-each-group select="*"
group-starting-with="*[starts-with(name(), 'num')]">
<msg>
<xsl:apply-templates select="." mode="msg"/>
<xsl:for-each-group select="current-group() except ."
group-ending-with="test[last()]">
<import>
<xsl:apply-templates select="current-group()" mode="msg"/>
</import>
</xsl:for-each-group>
</msg>
</xsl:for-each-group>
</msgs>
</xsl:template>

<xsl:template match="@*|node()" mode="msg">
  <xsl:copy>
    <xsl:apply-templates select="@*|node()"/>
  </xsl:copy>
</xsl:template>

</xsl:stylesheet>

... and then it can be seen how to fix the problem. To fix the problem you need only wrap an <import> group when there is a <test> element inside, otherwise put out the group without the wrapper.

I hope the example below helps.

. . . . . . . . . . . Ken


T:\ftemp>type balaji.xml
<root>
  <num>This chapter is..:</num>
  <test>A class is a module of Java code:</test>
  <section>or</section>
  <title>Java 5.0</title>
  <test>The Java programming language</test>
  <p>Write Once, Run Anywhere.</p>
  <num>Java j2ee</num>
  <p>Broad Responsibilities:...</p>
  <num>Job Description Perform Oracle...</num>
</root>

T:\ftemp>call xslt2 balaji.xml balaji.xsl
<?xml version="1.0" encoding="UTF-8"?>
<msgs>
   <msg>
      <num>This chapter is..:</num>
      <import>
         <test>A class is a module of Java code:</test>
         <section>or</section>
         <title>Java 5.0</title>
         <test>The Java programming language</test>
      </import>
      <p>Write Once, Run Anywhere.</p>
   </msg>
   <msg>
      <num>Java j2ee</num>
      <p>Broad Responsibilities:...</p>
   </msg>
   <msg>
      <num>Job Description Perform Oracle...</num>
   </msg>
</msgs>
T:\ftemp>type balaji.xsl
<?xml version="1.0" encoding="US-ASCII"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
                version="2.0">

<xsl:output indent="yes"/>

<xsl:template match="root">
  <msgs>
    <xsl:for-each-group select="*"
                        group-starting-with="*[starts-with(name(), 'num')]">
      <msg>
        <xsl:apply-templates select="." mode="msg"/>
        <xsl:for-each-group select="current-group() except ."
                            group-ending-with="test[last()]">
          <xsl:choose>
            <xsl:when test="current-group()/self::test">
              <import>
                <xsl:apply-templates select="current-group()"
                                     mode="msg"/>
              </import>
            </xsl:when>
            <xsl:otherwise>
              <xsl:apply-templates select="current-group()"
                                   mode="msg"/>
            </xsl:otherwise>
          </xsl:choose>
        </xsl:for-each-group>
      </msg>
    </xsl:for-each-group>
  </msgs>
</xsl:template>

<xsl:template match="@*|node()" mode="msg">
  <xsl:copy>
    <xsl:apply-templates select="@*|node()"/>
  </xsl:copy>
</xsl:template>

</xsl:stylesheet>
T:\ftemp>rem Done!



--
XSLT/XSL-FO/XQuery hands-on training - Los Angeles, USA 2009-06-08
Training tools: Comprehensive interactive XSLT/XPath 1.0/2.0 video
Video lesson:    http://www.youtube.com/watch?v=PrNjJCh7Ppg&fmt=18
Video overview:  http://www.youtube.com/watch?v=VTiodiij6gE&fmt=18
G. Ken Holman                 mailto:gkholman(_at_)CraneSoftwrights(_dot_)com
Crane Softwrights Ltd.          http://www.CraneSoftwrights.com/s/
Male Cancer Awareness Nov'07  http://www.CraneSoftwrights.com/s/bc
Legal business disclaimers:  http://www.CraneSoftwrights.com/legal


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

<Prev in Thread] Current Thread [Next in Thread>