Subject: Re: curious behavior of select= and predicates
From: "Robert P. J. Day" <rpjday@xxxxxxxxxxxxxx>
Date: Thu, 20 Mar 2003 11:21:14 -0500 (EST)
|
On Thu, 20 Mar 2003, Jeni Tennison wrote:
> Hi Robert,
>
> > 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
>
> A predicate is only allowed in a Step, not with an AbbreviatedStep.
> "." is not textually replaced by "self::node()".
ah, sure enough, once i looked up "AbbreviatedStep" in Kay, i find,
"Note that neither . nor .. can be followed by a predicate:".
argh. so many details, so little time.
> > 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>
>
> No. Within the predicate, the position() function returns the position
> of the context node (the node that you're testing with the predicate)
> amongst the nodes that you've selected in the step. You've only
> selected one node with the step, the <car> element itself. The
> position of the <car> element that you're testing with the predicate
> is always 1 because you only select one of them.
and once i think about it, that makes perfect sense, too.
> To test the position of the <car> element amongst the <car> elements
> that are having templates applied to them, use the position() function
> outside the predicate, where the current node list is made up of those
> <car> elements. Use:
>
> <xsl:template match="car">
> <xsl:if test="position() = 3">
> <xsl:value-of select="." />
> </xsl:if>
> </xsl:template>
i'd actually verified that the above worked before trying
to work the position into the predicate.
how the heck do you people remember all this stuff?
rday
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
|