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(_at_)gmail(_dot_)com>
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(_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::*) > 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>
--~--
--~------------------------------------------------------------------
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>
--~--