Subject: Re: position() From: "Steve Muench" <smuench@xxxxxxxxxxxxx> Date: Fri, 30 Jun 2000 08:03:11 -0700 |
| OUT: | 2AAA | 4BBB This is likely due to how the built-in templates are interacting with your <xsl:template match="item"/> Given your example document: <itemlist> <item> <name>AAA</name> </item> <item> <name>BBB</name> </item> </itemlist> If you *just* use the stylesheet: <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="item"> <xsl:value-of select="position()"/> <xsl:value-of select="name"/> <p/> </xsl:template> </xsl:stylesheet> Then before the XSLT processor instantiates your "item" template, it's gone the the following basic steps: (1) Process the root node and find a matching template (2) No specific template matches the root, so built-in template provides a fallback and processes the children nodes of the root (in your case <itemlist>) (3) No specific template matches "itemlist" so built-in template provides a fallback and processes the children nodes of the <itemlist> element which are: 1. -text-node-consisting-of-whitespace- 2. <item> 3. -text-node-consisting-of-whitespace- 4. <item> So as the processor is processing this list of four child elements, as it considers each <item> element your <xsl:template match="item"> matches, your position() function records the position in the context node list being processed as numbered above. Here are a few suggestions: (1) Make sure you have a root template to avoid having the built-in templates process children nodes that you don't want processed. The modification of your example below produces the result you were expecting because it specifically selects the "itemlist/item" nodes for processing. <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:template match="/"> <xsl:apply-templates select="itemlist/item"/> </xsl:template> <xsl:template match="item"> <xsl:value-of select="position()"/> <xsl:value-of select="name"/> <p/> </xsl:template> </xsl:stylesheet> (2) If whitespace in general is causing problems you can get rid of extraneous whitespace-only text node children in your document by using <xsl:strip-space> The modification of your example below also produces the results you were expecting by requesting that the all-whitespace text nodes be removed from the source tree before processing: <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:strip-space elements="*"/> <xsl:template match="item"> <xsl:value-of select="position()"/> <xsl:value-of select="name"/> <p/> </xsl:template> </xsl:stylesheet> See http://www.w3.org/TR/xslt#built-in-rule for more info on the built-in templates. ______________________________________________________________ Steve Muench, Lead XML Evangelist & Consulting Product Manager Business Components for Java & XSQL Servlet Development Teams Oracle Rep to the W3C XSL Working Group Author "Building Oracle XML Applications", O'Reilly, Oct 2000 XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
RE: How to create xsl-stylesheet pr, Trevor de Koekkoek | Thread | [Announce] Sablotron 0.4, Petr Cimprich |
RE: How to create xsl-stylesheet pr, Trevor de Koekkoek | Date | [Announce] Sablotron 0.4, Petr Cimprich |
Month |