Subject: Re: [xsl] move tag up to level From: "Mukul Gandhi" <gandhi.mukul@xxxxxxxxx> Date: Sat, 30 Sep 2006 21:23:48 +0530 |
<?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/root"> <root> <xsl:apply-templates select="a" /> </root> </xsl:template>
<xsl:template match="a"> <xsl:if test="node()[1][not(self::b)]"> <a> <xsl:apply-templates select="node()[1]" /> </a> </xsl:if> <xsl:copy-of select="b" /> <xsl:if test="b[following-sibling::node()]"> <a> <xsl:copy-of select="b/following-sibling::node()" /> </a> </xsl:if> </xsl:template>
<xsl:template match="node()"> <xsl:copy-of select="." /> <xsl:apply-templates select="following-sibling::node()[1][not(self::b)]" /> </xsl:template>
Though I have tested it with Saxon 8.8J, it doesn't use any XSLT 2.0 specific syntax. It would work with a XSLT 1.0 processor as well.
This stylesheet uses the sibling recursion technique for positional grouping. This was I think suggested by Michael Kay on the xsl-list.
The 'a' and 'b' are complex type, for example:
<root> <a>mixed content <c>huuu</c> like text and tags <b>other <d>mixed</d> content</b> mixed <e>content</e> also here </a> </root>
As result I need to have:
<root> <a>mixed content <c>huuu</c> like text and tags</a> <b>other <d>mixed</d> content</b> <a>mixed <e>content</e> also here</a> </root>
Could you please help me with this example, to understand how apply grouping with xslt2.
I use Saxon XSLT Processor.
~alex
2006/9/28, David Carlisle <davidc@xxxxxxxxx>: > > Note xslt has no access to the tags in the original document, and can't > directly generate any in the result. > > > a structure like this: > > > it depends a bit how like is like, but > > <xsl:template match="*"> > <xsl:copy> > <xsl:apply-templates/> > </xsl:copy> > </xsl:template> > > <xsl:template match="a"> > <xsl:apply-templates/> > </xsl:template> > > <xsl:template match="a/text()"> > <a> > <xsl:apply-templates/> > </a> > </xsl:template> > > would produce the output you show. In general though, if you need to > group more than one node inside teh a elements, this is a "grouping" > problem and you should use one of teh grouping idioms for xslt1 or > xsl:for-each-group in xslt2. > > David
--
~alex
-- Regards, Mukul Gandhi
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] move tag up to level, David Carlisle | Thread | [xsl] XPath for matching multiple c, Will McCutchen |
RE: [xsl] XPath for matching multip, Michael Kay | Date | [no subject], Unknown |
Month |