- From: David Carlisle <davidc@nag.co.uk>
- Date: Tue, 21 May 2002 12:11:05 +0100
- To: public-qt-comments@w3.org
[using public-qt-comments as some WG members have indicated that was
the intended comment list for F&O in common with the other documents in
this round]
2.6 xf:unique-ID
I agree with others that there seems little point in this function. If
for some reason you needed the functionality, it is just something like
@*[. instance of xs:ID] isn't it?
3.2 Numeric Constructors
Having xs:byte and friends is almost (but not quite) reasonable in
schema where it provides a shorthand to constrain integer values to
set ranges (if they are the ranges you happen to want) but I see no
reason not to map all these to a single numeric type (or
integer/float distinction at most) within Xpath. Standard Xpath
constructs can be used to ensure that any calculated value is within
range. (However I'll assume in the comments below that all the types
are kept)
3.2.1 Returns the decimal value that is represented by the characters
contained in the value of $srcval. For this constructor, $srcval
must be a string literal.
I commented on this before, as did others I believe. restricting the
constructors to literals, especially if they use a function syntax is
unreasonable. Arguments involving optimisation don't really hold as
any optimising compiler must be able to spot when a function argument
is literal and so optimise away the function call. (This is a
generic comment for all constructors, I only comment on this one.)
3.3 Operators on Numeric Values
The arguments and return types for the arithmetic operators are the
basic numeric types: decimal, float, and double and types derived from
them. For simplicity, each operator is defined to operate on operands of
the same datatype and to return the same datatype
The type promotion scheme includes only two rules:
A derived type may be promoted its base type.
decimal may be promoted to float, and float may be promoted to double.
It is not clear to me from that wording if the arguments are _always_
promoted to their base type. The use of "may" suggests not but the
examples involving integer being promoted to decimal suggest yes.
What happens if the two arguments are the same (non-base) type?
In particular I can not tell if 5 div 3 is first converted
to 5.0 div 3.0 (and so compatible with XPath 1) or, as in earlier
drafts of this document does integer division returning an integer.
similarly
3.3.5.1 Examples
op:numeric-mod(10,3) returns 1.
If 10 and 3 there are integers (which I think they are?) then it
should be made clear that 1 is not of integer type (if it isn't).
3.3.7 op:numeric-unary-minus
should this specify what happens on NaN (presumably returns NaN?)
3.4.1 op:numeric-equal
op:numeric-equal(numeric $operand1, numeric $operand2) => boolean
Returns true if and only if $operand1 is exactly equal to
$operand2. This function backs up the "eq" and "ne" operators on numeric
values.
As Jeni commented in here comments on this draft, it's not clear that
eq is particularly useful at the surface Xpath syntax (as opposed to
the semantics), if it were dropped the last phrase would need
replacing with one referring to = and !=.
4.1 String Types
The operators described in this section are defined on the following string types.
string
normalizedString
As I commented on the last draft and above for the numeric types the
justification for copying over all the schema derived types into
XPath is rather weak.
normalizedString is a particularly bad example it is just a subset of
string, in many uses of Xpath (XSLT for example) it's rather hard to
generate a string that _isn't_ in this subset.
The purpose of the datatype in schema is to instruct the parser on
the mapping from the input characters to the value space, but this is
just a parsing issue it has no use at all in XPath/XQuery.
4.2.3 xf:token
Unless there are some useful functions defined on this datatype that
are not available to strings, why would anyone use this?
4.2.8 xf:ID
The semantic correctness of ID values (that they must be unique within a
given document) is not enforced by the xf:ID function.
Since this property is the only useful property that IDs have, there
seems no point in this function, if values of type ID are not
guaranteed to be unique to a document (as they are
effectively in XPath 1, even for invalid documents) then you may as
well use string.
[Issue 144: Should the concat function accept sequences as arguments? ]
Maybe you don't want to overload concat but a mapconcat that
takes the string value of every item in a sequence and concatenates
the result would be useful (of course if you'd added proper higher
order function support this could have been done with some
combination of fold and concat, but....
4.4.5 xf:contains
How do collations work with respect to substring matching as opposed
to ordering, if ss and sharp-s collate equal, is "s" a substring of
sharp-s? (I suspect this is ignorance on my part, but I'm probably
not the only one, some examples might help, as is done in some detail
for collations and the comparison operators).
4.4.10.1 Examples
xf:normalize-space(" hello world ") returns "hello world".
As came up recently on xsl-list it would be good to have an example
of
xf:normalize-space(" ") returns "".
As some readers (surprisingly) managed to construe the XPath 1
description as allowing a return value of a space.
> A "lower-case letter" is a character whose Unicode General Category
> class includes "Ll". The corresponding upper-case letter is determined
> using [Unicode Case Mappings].
In the unicode tables each character is unambiguously upper or lower
case, but the mappings are locale-dependent.
so i is lowercase and
I and LATIN CAPITAL LETTER I WITH DOT ABOVE are both uppercase
but which of these is the the uppercase of i depends on who you ask.
(probably it just depends on whether you are in Turkey, but still...)
4.4.15 xf:string-pad
Would have been more useful in XPath 1 than it is in 2, where it
can trivially be defined as a user function.
It would be better to take out all of these "shortcut functions"
from the core language and perhaps add them again as a "standard
library" of functions that are defined within Xquery (or/and
XSLT). Many other languages follow this model, have a small core set
of functions but a larger collection of useful functions that are
provided to the end users but are (specified as being) defined using
the language rather than being a core part of the language. Of
course an implementation may or may not use the "obvious" definition
in the language or a built in optimisation.
4.4.17 xf:replace
This doesn't even come close to what is needed, but I think
a future draft will have more on this...
6.1 Duration, Date and Time Types
This is all so unspeakably horrible. It's not all your fault mind,
starting from the mass of date related constructs in W3C schema it
may be that nothing better could be done. (Sorry this isn't that
constructive a comment, I'm going to skip this section, and didn't
want lack of comment to be taken as agreement that it was all
fine...)
9.1.2 op:base64-binary-equal
Wouldn't equality on this type be more useful if it ignored
whitespace? That way equality would imply that you get the same
binary data if you decode the base64 encoding. If you really want
to check the _encoded_ string is equal you can cast to string, but
why would you want that?
11.1.6 xf:deep-equal
Should not be provided as a core fuction, you always need to write a
recursive function for the exact notion of equality that you need
(do attributes count?, namespaces? white space text nodes?)
11.1.11 xf:copy
11.1.12 xf:shallow
Should (at most) be in XQuery and not in the core XPath.
11.2.1 xf:if-absent
11.2.2 xf:if-empty
Should not be provided in the core (at most it could be provided in a
standard library) but since presumably the second argument is evaluated
whether or not the first argument is true, a user would always (?)
be better advised to use the conditional if expression.
12.2.5 xf:empty
12.2.6 xf:exists
these are simply shorthands for simple expressions, should not be in
the core.
12.3.1 xf:sequence-deep-equal
see previous comments on deep-equal
[Issue 67: Should duplicates be eliminated for count() and sum()?]
No.
12.4.2 xf:avg
Values that equal the empty sequence are discarded.
I think that that is just a special case of the (implied) operation
that what is constructed is the sequence of values of the data()
function.
the fact that empty sequences vanish is then just a consequence of the
flattening rules for sequences, and this would then also specify what
happens if some values are non-empty sequences, which is not fully
specified at present.
12.4.3 xf:max
As Jeni commented it would be useful if max could return the _item_
that has a max value rather than just its value.
12.4.5 xf:sum
As for count I think that the description on empty sequences should be
generalised to any sequence. (Also I'm pleased to see that sum() now
returns 0 on () unlike the last draft)
12.5.1 xf:id
Have to have this of course for compatibility although key() turns out
to be a lot more useful. (Which is why it is rather odd that XPath2 has => op
which is even more restricted than id().)
12.5.2 xf:idref
Not clear that this is really useful.
12.5.3 xf:filter
[Issue 167: Semantics of xf:filter are underspecified and, perhaps, incorrect.]
This function probably should be removed.
David
_____________________________________________________________________
This message has been checked for all known viruses by Star Internet
delivered through the MessageLabs Virus Scanning Service. For further
information visit http://www.star.net.uk/stats.asp or alternatively call
Star Internet for details on the Virus Scanning Service.
Received on Tuesday, 21 May 2002 07:12:14 UTC