Re: [xsl] XSLT 2.0 courses?

Subject: Re: [xsl] XSLT 2.0 courses?
From: "Michael Kay mike@xxxxxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx>
Date: Mon, 21 Sep 2020 10:53:19 -0000
Well, I thought about using EBV, so it means (if ($a) then $a else $b), but
zero is falsey, so you get surprises with, for example

@price * (1 + (@VAT_Rate otherwise 0.2))

which potentially gives the wrong answer if @VAT_Rate is present but zero. And
it also gets complicated with atomization: if the attribute is present but set
to a zero length string, which way do you go?

Michael Kay
Saxonica

> On 21 Sep 2020, at 11:21, Imsieke, Gerrit, le-tex gerrit.imsieke@xxxxxxxxx
<xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx> wrote:
>
> If the boolean variable $a is false() instead of an empty sequence,
>
> $a otherwise $b
>
> will return false(). This is the specified behaviour, but I find it a bit
counterintuitive. I have a slight preference for the otherwise operator to
return $b if $a is false().
>
> Have you thought about defining the otherwise operator as "it returns $a
unless it's an empty sequence or a boolean value equal to false(), in which
case it returns $b"? I'm not sure which one will seem more natural to most
users.
>
> Gerrit
>
> On 21.09.2020 10:46, Michael Kay mike@xxxxxxxxxxxx wrote:
>> I've been proposing ($a otherwise $b) to meet this requirement: it returns
$a unless it's an empty sequence, in which case it returns $b.
>> For example @price - (@discount otherwise 0)
>> It's actually implemented in Saxon 10 if you switch syntax extensions on.
>> Michael Kay
>> Saxonica
>>> On 21 Sep 2020, at 02:34, Pieter Lamers pieter.lamers@xxxxxxxxxxxx
<mailto:pieter.lamers@xxxxxxxxxxxx> <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx
<mailto:xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx>> wrote:
>>>
>>> Hi,
>>>
>>> An avid user of ($a, $b)[1] myself, which winks at TransactSQL ISNULL($a,
$b) and MySQL IFNULL($a, $b), I do have to remind myself that $a has to be a
single item for the /if/else /shortcut to work.
>>>
>>> So, in
>>>
>>> let $a := ('one','two','three')
>>> let $b := ('none')
>>>
>>> return ($a, $b)[1] will return just the first item in the sequence, 'one',
and not 'one','two','three', which might be what you want to achieve in this
quasi shorthanded /if/else /construction.
>>>
>>> Not that you wouldn't know, Liam, just as a heads up to some others in
this audience who might not.
>>>
>>> Best,
>>> Pieter
>>>
>>> On 19/09/2020 01:54, Liam R. E. Quin liam@xxxxxxxxxxxxxxxx wrote:
>>>> On Fri, 2020-09-18 at 19:31 +0000, Wendell Piezwapiez@xxxxxxxxxxxxxxx
>>>> wrote:
>>>>> Hi,
>>>>>
>>>>> In addition to Liam's list I think there are a couple more vital
>>>>> features
>>>>> one needs to get a taste of in XSLT 2.0 or XSLT 3.0, if one has been
>>>>> subsisting on an XSLT 1.0 diet:
>>>>>
>>>>> * <xsl:for-each-group> and its uses
>>>>> * temporary trees -
>>>>> * regex support in functions and xsl:analyze-string
>>>>> * tunnel parameters?
>>>> Yeah, those are all huge, although i think easier to learn than things
>>>> like ($a, 'none')[1], which are startling because XSLT 1 didn't have
>>>> sequences.
>>>>
>>>> For those wondering, ($a, $b, $c, ...)[1] returns the first non-empty
>>>> non-false item out of $a, $b and $c, so it's a shortcut for
>>>>     <xsl:sequence select="if ($a) then $a else $b" />
>>>>
>>>>
>>>> On regular expressions - it's huge, but it's also dangerous, as e.g.
>>>> replace(price div 100, '\.\d*$', '') is not a good way to write
>>>> math:floor().
>>>>
>>>> An XSLT-3-from-scratch course could easily take a full week and be
>>>> woefully incomplete. Or totally overwhelming. Or both.
>>>>
>>>> On the other hand, i try & include "don't be afraid of the specs" in
>>>> the courses i teach, and then not cover every detail. So maybe it's
>>>> possible.
>>>>
>>>> Liam

Current Thread