|
Subject: Re: [xsl] automatic creation of nested elements From: "Ganesh Babu N" <nbabuganesh@xxxxxxxxx> Date: Tue, 2 Dec 2008 10:26:44 +0530 |
Thanks Vasu,
Your solution is working for me. Thank you once again.
Regards,
Ganesh
On Mon, Dec 1, 2008 at 8:22 PM, Vasu Chakkera <vasucv@xxxxxxxxx> wrote:
> Try the below. ( i just carried it along the way of creating the
> children recursively from your target. add your attributes etc as
> necessary ). just changed from where you had a for-each. Dint check
> the other parts of your code. The below produces the result you
> wanted.
>
> <xsl:template match="map">
> <xsl:if test="count(child::*) > 3 and not(starts-with(source,'@'))">
> <mac:template match="{source[1]}">
> <xsl:variable name="nestedele"
> select="tokenize(target[1],'/')"/>
> <xsl:call-template name="buildtree">
> <xsl:with-param name="position" select="1"/>
> </xsl:call-template>
> </mac:template>
> </xsl:if>
> </xsl:template>
> <xsl:template name="buildtree">
> <xsl:param name="position"/>
> <xsl:variable name = "element" select="tokenize(target[1],'/')[$position]"/>
> <xsl:if test = "string($element)">
> <mac:element name="{$element}">
> <xsl:if test="not($position = 1) and exists(source[2])">
> <mac:attribute name="{substring-after(target[$position],'@')}">
> <mac:value-of select="{source[$position]}"/>
> </mac:attribute>
> </xsl:if>
> <xsl:call-template name="buildtree">
> <xsl:with-param name="position" select="$position +1"/>
> </xsl:call-template>
> <mac:apply-templates/>
> </mac:element>
> </xsl:if>
> </xsl:template>
>
> hth
> Vasu C
>
> 2008/12/1 Ganesh Babu N <nbabuganesh@xxxxxxxxx>:
>> Input XML:
>>
>> <map>
>> <source>bib-reference</source>
>> <source>@id</source>
>> <target>reference/citation</target>
>> <target>@id</target>
>> </map>
>>
>> Required output:
>> <xsl:template match="bib-reference">
>> <xsl:element name="reference">
>> <xsl:element name="citation">
>> <xsl:attribute name="id">
>> <xsl:value-of select="@id"/>
>> </xsl:attribute>
>> <xsl:apply-templates/>
>> </xsl:element>
>> <xsl:element>
>> </xsl:template>
>>
>> My XSLT:
>> <xsl:template match="map">
>> <xsl:when test="count(child::*) > 3 and not(starts-with(source,'@'))">
>> <mac:template match="{source[1]}">
>> <xsl:variable name="nestedele"
>> select="tokenize(target[1],'/')"/>
>> <xsl:for-each select="$nestedele">
>> <xsl:variable name="tem" select="."/>
>> <mac:element name="{$tem}">
>> <xsl:for-each select="target">
>> <xsl:variable name="pos" select="position()"/>
>> <xsl:if test="not(position()=1) and exists(../source[2])">
>> <mac:attribute name="{substring-after(.,'@')}">
>> <mac:value-of select="{../source[$pos]}"/>
>> </mac:attribute>
>> </xsl:if>
>> </xsl:for-each>
>> <mac:apply-templates/>
>> </mac:element>
>> </xsl:for-each>
>> </mac:template>
>> </xsl:when>
>> </xsl:template>
>>
>> This will create one element after the other but it won't create the
>> nested one. In a result for bib-reference, two elements will be
>> created with same content. Which is a wrong one. Please guide me how
>> to generate the nested element structure.
>>
>> Regards,
>> Ganesh
>>
>>
>
>
>
> --
> Vasu Chakkera
> Numerical Algorithms Group Ltd.
> Oxford
> www.vasucv.com
| Current Thread |
|---|
|
| <- Previous | Index | Next -> |
|---|---|---|
| Re: [xsl] automatic creation of nes, Vasu Chakkera | Thread | Re: [xsl] automatic creation of nes, Ganesh Babu N |
| Re: [xsl] populate nodelist variabl, David Carlisle | Date | [xsl] sequence of strings, Ruud Grosmann |
| Month |