Subject: Re: [xsl] grouping problem From: M Balaji <msbalaji82@xxxxxxxxx> Date: Wed, 22 Apr 2009 18:40:52 +0530 |
Ken, Thanks!!! It is working fine On Wed, Apr 22, 2009 at 5:15 PM, G. Ken Holman <gkholman@xxxxxxxxxxxxxxxxxxxx> wrote: > 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@xxxxxxxxxxxxxxxxxxxx > 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
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] grouping problem, G. Ken Holman | Thread | [xsl] XSLT/XPATH 2.0, Studer Leo |
Re: [xsl] in search for more elegan, Dimitre Novatchev | Date | Re: [xsl] in search for more elegan, David Carlisle |
Month |