[XSL-LIST Mailing List Archive Home] [By Thread] [By Date]

Re: [xsl] XSLT 1.0 Namespace Help


Subject: Re: [xsl] XSLT 1.0 Namespace Help
From: "Wendell Piez wapiez@xxxxxxxxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx>
Date: Mon, 25 Aug 2014 17:36:28 -0000

Hi Bridger,

Please don't do this:

On Mon, Aug 25, 2014 at 10:36 AM, Bridger Dyson-Smith
bdysonsmith@xxxxxxxxx wrote:
> <xsl:for-each
> select="$queryDoc/*[local-name()='sparql']/*[local-name()='results']/*[local-name()='result']/*[local-name()='collection']/@uri">

Instead of asking for them by name, you are effectively asking the
processor to look at all your elements, testing each of them by
comparing (part of) its name to a literal value.  There are several
reasons why this is not as good an idea as it may seem.

If you really wish to select elements irrespective of namespace, this is better:

(A) select="$queryDoc/*:sparql/*:results/*:result]/*:collection/@uri"

or perhaps

(B) select="$queryDoc//*:collection/@uri"

or maybe

(C) select="$queryDoc//collection/@uri"
xpath-default-namespace="http://www.w3.org/2001/sw/DataAccess/rf1/result"

(referring to the namespace of the element in the source data)

or

(D) select="$queryDoc//rf1:collection/@uri"
xmlns:rf1="http://www.w3.org/2001/sw/DataAccess/rf1/result"

or (C) or (D), except with the declaration of a prefix for the
namespace, or the instruction to the XSLT engine to default to it,
promoted onto an ancestor element such as the xsl:stylesheet element.

There are a number of reasons to avoid the cumbersome
*[local-name()=$name] approach to finding elements. Among other
things, it is asking the machine how to do something (find elements by
their names) that it has already been programmed to do. This means,
for example, it is apt to be significantly slower in execution than
doing it the "right" way (using XPath name tests, not filters).

It is like going to the cheese shop, and telling the cheese man how to
tell the difference between Stilton and Double Gloucester. He already
knows the difference, and only needs you to tell him which cheese you
want.

So (in general), ask for things by name, so //*:collection if you
*really* don't know the namespace. If you do know the namespace, use
it.

> and now it's working.

Yes but only sort of!

> Apologies for the noise.

Please don't apologize for asking questions on topic! (You have
presented an extremely common solecism in XSLT.)

Cheers, Wendell

-- 
Wendell Piez | http://www.wendellpiez.com
XML | XSLT | electronic publishing
Eat Your Vegetables
_____oo_________o_o___ooooo____ooooooo_^


Current Thread
Keywords