Subject: Re: difference between select="*" and select="node()"
From: Jeni Tennison <jeni@xxxxxxxxxxxxxxxx>
Date: Mon, 8 Apr 2002 12:44:36 +0100
|
Hi Karthik,
> it's behaving the same way for me :-(
> am using Oreilly's XSLT to learn XSLT.
> It says that node() selects the attribute as well in addition to the text
> nodes.
> But still my attribute values do not get printed.
> The book also mentions that attribute needs to be selected
> explicitly to apply the default rule for attributes.
> If node() does that then why does'nt it print?
When you do:
<xsl:apply-templates select="node()" />
it's short for:
<xsl:apply-templates select="child::node()" />
In other words, it selects all the *child* nodes of the current
element. Attributes don't count as children, so you don't select any
attributes.
To select attributes, you have to use the attribute axis:
<xsl:apply-templates select="attribute::node()" />
which is more commonly shortened to '@':
<xsl:apply-templates select="@node()" />
Usually you use the node test * rather than the node test node() to select attributes
<xsl:apply-templates select="@*" />
Technically, * matches the principal node type for whatever axis you
use. The only nodes that you can find along the attribute axis are
attributes, so doing @* is the same as doing @node().
If you want to select child nodes and attributes at the same time, use
the union operator:
<xsl:apply-templates select="@* | node()" />
Cheers,
Jeni
---
Jeni Tennison
http://www.jenitennison.com/
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
|