Subject: Re: [xsl] position matching From: "Ganesh Babu N" <nbabuganesh@xxxxxxxxx> Date: Thu, 27 Nov 2008 10:47:57 +0530 |
Hai Based on Michael points i have updated the XSL but I am not getting any output. Please help me. <xsl:template match="map"> <xsl:if test="count(child::source) = count(child::target) and count(child::*) != 2"> <xsl:variable name="pos"><xsl:value-of select="target[position()]"/></xsl:variable> <mac:template match="{source[$pos]}"> <mac:element name="{target[$pos]}"> <xsl:for-each select="target[$pos > 1]"> <mac:attribute name="substring-after({target[$pos]},'@')"> <mac:value-of select="(preceding-sibling::source)[$pos]"/> </mac:attribute> </xsl:for-each> <mac:apply-templates select="@*|node()"/> </mac:element> </mac:template> </xsl:if> </xsl:template> Regards, Ganesh On Wed, Nov 26, 2008 at 4:31 PM, Michael Kay <mike@xxxxxxxxxxxx> wrote: > Two obvious errors, excluding typos: > > (1) target[position() > 2] should be target[position() > 1] > > (2) preceding-sibling::source[position()] - you've forgotten that the > context inside a predicate changes. You need to bind position() to a > variable p outside the expression and then use > preceding-sibling::source[$p]. Or in fact I suspect it should be > (preceding-sibling::source)[$p] because you want them numbered in forwards > rather than reverse order. > > Michael Kay > http://www.saxonica.com/ > > > >> -----Original Message----- >> From: Ganesh Babu N [mailto:nbabuganesh@xxxxxxxxx] >> Sent: 26 November 2008 10:52 >> To: XSL >> Subject: [xsl] position matching >> >> Hai All, >> >> I am working on automatic XSLT generation project and here is >> the mapping table. >> >> Here is my XML file: >> <map> >> <source>article</source> >> <source>@docsubtype</source> >> <source>@version</source> >> <target>article</target> >> <target>@article-type</target> >> <target>@dtd-version</target> >> </map> >> >> My stylesheet: >> >> <xsl:template match="map"> >> <xsl:if test="count(child::source) = count(child::target) and >> count(child::*) != 2"> >> <mac:template match="{source[1]}"> >> <mac:element name="{target[1]}"> >> <xsl:for-each select="target[position() > 2"> <mac:attribute >> name="substring-after({target},'@')"><mac:value-of >> select="preceding-sibling::source[position()]"/></mac:attribute> >> <xsl:for-each> >> <mac:apply-templates select="@*|node()"/> </mac:element> >> </mac:template> </xsl:if> </xsl:template> >> >> Expected Output: >> >> <xsl:template match="article> >> <xsl:element name="article"> >> <xsl:attribute name="article-type"><xsl:value-of >> select="@docsubtype"></xsl:attribute> >> <xsl:attribute name="@dtd-version"><xsl:value-of >> select="@version"></xsl:attribute> >> </xsl:element> >> <xsl:template> >> >> >> I am not getting the desired result. Please let me know where >> I am going wrong. >> >> Regards, >> Ganesh
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
RE: [xsl] position matching, Michael Kay | Thread | RE: [xsl] position matching, Michael Kay |
Re: [xsl] Filtering sequences of at, Christoph LANGE | Date | [xsl] Faster Search and replace, J. S. Rawat |
Month |