xsl-list
[Top] [All Lists]

Re: Understanding axis

2002-10-29 10:03:17
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



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