Subject: Re: [xsl] grouping problem From: "G. Ken Holman" <gkholman@xxxxxxxxxxxxxxxxxxxx> Date: Wed, 22 Apr 2009 07:45:52 -0400 |
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>
<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:-
<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?
<?xml version="1.0" encoding="US-ASCII"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
<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>
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: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 -> |
---|---|---|
[xsl] grouping problem, M Balaji | Thread | Re: [xsl] grouping problem, M Balaji |
[xsl] grouping problem, M Balaji | Date | [xsl] in search for more elegant XP, Huditsch, Roman \(LN |
Month |