|
Subject: Re: [xsl] position matching From: "Ganesh Babu N" <nbabuganesh@xxxxxxxxx> Date: Fri, 28 Nov 2008 11:35:44 +0530 |
Thank you very much Vasu and Michael for you valuable suggesting and
pointing out my mistakes.
the provided style sheet is working with small modification.
<mac:value-of select="{/map/source[$position]}"/>
changed to
<mac:value-of select="{../source[$pos]}"/>
Regards,
Ganesh
On Thu, Nov 27, 2008 at 4:14 PM, Vasu Chakkera <vasucv@xxxxxxxxx> wrote:
> Ok here goes your errors in stylesheets..
>
>> <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>
>
> Problem 1 :
> You are selecting the target > 1 so in the resulting nodeset, you will
> have 2nd target and the 3rd target ( in the order of your xml) //
>
> So you have lost the positioning of the input XML source , so you will
> never get the correct source value with your position, because the
> position() will give 1 for the 2nd target ( of your xml) and 2 for the
> third target (of your XML)..
>
> So for getting your numbering correct you muct allow all the targets
> in and possibly put an if condition to not process the first one.
>
> <xsl:for-each select="target">
>
> Problem 2:
> <mac:attribute name="substring-after({target[$pos]},'@')">
>
> Firstly, you have used the Attribute Value Template wrongly ..
> so the above should be
> <mac:attribute name="{substring-after(target[$pos],'@')}">
> Secondly :
> Your for-each loops through target. So your current context is the
> target element.
> and your substring-after is looking for target element under the
> crrent context. so unless there was target/target, you will never
> win.
>
> It should have been :
>
> <mac:attribute name="{substring-after(.,'@')}">
>
> Problem 3:
> <mac:value-of select="(preceding-sibling::source)[$pos]"/>
>
> As mentioned in the problem 1: , Your use of position is wrong..
> because of your filter in the for-each that counts from the second
> target element. You will never get the correct corresponding source
> element.
>
> what you want is better imagined, if you could use /map/source , to
> match the corresponding source ( coming from top to down)
>
> so define:
>
> <xsl:variable name = "position" select="position()"/>
>
> and then use
>
> <mac:value-of select="{/map/source[$position]}"/>
>
>
>
> So here is the complete Stylesheet:
>
> <xsl:template match="map">
> <xsl:if test="count(child::source) = count(child::target) and
> not( count(child::*) = 2 )">
> <mac:template match="{source[1]}">
> <mac:element name="{target[1]}">
> <xsl:for-each select="target">
> <xsl:variable name = "position" select="position()"/>
> <xsl:if test = "not(position() = 1)">
> <mac:attribute name="{substring-after(.,'@')}">
> <mac:value-of select="{/map/source[$position]}"/>
> </mac:attribute>
> </xsl:if>
> </xsl:for-each>
> <mac:apply-templates select="@*|node()"/>
> </mac:element>
> </mac:template>
> </xsl:if>
> </xsl:template>
>
> The above produces:
> <mac:template match="article">
> <mac:element name="article">
> <mac:attribute name="article-type">
> <mac:value-of select="@docsubtype" />
> </mac:attribute>
> <mac:attribute name="dtd-version">
> <mac:value-of select="@version" />
> </mac:attribute>
> <mac:apply-templates select="@*|node()" />
> </mac:element>
> </mac:template>
>
> HTH
>
> Vasu Chakkera.
>
> 2008/11/27 Ganesh Babu N <nbabuganesh@xxxxxxxxx>:
>> 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
>>
>>
>
>
>
> --
> Vasu Chakkera
> Numerical Algorithms Group Ltd.
> Oxford
> www.vasucv.com
| Current Thread |
|---|
|
| <- Previous | Index | Next -> |
|---|---|---|
| Re: [xsl] position matching, Vasu Chakkera | Thread | Re: [xsl] position matching, Vasu Chakkera |
| Re: [xsl] Filtering sequences of at, G. Ken Holman | Date | Re: [xsl] position matching, Vasu Chakkera |
| Month |