RE: [xsl] position() return's only even numbers for nested elements

Subject: RE: [xsl] position() return's only even numbers for nested elements
From: "Michael Kay" <mhk@xxxxxxxxx>
Date: Fri, 9 May 2003 20:06:33 +0100
A FAQ. You are counting the whitespace text nodes as well as the
elements. Use <xsl:strip-space> to get rid of the text nodes.

Michael Kay

> -----Original Message-----
> From: owner-xsl-list@xxxxxxxxxxxxxxxxxxxxxx 
> [mailto:owner-xsl-list@xxxxxxxxxxxxxxxxxxxxxx] On Behalf Of 
> DURDINA Michal
> Sent: 09 May 2003 16:52
> To: 'xsl-list@xxxxxxxxxxxxxxxxxxxxxx'
> Subject: [xsl] position() return's only even numbers for 
> nested elements
> 
> 
> Hello,
> please take a look at this xsl fragment, maybe you find a 
> simple explanation to strange behaviour of position() 
> function for nested elements.
> 
> Consider this input xml:
> <uml>
>   <package id="1"/>
>   <package id="2"/>
>   <package id="3">
>     <package id="31"/>
>     <package id="32"/>
>   </package>
>   <package id="4">
>     <package id="41">
>       <package id="411"/>
>       <package id="412"/>
>       <package id="413"/>
>     </package>
>   </package>
>   <package id="5"/>
> </uml>
> 
> Now I want to print position of every single 'package' element:
> 
> <xsl:stylesheet version="1.0" 
> xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
> 
>   <xsl:template match="uml">
>     <result>
>       <xsl:apply-templates select="package"/>
>     </result>
>   </xsl:template>
>   
>   <xsl:template match="package">
>     <xsl:copy>
>       <xsl:copy-of select="@id"/>
>       <xsl:attribute name="position"><xsl:value-of 
> select="position()"/></xsl:attribute>
>       <xsl:apply-templates/>
>     </xsl:copy>    
>   </xsl:template>
> 
> </xsl:stylesheet>
> 
> And the result under Saxon and Xalan is:
> <result>
>   <package id="1" position="1"/>
>   <package id="2" position="2"/>
>   <package id="3" position="3">
>     <package id="31" position="2"/>
>     <package id="32" position="4"/>
>   </package>
>   <package id="4" position="4">
>     <package id="41" position="2">
>       <package id="411" position="2"/>
>       <package id="412" position="4"/>
>       <package id="413" position="6"/>
>     </package>
>   </package>
>   <package id="5" position="5"/>
> </result>
> 
> Why all nested 'package' element have even positions (2, 4, 
> 6, ...) but top-level 'package' elements positions behaves 
> right (1, 2, 3,...) ???
> 
> When I replace <xsl:apply-templates/> with 
> <xsl:apply-templates select="packages"/>, then it works right 
> also for nested 'packages' elements.
> 
> I''ll be thankful for every explanation.
> 
> Michal
> 
>  XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
> 


 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list


Current Thread