Re: [xsl] RE: unbelievable often asked question

Subject: Re: [xsl] RE: unbelievable often asked question
From: Wendell Piez <wapiez@xxxxxxxxxxxxxxxx>
Date: Thu, 02 Jan 2003 14:25:36 -0500
As a footnote to what Mike B. says about "|": strictly speaking it's the union operator even when appearing in match patterns. This makes sense if you think about match patterns in the way the spec describes:

"A node matches a pattern if the node is a member of the result of evaluating
the pattern as an expression with respect to some possible context; the
possible contexts are those whose context node is the node being matched or
one of its ancestors" [XSLT 5.2]


Admittedly that's more than a mouthful: but it makes sense if you think about it that the union operator could be used in such a context to get an effective "match this node *or* this other node". Note that the Boolean "or" is not so useful (and in fact the spec has just stipulated that "An expression that is also a pattern always evaluates to an object of type node-set", and an "or" operator always evaluates to a Boolean).

What's worse (or better :-): in practice, the union operator and the "or" operator can give effectively the same results, as in select="*[red|green]" vs. select="*[red or green]". In the first case, an element "*" is selected if the node set of "child::red|child::green" (union of red children and green children) evaluates to Boolean true() for that element, which is the case if this set contains any members (which will be so if the element has either any red element *or* any green element children). In the second, an element "*" is selected if the node set containing red children is evaluated as Boolean true() (i.e. there are any red children) *or* if the node set containing green children is evaluated as Boolean true(). (I guess the mathematicians can say whether this is some distributive property or what.)

While this is nice, it's also understandable why it's easy to get mixed up about what's really going on with "|". It's not really an "or" at all.

Cheers,
Wendell

At 01:38 PM 1/2/2003, Mike wrote:
Hubert Holtz wrote:
> I often visit tutorial-sites to get my informations (and now this great
> mail-list) and there was no "and", only a | for or.

"|" never really means "or".

In an XSLT pattern, which is what goes in a "match" attribute, it's just a
separator between node tests when used in a pattern. Depending on how you like
to interpret your code into English, you might use the words "or" or "and"
informally.


For example, <xsl:template match="foo|bar"> says this template is a good match
for a node that matches the test foo (element named foo in no namespace), and
it is also a good match for a node that matches the test bar (element named
bar in no namespace). Since a programmer might be used to reading "|" as
"or", it would be just as correct to say "this template is a good match for a
foo or a bar".

In an XPath expression, "|" is a set union operator.

In mathematics, a set is an unordered group of values, typically written (in
math, not XPath) as a comma-separated list inside curly braces: {1,2,3,4}.
Order doesn't matter. The union of two sets is the result of merging them and
eliminating duplicates. The union of {1,2,3,4} and {2,3,5} is {1,2,3,4,5}.

In XPath, it works the same way with nodes. select="foo|bar" means to use the
union of the node-set {all child::foo elements} and the node-set {all
child::bar elements}, producing the node-set.

Note that I'm mixing notations here; there are no curly braces in XPath, and
in XSLT they are only used in XSLT Attribute Value Templates to delimit XPath
expressions embedded in literal attribute values.

Mike

--
  Mike J. Brown   |  http://skew.org/~mike/resume/
  Denver, CO, USA |  http://skew.org/xml/

XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list


======================================================================
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
======================================================================


XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list



Current Thread