self axis and attributes

Subject: self axis and attributes
From: Jeni Tennison <mail@xxxxxxxxxxxxxxxx>
Date: Fri, 17 Nov 2000 16:20:25 +0000
[Disclaimer: this post contains light-hearted political comment as a
 way of spicing up an otherwise tediously technical XPath question.
 Please don't send me hate mail.]


Since David C. showed me the utility of the self:: axis in checking
the identify of an element, I've been using it mercilessly.  For
example, with an input of:

<vote xmlns:d="";
   <county>Palm Beach</county>

I wrote a stylesheet to prove my worth to my new masters (they wooed
me with client-side XSLT! how could I refuse their dark gift?!):

<xsl:stylesheet version="1.0"

<xsl:template match="vote">
      <dem:count><xsl:value-of select="rep:count - 432" /></dem:count>
      <xsl:copy-of select="*[not(self::dem:count)]" />


Note in the above that the namespaces in the input and the stylesheet
differ from each other: in the input it's 'd', in the stylesheet,
'dem'. The self:: axis handily translates the 'dem' to 'd' when doing
the comparisons: if I were to use:

   *[not(name() = 'dem:count')]

then the original count would get through; if I were to use:

   *[not(local-name() = 'count')]

then I'd lose the Republican count, neither of which would please my
dark lord.

So it was all fine and dandy until the Jewish-Communist conspiracy
changed the XML schema and started using attributes instead of

<vote xmlns:d="";
      county="Palm Beach"
      r:count="23725" />

I thought I might be able to just add a '@':

<xsl:template match="vote">
      <xsl:attribute name="dem:count">
         <xsl:value-of select="rep:count - 432" />
      <xsl:copy-of select="@*[not(self::dem:count)]" />

but no! The self:: axis's principal node type is element, and since
the attribute is not a dem:count element, it still gets included! The
best I can do whilst retaining independence between the stylesheet and
source is:

  @*[not(local-name() = 'count' and
         namespace-uri() = document('')/*/namespace::dem)]
                        or hand-code, or variable, or entity

[Please don't tell me to swap the xsl:attribute for the xsl:copy-of to
 override the dem:count - I'm looking for a general solution.]

Am I missing something? Is there any way of testing the identity of
namespaced attributes while retaining independence between the source
and stylesheet and without testing the namespace-uri()?

Thanks for your help,

Jeni Tennison

 XSL-List info and archive:

Current Thread