Re: [xsl] Use of xsl:apply-templates exception with an element

Subject: Re: [xsl] Use of xsl:apply-templates exception with an element
From: ac <ac@xxxxxxxxxxxxx>
Date: Fri, 25 Sep 2009 15:32:39 -0400
Hi Ken,

I understand local-name and namespace uris, but isn't strange that you can use
<xsl:copy-of select="*[@self::attribution]"/>
but not
<variable name="name" select=" 'attribution' "/>
...
<xsl:copy-of select="*[@self::{$name}]"/>
for example.


Or similarily,
<xsl:copy-of select="*[@self::{@name}]"/>

Isn't this inconsistent from the language?


It also seems to get dirtier if you try to better express something like <xsl:copy-of select="*@[name() = ($name1, $name2, $name3, $name4, ...)]"/>, for example

I would prefer
<xsl:copy-of select="*@[self::{$name1} or self::{$name2} or self::{$name3} or self::{$name4} or ...)]"/>
to
<xsl:copy-of select="*@[(local-name()=$name1 and namespace-uri()=$ns1) or (local-name()=$name2 and namespace-uri()=$ns2) or (local-name()=$name3 and namespace-uri()=$ns3) or (local-name()=$name4 and namespace-uri()=$ns4) or ...]"/>
where I also have to declare variables $ns1, $ns2, $ns3, $ns4, ...
as well as know that (and hard-wired) local-name $name1 is used with uri $ns1, and local-name $name2 is used with with uri $ns2, and local-name $name3 is used with uri $ns3, and local-name $name4 is used with uri $ns4, and ...
and where maintenance and debugging can also start to get tricky.


Even your initial proposal to use
<xsl:copy-of select="*[@self::attribution]"/>
is really
<xsl:copy-of select="*[@self::ns:attribution]"/>
if not in the default or no namespace namespace
matching the prefix and not the uri

What do you think?

Thanks,
ac




At 2009-09-25 11:41 -0400, ac wrote:
What should be done if the element name is in an attribute or variable, as
<variable name="name" select=" 'attribution' "/>


Can name() be avoided here also?

Yes it must be avoided because you have to use both local-name() and namespace-uri() in order to break apart the qualified name of the node into its components and compare each of those:


<xsl:apply-templates
     select="*[not(local-name()=$name and namespace-uri()=$ns)]"/>

Both are needed in the general case, not just local-name(), because the user might be using the default namespace. In that case the local part might compare equal but the URI could be different.

I hope this helps.

. . . . . . . . . . . Ken


-- Upcoming hands-on code list, UBL, XSLT, XQuery and XSL-FO classes. Interested in other classes? http://www.CraneSoftwrights.com/s/i/ Crane Softwrights Ltd. http://www.CraneSoftwrights.com/s/ Training tools: Comprehensive interactive XSLT/XPath 1.0/2.0 video Video lesson: http://www.youtube.com/watch?v=PrNjJCh7Ppg&fmt=18 Video overview: http://www.youtube.com/watch?v=VTiodiij6gE&fmt=18 G. Ken Holman mailto:gkholman@xxxxxxxxxxxxxxxxxxxx Male Cancer Awareness Nov'07 http://www.CraneSoftwrights.com/s/bc Legal business disclaimers: http://www.CraneSoftwrights.com/legal

Current Thread