xsl-list
[Top] [All Lists]

RE: [xsl] Create xml file with recursive childnodes

2008-08-08 01:17:07

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/
 

-----Original Message-----
From: chun ji [mailto:cji_work(_at_)yahoo(_dot_)com] 
Sent: 08 August 2008 00:31
To: xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: [xsl] Create xml file with recursive childnodes 

Hi all, 

I have been thinking this for days, but still not sure what 
are the best way to fix it. ( I am using Saxon 2.0 on Window 
XP and Linux Box. JDK version is 1.6.0 )


The input XML file is something as:   
" 
<Objs> 
    <obj name="a" child="b"/>
    <obj name="b" child="c"/>
    <obj name="b" child="d"/>
    <obj name="c" child="e"/>
</Objs>
". let's say that xml file has ONLY 1 root node.  
 
The output XML file would be: 
"
<Obj name="a">
   <Obj name="b">
       <Obj name="c">
          <Obj name="e"/>
       </Obj>
       <Obj name="d"/>
   </Obj>
</Obj>
"

In my opinion, the XSL file would be something as: 
" 
  ...

  <xsl:template match="/">
         <xsl:value-of select="dumpChildNode(?,...)"/>
  </xsl:template>

   <xsl:function name="dumpChildNode" as="...">
       <xsl:param name="name" .../>
       <xsl:param name="?" .../>
       
       <Obj><xsl:attribute name="name">
              <xsl:value-of select="@name"/>
            </xsl:attribute>

       // Find the child node(s) and call the
dumpChildNode(..)
       ....?
       ....?
       <xsl:value-of select="dumpChildNode(?,)"/>
       <Obj>
 </xsl:function>
</xsl:stylesheet>
" 

Does someone know how to finish the rest of code? Or you have 
a better idea to solve the whole problem. 



Thanks a lot 


Chun  
     


      


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