Re: [xsl] Find the root element from an attribute node

Subject: Re: [xsl] Find the root element from an attribute node
From: "Andrew Welch" <andrew.j.welch@xxxxxxxxx>
Date: Thu, 10 Jul 2008 14:16:18 +0100
2008/7/10 Marroc <marrocdanderfluff@xxxxxxxxxxx>:
> Hi all,  [xslt 2.0, Saxon 9]
>
> I'm processing dita and xhtml documents with the same template. All I'm
> doing is rewriting the links, that is @hef and @src attributes. However,
> I've discovered laterly, for reasons I don't want to go into, that sometimes
> the @href in the xhtml need to be handled differently. I want to detect
> whether the ancestor of the particular href is <html> as opposed to <map>,
> <task>, <concept> or <reference> so that I can treat it differently. How do
> I do it?
>
> <xsl:template match="@href[ancestor::html]">
>
> Is never going to work. I've read with bewilderment the threads about the
> xslt spec and that attributes are children of elements but elements are not
> parents of children... So, that being the case, how exactly do I find out
> where my current @href came from?


What you've done should be fine, but its slow to walk the ancestor
axis to the root element each time, so just do:

<xsl:variable name="isHTML" select="exists(/html)" as="xs:boolean"/>

and then:

match="@href[$isHTML]"

Perhaps you're doing xsl:copy within the attribute matching template?
That copies the entire attribute, name and value, the result, so its
different to the standard way of modifying an element - you have to
explicitly create a new attribute if you want to modify its value.

-- 
Andrew Welch
http://andrewjwelch.com
Kernow: http://kernowforsaxon.sf.net/

Current Thread