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 |