Subject: Meaning of XPath spec? From: chet@xxxxxxxxxxxxxx Date: Tue, 17 Aug 1999 16:20:16 -0400 |
In reading thru the XPath spec, I found the following in section 3.3. NOTE: The meaning of a Predicate depends crucially on which axis applies. For example, preceding::foo[1] returns the first foo element in reverse document order, because the axis that applies to the [1] predicate is the preceding axis; by contrast, (preceding::foo)[1] returns the first foo element in document order, because the axis that applies to the [1] predicate is the child axis. I searched thru the grammar, and could not find a way to parse the second expression. Nevertheless, XML4J returns the right thing. In attempting to decipher this path, I wrote the following XML file ================================================================ <?xml version="1.0"?> <doc> <buzz>first buzz</buzz> <foo>first foo</foo> <foo>second foo</foo> <foo>third foo</foo> <bar/> </doc> ================================================================ and the following XSL file ================================================================ <?xml version="1.0"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/XSL/Transform/1.0"> <!-- Root xsl:template - start processing here --> <xsl:template match="/"> <xsl:apply-templates/> </xsl:template> <xsl:template match="doc"> Rule1(<xsl:apply-templates select="bar"/>) </xsl:template> <xsl:template match="bar"> Rule2[preceding::foo](<xsl:copy-of select="preceding::foo"/>) Rule2[preceding::foo[1]](<xsl:copy-of select="preceding::foo[1]"/>) Rule2[(preceding::foo)](<xsl:copy-of select="(preceding::foo)"/>) Rule2[(preceding::foo)[1]](<xsl:copy-of select="(preceding::foo)[1]"/>) </xsl:template> </xsl:stylesheet> ================================================================ and the output from the Lotus XSL processor was ================================================================ Rule1( (1) Rule2[preceding::foo](<foo>first foo</foo><foo>second foo</foo><foo>third foo</foo>) (2) Rule2[preceding::foo[1]](<foo>third foo</foo>) (3) Rule2[(preceding::foo)](<foo>first foo</foo><foo>second foo</foo><foo>third foo</foo>) (4) Rule2[(preceding::foo)[1]](<foo>first foo</foo>) ) ================================================================ There are quite a few things I don't understand: (a) why do (1) and (3) produce the same thing, and yet, (2) and (4) produce different things? (b) what does (preceding::foo)[1] even mean? For that matter, (preceding::foo) (c) what is its unabbreviated syntax? Thanks, --chet-- XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
RE: Traverse order, Mike Brown | Thread | Using the disable-output-escaping a, Chuck White |
Traverse order, Honglin Su | Date | Re: Traverse order, Charlotte.Allen |
Month |