Ken, Thanks!!! It is working fine
On Wed, Apr 22, 2009 at 5:15 PM, G. Ken Holman
<gkholman(_at_)cranesoftwrights(_dot_)com> 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(_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>
--~--
--~------------------------------------------------------------------
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>
--~--