xsl-list
[Top] [All Lists]

RE: [xsl] Recursive wrapping

2006-07-20 02:47:23
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() &gt;
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>
--~--

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