[xsl] Re: [saxon] Pattern matching error in xsl:key

Subject: [xsl] Re: [saxon] Pattern matching error in xsl:key
From: "Dimitre Novatchev dnovatchev@xxxxxxxxx" <xsl-list-service@xxxxxxxxxxxxxxxxxxxxxx>
Date: Sat, 5 Sep 2020 17:54:59 -0000
> So I have ended up doing an eq comparison and quoting the $source and
$target, which is what I was trying to avoid.

Why do you think any logical reasoning would result in deciding that the
type of $source below must be a string?

>  <xsl:param name="source" select="4.0"/>

The value of the "select" attribute is evaluated as an XPath expression,
What is the type of the xpath expression (hint: it is obviously a decimal
number):

   4.0

Why do you think anyone should conclude that this is a string?

Just curious...

Cheers,
Dimitre

On Sat, Sep 5, 2020 at 10:49 AM Ihe Onwuka <ihe.onwuka@xxxxxxxxx> wrote:

>
>
> On Sat, Sep 5, 2020 at 11:56 AM Martin Honnen <martin.honnen@xxxxxx>
> wrote:
>
>> Am 05.09.2020 um 17:34 schrieb Ihe Onwuka:
>>
>> > No doubt in excerpting I omitted some relevant info. I'll try and fix
>> > that. The XML content is in a separate document and globally namespaced.
>> > Here.
>> >
>> > <versionChanges xmlns="http://changes"; >
>> >    <changes from="4.0" to="4.1">
>> >       <rename>
>> >          <metadata/>
>> >       </rename>
>> >    </changes>
>> > </versionChanges>
>> >
>> > and here is the error message
>> >
>> > Warning at char 11 in xsl:key/@match on line 36 column 111 of
>> > myStylesheet.xsl:
>> >    XPTY0004  An error occurred matching pattern
>> >
>> > {element(Q{http://changes}changes)[((data(attribute::attribute(Q{}from)))
>> eq
>> >    (atomizeSingleton($source))) and
>> ((data(attribute::attribute(Q{}to))) eq
>> >    (atomizeSingleton($target)))]}:
>> >
>> >     My guess would be that it's a type error connected with the fact
>> >     you're comparing numbers to strings, but beyond that,
>> >
>> >
>> > I am comparing parameters whose values are 4.0 and 4.1 respectively to
>> > attributes whose values are 4.0 and 4.1 respectively. Saxon has made
>> > it's own assumptions about what types they are and come up with that
>> error.
>>
>> The types are not made up by Saxon but are defined in the XPath/XSLT
>> specs. In the XSLT code if you declare
>>
>>    <xsl:param name="source" select="4.0"/>
>>
>> the expression 4.0 in the select attribute is of type xs:decimal (in a
>> version="2.0" or version="3.0" XSLT code).
>>
>> However, in your untyped XML the attribute value of e.g. @from or @to is
>> of type xs:untypedAtomic.
>>
>> The eq operator only works if both operands have a comparable type, in
>> your case the rules in
>> https://www.w3.org/TR/xpath-31/#id-value-comparisons (5.d) give
>> "Otherwise, a type error is raised [err:XPTY0004].".
>>
>> So using = instead of eq is one way to avoid that, as it in 4.a of
>> https://www.w3.org/TR/xpath-31/#id-general-comparisons stipulates: "If
>> at least one of the two atomic values is an instance of a numeric type,
>> then both atomic values are converted to the type xs:double by applying
>> the fn:number function".
>>
>>
> Correction to my earlier post.
> Using = instead of eq changes the behaviour of the program and it ends up
> incorrectly omitting some of the output.
>
> I'm not going to investigate why because I shouldn't be using an
> existential evaluator anyway.
>
> So I have ended up doing an eq comparison and quoting the $source and
> $target, which is what I was trying to avoid.
>
>
>
> _______________________________________________
> saxon-help mailing list archived at http://saxon.markmail.org/
> saxon-help@xxxxxxxxxxxxxxxxxxxxx
> https://lists.sourceforge.net/lists/listinfo/saxon-help



-- 
Cheers,
Dimitre Novatchev
---------------------------------------
Truly great madness cannot be achieved without significant intelligence.
---------------------------------------
To invent, you need a good imagination and a pile of junk
-------------------------------------
Never fight an inanimate object
-------------------------------------
To avoid situations in which you might make mistakes may be the
biggest mistake of all
------------------------------------
Quality means doing it right when no one is looking.
-------------------------------------
You've achieved success in your field when you don't know whether what
you're doing is work or play
-------------------------------------
To achieve the impossible dream, try going to sleep.
-------------------------------------
Facts do not cease to exist because they are ignored.
-------------------------------------
Typing monkeys will write all Shakespeare's works in 200yrs.Will they write
all patents, too? :)
-------------------------------------
Sanity is madness put to good use.
-------------------------------------
I finally figured out the only reason to be alive is to enjoy it.

Current Thread