Much thanks all.
I don't know why I didn't realize the child axis is always implied (I've
even read that part from Kay's book). I started thinking about all the
different types of queries you can do with the axis and I tripped my self
up. I didn't even need anything other than the X[Y] concept Jeni mentioned
(X/Y[Z[local-name()=$v]] in my case).
-----Original Message-----
From: Jeni Tennison [mailto:jeni(_at_)jenitennison(_dot_)com]
Sent: Tuesday, October 29, 2002 12:03 PM
To: Adam Griffin
Cc: Xsl-List (E-mail)
Subject: Re: [xsl] Understanding axis
Hi Adam,
I've been learning the use of axis in transformations and I stumbled
on something that didn't seem to make sense...
local-name( */* )
local-name( */child::* )
return the same values. I would have thought...
local-name( */child::* )
local-name( */*/* )
would be the same (which they aren't).
You're right that they aren't. A location path is made up of several
steps, separated by /s. Each step is made up of an axis and a node
test. The default axis, if none is specified explicitly, is child. So:
*/*
is exactly the same as:
child::*/child::*
Could somebody help me reason out why it is this way? This seems to
complicate scenarios where I would only want certain nodes based
upon their children without changing context. For instance,
something like:
<xsl:for-each select="*/child::*[local-name()=$v]">
</xsl:for-each>
read as I only want */* where they have a child named $v.
I think that you want:
<xsl:for-each select="*/*[*[local-name() = $v]]">
...
</xsl:for-each>
Long version:
<xsl:for-each select="child::*/child::*[child::*[local-name() = $v]]">
...
</xsl:for-each>
Whenever you say something like "I want X where Y" then you need a
path in the form "X[Y]".
Cheers,
Jeni
---
Jeni Tennison
http://www.jenitennison.com/
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list