[XSL-LIST Mailing List Archive Home] [By Thread] [By Date] [Recent Entries] [Reply To This Message]

Re: Confused with templates and XPath

Subject: Re: Confused with templates and XPath
From: Frédéric Laurent <fl@xxxxxxxxxxxxx>
Date: Thu, 8 Jan 2004 12:58:39 +0100
xsl template match para
David Carlisle wrote:
>>Doesnt the //para apply to any para in the document?
> 
> 
> yes a match of "//para" is exactly the same as a match of "para" and
> will match every para element.
> 
> Normally we tell people that starting a match with // does nothing
> useful, but does no harm either, but in this case it does do harm.
> 
> If the stylesheet had
> 
> <xsl:template match="para">
> <xsl:template match="chapter/para">
> 
> Then both templates would match para children of chapter.
> XSLT never applies too templates and if two match it uses the one of
> highest priority. As neither of these templates has a priority attribute
> the default priorities will be used, and the default priority for a
> match involving a "/" step is higher than that of a match with just a
> single element name, so the first template will be used if teh para is
> _not_ a child of chapter and the second will be used if it is.
> 
> However in your case
> 
> 
> <xsl:template match="//para">
> <xsl:template match="chapter/para">
> 
> both templates have the same priority, this is an error and the system
> could just fail and produce no output, but it is allowed to recover
> from the error and use the last specified template, in which case
> it will act as above, if they are really specified in this order.
> 
> You should report that as a bug to the author of the stylesheet, relying
> on a system's silent error recovery is bad practice.

Are you sure of that ?

The following stylesheet

<?xml version="1.0"?>
<xsl:stylesheet version="1.0"   
       xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method = "text" />
 <xsl:template match="chapter/para">
   chapter-para : <xsl:apply-templates />
 </xsl:template>
 <xsl:template match="//para">
   default-para : <xsl:apply-templates />
 </xsl:template>
</xsl:stylesheet>

with the following xml file
<doc>
	<para>para1</para>
	<chapter><para>para2</para></chapter>
</doc>

produces 

default-para : para1
chapter-para : para2

even if I change the template order (//para before chapter/para)

In the XSLT specification, I can read in the conflict paragraph*

"The next less specific kind of pattern (a pattern that tests for a node with a 
particular type and an expanded-name with a particular namespace URI) has 
priority -0.25. Patterns less specific than this (patterns that just tests for 
nodes with particular types) have priority -0.5. Patterns more specific than 
the most common kind of pattern have priority 0.5."

[*] http://www.w3.org/TR/xslt#conflict

>From my point of view, 
chapter/para is more specific, so its priority is 0.5
and //para is less specific, so its priority is negative.

Then the conclusion is that the more specific pattern is called, for
a given para.

Am I wrong ?

Cheers

Fred
-- 
XPath free testing software :  http://lantern.sourceforge.net
Frédéric Laurent                     http://www.opikanoba.org

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


Current Thread

PURCHASE STYLUS STUDIO ONLINE TODAY!

Purchasing Stylus Studio from our online shop is Easy, Secure and Value Priced!

Buy Stylus Studio Now

Download The World's Best XML IDE!

Accelerate XML development with our award-winning XML IDE - Download a free trial today!

Don't miss another message! Subscribe to this list today.
Email
First Name
Last Name
Company
Subscribe in XML format
RSS 2.0
Atom 0.3
Site Map | Privacy Policy | Terms of Use | Trademarks
Free Stylus Studio XML Training:
W3C Member
Stylus Studio® and DataDirect XQuery ™are products from DataDirect Technologies, is a registered trademark of Progress Software Corporation, in the U.S. and other countries. © 2004-2013 All Rights Reserved.