xsl-list
[Top] [All Lists]

RE: curious behavior of select= and predicates

2003-03-20 09:50:17
[Robert P. J. Day]
 
  [more pedantics involving simple examples.  the following results
are from "xsltproc", so it may be a processor-related thing.]


  First oddity -- i had always understood that "self::node()" could
be abbreviated as just ".".  but if i replace the select expression
with ".[displacement]", i get the error


Predicates are not allowed for the "." and ".." shorthand syntax.  Why?
Unclear, but it is in the XPATH Rec.


  should i not expect "self::node()[displacement]" to be logistically
equivalent to ".[displacement]"?  or did i misread something?
  

You would but it is specifically disallowed.

Second puzzler
--------------

  I want the "car" template to return its string value only if it's
the third in context position.  (again, a weird thing to do but humor
me.)  shouldn't i be able to write:

<xsl:template match="car">
 <xsl:value-of select="self::node()[position() = 3]"/>  # just pos 3
</xsl:template>

  instead, i get nothing, even though i've verified that the 
consecutive
invocations of the "car" template do, in fact, run through the context
positions 1 -> 4 for each "car" element.


You are asking for the context node - which is the only node on the self
axis -, to return all  its nodes and then of those, then return the
string value of the third.  The self axis will only return the context
node, so position() = 3 will never return anything (only position() = 1
will).  You can check this out by writing 

=<xsl:copy-of select="self::node()"/>=

and see what you get.

If you want to see data of the just the third car, you could write 

<xsl:if test='position()=3'><xsl:value-of select='model'/></xsl:if>



Cheers,

Tom P

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



<Prev in Thread] Current Thread [Next in Thread>