Subject: Re: [xsl] Confused with templates and XPath From: Frédéric Laurent <fl@xxxxxxxxxxxxx> Date: Thu, 8 Jan 2004 12:58:39 +0100 |
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 |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] Confused with templates a, David Carlisle | Thread | Re: [xsl] Confused with templates a, David Carlisle |
Re: [xsl] Confused with templates a, David Carlisle | Date | Re: [xsl] Confused with templates a, David Carlisle |
Month |