- From: Kay, Michael <Michael.Kay@softwareag.com>
- Date: Tue, 4 Feb 2003 17:04:24 +0100
- To: Ashok Malhotra <ashokma@microsoft.com>, xquery@attbi.com, public-qt-comments@w3.org
Additional comments from Michael Kay > > 3 (Error function) and Issue #181 (semantics of fn:error) > > Consider aligning this function with XSLT's message system > (which can optionally terminate or not). > > ---- > [AM] The error function may be implemented in different ways > by languages that use Xpath. XSLT may want to use the > message system but this is their decision. I think that they may have been suggesting an option where fn:error() produces an error message but doesn't terminate. This aligns with another proposal to add an fn:trace() function. I can see something like this being needed in XQuery - I don't think it's needed in XPath. > > 8.3.1-8.3.21 (op:*-equal) Useless definitions > > "Returns true if and only if $operand1 is exactly equal to > $operand2." Well, duh. But what is the meaning of the phrase > "is exactly equal to" ?? [AM] Should we say valuesd are > exactly equal. It's hard to say something useful without a > multi-page disquisition on equality. Feel free to suggest > alternate wording. We definitely need to say, for each data type, exactly what we mean by equality. This comment has been made a number of times. In most cases I don't think it needs a multi-page disquisition. In some cases we can refer to the XML Schema definition, but not in all cases. > 13.1.7 (fn:deep-equal) > The equivalent XQuery given for deep-equal() is incorrect. When both nodes lack > a name, the second condition fails. Not quite The test (node-name($a) != node-name($b)) returns true if there is a pair of items, one from node-name($a) and one from node-name($b), that are not equal to each other. If neither node has a name, then there is no such pair, so we take the "else" branch. The test is wrong, however, if one node has a name and the other does not. I think the test should be written: if (!sequence-deep-equal(node-name($a), node-name($b))) then false() else after correcting the handling of () by sequence-deep-equal, noted below. > > 14.3.1 (fn:sequence-deep-equal) > > The sequence-deep-equal() function is strangely asymmetric with the > sequence-node-equal() function. The latter returns the empty > sequence if either argument is empty, but the former does not. > > [AM] I'll raise this with the taskforce. > It's clearly a nonsense that sequence-deep-equal returns () when one of the sequences is empty. It should return false if one is empty, true if they are both empty. In fact sequence-deep-equal($a, $b) should be defined as: count($a) = count($b) and every $i in (1 to count($a)) satisfies ( if ($a[i] instance of atomic and $b[i] instance of atomic ) then ($a[i] eq $b[i]) else if ($a[i] instance of node and $b[i] instance of node) then deep-equal($a[$i], $b[$i])) else false() } While sequence-node-equal($a, $b) should be defined as: count($a) = count($b) and every $i in (1 to count($a)) satisfies $a[$i] is $b[$i] Michael Kay
Received on Tuesday, 4 February 2003 11:04:36 UTC