Mike Brown
> 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. Wendell Piez adds 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.
Summary: Vertical bar | acts not unlike an OR function
lower case and is the logical AND function |