Re: [xsl] The identity transform and attributes

Subject: Re: [xsl] The identity transform and attributes
From: Abel Braaksma <>
Date: Mon, 21 Jan 2008 13:36:32 +0100
Andrew Welch wrote:
On 21/01/2008, David Carlisle <davidc@xxxxxxxxx> wrote:
It's certainly not intuitive that when you what to just change the
attribute's value you have to create a new attribute node
Intuition is a personal thing but I don't see why that's not
intuitive. xslt never updates nodes in place, so you always generate new

Sure, but I meant along the lines of copy vs create... To update an
element's "value" you tend to copy it rather than create a new one.
To update an attribute's value I would say it's intuitive to try the
same approach, especially when the name and value are clearly separate
(to me!).

My intuition is the same as yours ;) I understand the reasoning behind the decisions, but I find myself doing a lot of extra work when I am dealing with attributes. I always have to remind myself whether it is an attribute node or an element node. Funnily enough, I don't have that same problem with text nodes or document nodes, somehow I find them (though different) more "intuitive".

Attributes are leaf nodes and work the same way as namespace nodes, and
PI nodes (that is they have a name and value but no children) element
nodes are the only ones to have name and children, document nodes have
children but no name, and comments and text nodes have a value but no

I've been caught out before doing things like:

<xsl:template match="@*[not(self::foo)]">

...which doesn't work - you have to use name()

or the following (not tested), which has the advantage of not using unschema-aware strings:

<xsl:template match="@*[not(../@foo is .)]

but that's hardly clearer

Again, I don't know why the self axis isn't available for attribute
nodes... any ideas?

Not 100% certain here, but I vaguely remember that self:: only works on elements and document nodes, not on other node types (i.e., a text node does not have a self:: axis, nor does a PI or a comment) . And an attribute's self:: axis would naturally be an attribute axis, which cannot hold.

-- Abel --

Current Thread