Re: [xsl] move tag up to level

Subject: Re: [xsl] move tag up to level
From: "Mukul Gandhi" <gandhi.mukul@xxxxxxxxx>
Date: Sat, 30 Sep 2006 21:23:48 +0530
You could try the following stylesheet:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>

<xsl:output method="xml" indent="yes" />

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

</xsl:stylesheet>

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.

On 9/29/06, alex v. <alex.vett@xxxxxxxxx> wrote:
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