|
Subject: RE: [xsl] Create xml file with recursive childnodes From: "Michael Kay" <mike@xxxxxxxxxxxx> Date: Fri, 8 Aug 2008 09:16:42 +0100 |
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@xxxxxxxxx]
> Sent: 08 August 2008 00:31
> To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
> 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
| Current Thread |
|---|
|
| <- Previous | Index | Next -> |
|---|---|---|
| [xsl] Create xml file with recursiv, chun ji | Thread | Re: [xsl] Create xml file with recu, Mukul Gandhi |
| [xsl] Entities from source doctype?, Liz Fraley | Date | RE: [xsl] Entities from source doct, Michael Kay |
| Month |