|
Subject: Re: [xsl] automatic creation of nested elements From: "Vasu Chakkera" <vasucv@xxxxxxxxx> Date: Mon, 1 Dec 2008 14:52:11 +0000 |
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, Florent Georges | Thread | Re: [xsl] automatic creation of nes, Ganesh Babu N |
| Re: [xsl] XSLT 2.1: ElementTest aga, Florent Georges | Date | [xsl] avoiding NaN-result in string, cavecatem@xxxxxxxxxx |
| Month |