Altova Mailing List Archives>Archive Index >microsoft.public.xsl Archive Home >Recent entries >Thread Prev - doesn't make sense #2..could you? >Thread Next - Re: doesn't make sense #2..could you? Re: doesn't make sense #2..could you?To: NULL Date: 10/13/2007 9:51:00 PM TJ wrote: > Hi, > > I am trying to understand the difference ....xsl...hum.. > > This is A.xsl > <?xml version="1.0"?> > <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > version="1.0"> > <xsl:template match="/hello-world/greeting"> > <div><xsl:value-of select="."/></div> > </xsl:template> > </xsl:stylesheet> > > This is B.xsl > <?xml version="1.0"?> > <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" > version="1.0"> > <xsl:template match="/hello-world"> > <div><xsl:value-of select="greeting/text()"/></div> > </xsl:template> > </xsl:stylesheet> > > I tested these two xsl with this xml. > > This is A.xml > <?xml version="1.0"?> > <?xml-stylesheet type="text/xsl" href="A.xsl"?> > <hello-world> > <greeting>Hello, World!</greeting> > <greeter>An XSLT Programmer</greeter> > </hello-world> > > This is B.XML > <?xml version="1.0"?> > <?xml-stylesheet type="text/xsl" href="B.xsl"?> > <hello-world> > <greeting>Hello, World!</greeting> > <greeter>An XSLT Programmer</greeter> > </hello-world> > > It produce different results in IE7. > A.XML output > Hello, World! > An XSLT Programmer > > B.XML output > Hello, World! > > It looks to me that two xsl should produce > same output.....hum... > Can anybody explain this? In XSL, if there is no template matching an element type, it will be assumed to equate to an "apply-templates" directive. Here, there is no template matching the document root ("/"), so it will proceed to look for a template matching the root element type (in your example, "hello-world"). In A.xsl, there is no template matching "hello-world", so using the same default rule, it will be assumed to equate to an "apply-templates" directive and will walk down the tree to the first subelement, "greeting", where it will test and apply the same rule, and find that a template for this element type *does* exist, and it says to add the string value (".") of any text or elements below this point. (In fact this template doesn't need to be quite so specific in its match, just "greeting" would have done; the effect of the value-of for "." means that if there had been any further nested subelements inside greeting, they would have been stripped of their markup and the whole content of greeting concatenated and output as a simple string). Having exhausted depth, the processor moves sideways to the next sibling element type, "greeter". There is no template to match this, so as there are no nested subelements, the text content of greeter is added to the output tree. However, in B.xsl, there *is* a match for the root element. It doesn't need to be quite so explicit, just "hello-world" would have done, without the slash. In this case, the template says to add the value of all the text in the "greeting" subelement to the output tree, which it does. This template does not specify any further processing, so as there is nothing left to look at, the processing stops here. The greeting element and the greeter element, will never *themselves* get processed as such, either explicitly (looking for a matching template) NOR implicitly (using the default template) because while the current context was "hello-world", a template *was* found (whereas in A.xsl it was not), and once a template matches, no further searching-for-templates occurs *for that element*: only what is specifies in the matching template will get done, nothing more. And in this case, as the element in question was the root element (of which only one can exist), that's all, folks. ///Peter -- XML FAQ: http://xml.silmaril.ie/ | ||||||
| Company | Legal | Press | Partners | Careers | Sitemap | Contact Us | Altova Blog | Mobile | Full Site | |||
|
