xsl-list
[Top] [All Lists]

Re: [xsl] move tag up to level

2006-09-30 08:54:11
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(_dot_)vett(_at_)gmail(_dot_)com> 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(_at_)nag(_dot_)co(_dot_)uk>:
>
> 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

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

<Prev in Thread] Current Thread [Next in Thread>