Re: [xsl] automatic creation of nested elements

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::*) &gt; 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::*) &gt; 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