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