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

Re: [xsl] better way to say "all attrs except"?


Subject: Re: [xsl] better way to say "all attrs except"?
From: Wendell Piez <wapiez@xxxxxxxxxxxxxxxx>
Date: Mon, 06 Feb 2012 12:29:55 -0500

Hi,

On 2/5/2012 10:37 PM, Graydon wrote:
On Sun, Feb 05, 2012 at 10:30:15PM -0500, Syd Bauman scripsit:
For years I've used expressoins like
    @*[not(name(.)='xml:id' or name(.)='rend')]
to ask for all of the attributes *except* xml:id= or rend=. And some
time ago Jeni recommended essentially the same approach.[1] But I'm
wondering if that isn't an XPath 1-ish way to do things, and if there
isn't a nicer way to get the same set when using XSLT 2 (and thus can
make use of XPath 2).

@* except (@xml:id,@rend)


is how that goes in XSLT 2.

Yes, and much nicer. Boo to explicit name testing.


(or @*[name(.) != ('xml:id','rend')] if you're preferential toward the
predicate, but the except is the way to go, since that's an actual node
test and keeps you out of the stringy land of names.)

Gotcha alert: that should be not(name(.) = ('xml:id','rend')). The != will always be true because every possible value of name(.) (any string at all) is != to either or both 'xml:id' and 'rend'.


But the main reason to dislike explicit name testing for this kind of thing is that it isn't namespace-safe, and is thus liable to break at inconvenient times, unlike the implicit name testing provided by path expressions. (If you really must, the XPath 2.0 node-name() function can help.)

The only tricky thing I've so far noticed about 'except' is that it
doesn't always affect the implicit context of position() just how you
would expect without the write-stuff-down-and-stare-at-it step.

Yes, you have to keep in mind that it's a set operation, so in both


attribute::* except (attribute::xml:id|attribute::rend)

attribute::type union attribute::rend
@type|@rend

the context for evaluating the second operand is the same as the context for the first, that is, we are excluding (or including) particular attribute of the context node, not of its attributes.

Cheers,
Wendell

======================================================================
Wendell Piez                            mailto:wapiez@xxxxxxxxxxxxxxxx
Mulberry Technologies, Inc.                http://www.mulberrytech.com
17 West Jefferson Street                    Direct Phone: 301/315-9635
Suite 207                                          Phone: 301/315-9631
Rockville, MD  20850                                 Fax: 301/315-8285
----------------------------------------------------------------------
  Mulberry Technologies: A Consultancy Specializing in SGML and XML
======================================================================


Current Thread
Keywords