xsl-list
[Top] [All Lists]

Re: [xsl] automatic creation of nested elements

2008-12-01 09:52:38
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(_at_)gmail(_dot_)com>:
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

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





-- 
Vasu Chakkera
Numerical Algorithms Group Ltd.
Oxford
www.vasucv.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>
--~--