Could you please post the input XML you tried and your desired output.
Regards,
Mukul
On 7/20/06, Khorasani, Houman <Houman(_dot_)Khorasani(_at_)comverse(_dot_)com>
wrote:
Hi Ghandi,
Sorry for late response. This might be a nice alternative solution to
the one from George. I tested it but for some reason, I get only the
values in the output without the xml tags.
Regards
Houman
-----Original Message-----
From: Mukul Gandhi [mailto:gandhi(_dot_)mukul(_at_)gmail(_dot_)com]
Sent: 13 July 2006 17:16
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: Re: [xsl] Recursive wrapping
Hi Houman,
This is an example of positional grouping.
Following is one solution to this problem:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output method="xml" indent="yes" />
<xsl:template match="/root">
<root>
<xsl:for-each select="*">
<xsl:choose>
<xsl:when test="not(self::Attribute)">
<xsl:copy-of select="." />
</xsl:when>
<xsl:when test="not(preceding-sibling::*[1]/self::Attribute)">
<OtherAttributes>
<xsl:copy-of select="." />
<xsl:call-template name="MakeGroup">
<xsl:with-param name="nodeset"
select="following-sibling::*" />
</xsl:call-template>
</OtherAttributes>
</xsl:when>
</xsl:choose>
</xsl:for-each>
</root>
</xsl:template>
<xsl:template name="MakeGroup">
<xsl:param name="nodeset" />
<xsl:if test="$nodeset[1]/self::Attribute">
<xsl:copy-of select="$nodeset[1]" />
<xsl:call-template name="MakeGroup">
<xsl:with-param name="nodeset" select="$nodeset[position() >
1]" />
</xsl:call-template>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
For e.g., when the above stylesheet is applied to XML:
<root>
<a>1</a>
<b>2</b>
<Attribute>
<Name>xx</Name>
<Value>xx</Value>
</Attribute>
<Attribute>
<Name>yy </Name>
<Value>yy</Value>
</Attribute>
<c>3</c>
</root>
The following output is produced:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<a>1</a>
<b>2</b>
<OtherAttributes>
<Attribute>
<Name>xx</Name>
<Value>xx</Value>
</Attribute>
<Attribute>
<Name>yy </Name>
<Value>yy</Value>
</Attribute>
</OtherAttributes>
<c>3</c>
</root>
Regards,
Mukul
On 7/13/06, Khorasani, Houman <Houman(_dot_)Khorasani(_at_)comverse(_dot_)com>
wrote:
> Hi,
>
> I have a problem, which should be quite straight forward but I can't
> find the solution.
>
>
> XML:
>
> <a>1</a>
> <b>2</b>
> <Attribute>
> <Name>xx</Name>
> <Value>xx</Value>
> </Attribute>
> <Attribute>
> <Name>yy </Name>
> <Value>yy</Value>
> </Attribute>
> ...
> <c>3</c>
>
>
>
> Would like to generate:
> <a>1</a>
> <b>2</b>
> <OtherAttributes>
> <Attribute>
> <Name>xx</Name>
> <Value>xx</Value>
> </Attribute>
> <Attribute>
> <Name>yy </Name>
> <Value>yy</Value>
> </Attribute>
> ...
> </OtherAttributes>
> <c>3</c>
>
> There could be 0 to n attribute elements and I would like to wrap them
> between an OtherAttributes.
>
> I have tried to solve it by recursive templates, but somehow I don't
get
> there. Any suggestions?
>
> Many thanks
> Houman
--~------------------------------------------------------------------
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>
--~--