Re: [xsl] // expanding to descendant-or-self::node()

Subject: Re: [xsl] // expanding to descendant-or-self::node()
From: Evan Lenz <evan@xxxxxxxxxxxx>
Date: Tue, 16 Sep 2008 16:55:11 -0700
Evan Lenz wrote:
Andrew Welch wrote:
currently // expands to /descendant-or-self::node()/ which is not owhat
one would first think of, but it works consistently without depending on
the following step. And that expansion is at the level of expression
terms not syntax fragments.


one might expect // to expand to descendant:: but descendant:: itself
isn't really an expression, just part of the syntax for an axis step and
that causes problems..


//foo could have been defined to be /descendant::foo
but you can not define
//@foo to be descendant::@foo as that's a syntax error, wheras
/descendant-or-self::node()/@foo is all foo attributes in the document,
which is the desired meaning.


similarly any other axis, including child::
//child::foo can't expand to /descendant::child::foo

//@foo and //child:: would both be errors - //@* would need to be
//*/@foo and //child:: doesn't make sense anyway
Not quite. If // was short for /descendant::, then //*/@foo would still not be equivalent. That's because, in XPath as actually designed, /descendant::*/@foo isn't the same as //@*. The former excepts attributes of the context node, whereas //@* also includes attributes of the context node.

So, instead, you'd have to write (@* | ./descendant::*/@*). In that case, the actual definition of // is handy.

Evan

Oops, quick correction. When starting at the document node, there wouldn't be any attributes. So what I meant to say was that .//descendant::*/@* is not the same as .//@*.

Evan

Current Thread