[Home] [By Thread] [By Date] [Recent Entries]
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.Khorasani@xxxxxxxxxxxx> wrote: Hi,
|

Cart



