[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message]

Re: Create xml file with recursive childnodes

Subject: Re: Create xml file with recursive childnodes
From: "Mukul Gandhi" <gandhi.mukul@xxxxxxxxx>
Date: Sat, 9 Aug 2008 10:44:50 +0530
Re:  Create xml file with recursive childnodes
Hi Mike,
  I tried your solution, and it was producing something different than
with the OP wanted.

The following stylesheet works ...

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                       version="2.0">

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

<xsl:template match="Objs">
  <xsl:variable name="temp">
    <xsl:apply-templates select="obj[not(@name = ../obj/@child)]" />
  </xsl:variable>
  <xsl:call-template name="processTemp">
    <xsl:with-param name="temp" select="$temp/*" />
  </xsl:call-template>
</xsl:template>

<xsl:template match="obj">
  <xsl:variable name="child" select="@child" />
  <Obj name="{@name}">
    <xsl:choose>
      <xsl:when test="../obj[@name = $child]">
        <xsl:apply-templates select="../obj[@name = $child]" />
      </xsl:when>
      <xsl:otherwise>
        <Obj name="{$child}" />
      </xsl:otherwise>
    </xsl:choose>
  </Obj>
</xsl:template>

<xsl:template name="processTemp">
  <xsl:param name="temp" />

  <xsl:for-each-group select="$temp" group-by="@name">
    <Obj name="{@name}">
      <xsl:call-template name="processTemp">
        <xsl:with-param name="temp" select="current-group()/*" />
      </xsl:call-template>
    </Obj>
  </xsl:for-each-group>

</xsl:template>

</xsl:stylesheet>

On Fri, Aug 8, 2008 at 1:46 PM, Michael Kay <mike@xxxxxxxxxxxx> wrote:
>
> Do this as a standard recursive descent of the input tree using
> xsl:apply-templates, but with one exception: instead of processing the
> physical XML children, you process the logical children selected using the
> foreign key relationship.
>
> Usually in this problem elements have a pointer to their parent node, in
> your case you have a pointer to each of the children, which makes it a
> little more difficult, but not much.
>
> <xsl:key name="nameKey" match="obj" use="@name"/>
>
> <xsl:template match="obj">
>  <Obj name="@name">
>    <xsl:for-each select="key('nameKey', @name)">
>      <xsl:apply-templates select="key('nameKey', @child)"/>
>    </xsl:for-each>
>  </Obj>
> </xsl:template>
>
> Or you could condense it:
>
> <xsl:template match="obj">
>  <Obj name="@name">
>      <xsl:apply-templates select="key('nameKey', @name)/key('nameKey',
> @child)"/>
>  </Obj>
> </xsl:template>
>
> but I thought that might be a bit confusing!
>
> Of course, you have to start by calling apply-templates on the "logical
> root" of the tree.
>
> Michael Kay
> http://www.saxonica.com/


-- 
Regards,
Mukul Gandhi

Current Thread

PURCHASE STYLUS STUDIO ONLINE TODAY!

Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced!

Buy Stylus Studio Now

Download The World's Best XML IDE!

Accelerate XML development with our award-winning XML IDE - Download a free trial today!

Don't miss another message! Subscribe to this list today.
Email
First Name
Last Name
Company
Subscribe in XML format
RSS 2.0
Atom 0.3
Site Map | Privacy Policy | Terms of Use | Trademarks
Free Stylus Studio XML Training:
W3C Member
Stylus Studio® and DataDirect XQuery ™are products from DataDirect Technologies, is a registered trademark of Progress Software Corporation, in the U.S. and other countries. © 2004-2013 All Rights Reserved.