|
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 |