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::*) > 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, Vasu Chakkera | Thread | Re: [xsl] automatic creation of nes, Ganesh Babu N |
Re: [xsl] populate nodelist variabl, David Carlisle | Date | [xsl] sequence of strings, Ruud Grosmann |
Month |