- From: Andy Clark <andyclar@us.ibm.com>
- Date: Tue, 20 Feb 2001 12:20:06 +0900
- To: ht@cogsci.ed.ac.uk (Henry S. Thompson)
- Cc: Jim Trezzo <jim.trezzo@oracle.com>, www-xml-schema-comments@w3.org, "Trezzo,Jim" <JTREZZO@US.ORACLE.COM>
Henry,
>> Allowing the use of the descendant:: axis in XPaths used for selectors
and
>> fields has several problems. The first relates to the ability of
>> implementations to support identity constraints in an efficient manner.
>> Without this axis, implementation of identity constraints is both
>> straightforward and efficient (even for streaming XML such as SAX).
>> However, allowing the descendant axis complicates the implementation for
>> serial processors.
>
> I don't understand this point. Implementing the .//name is trivial in
> streaming mode, and corresponds exactly to what you already have to do
> to implement ID/IDREF.
I guess the real problem is the terseness of the XPath subset
description. It's unclear from the text whether the following
would be allowed:
x//y/z
x//y//z
In other words, is the descendant axis only allowed to be
used before the last element step? If so, then I agree that
the implementation is simplified.
>> The second problem relates to the fact that field values must be
compared
>> in the value space based on the attribute/element's datatype. However,
the
>> descendant axis introduces ambiguity. For example:
>> [...]
>
> It matches both, that's the whole point of having a scoped selector.
> And what's the problem, anyway? You've asserted by the above that
> 'bar' elements are unique wrt their 'baz' attribute's value. So you
> keep a table of bar attribute's 'baz' attribute's values, and throw an
> error if you hit one twice. Seems straightforward to me.
But they have different types and it's unclear which type
should be used for the value space comparison. How can you
keep a collection of values of different types and still
perform the correct comparison to ensure uniqueness? I'm
sorry to keep belaboring this point but it doesn't seem to
make sense to me.
And I have other questions regarding the subset...
Regarding field examples:
1) Why is there a sample field specified as "ancestor::x/@"
when text at the bottom of the subset states directly
that the verbose form is not allowed and no reverse
axes are allowed? Does the subset intend to allow
people to specify fields outside of the element scope
by using the ancestor axis?
2) If ancestor is allowed, why not ".." as long as it is
followed only by "@" or "x/@"?
3) If ancestor is allowed, then we have another ambiguity
because there may be multiple elements on the ancestor
axis that match the path. Are all accepted (even if
they have different types)? Is only the first matched
value selected?
4) Why aren't predicates allowed for fields?
Regarding selector examples:
5) Did the subset intentionally leave out "." as a valid
selector expression?
6) Why the explicit comment to "note only 1 level" for
the "x/y" example?
7) Is there a good reason that "[y]" is allowed? The
implementation is required to buffer the document in
order to support this. Take the following example:
selector: x[y]
field: a
field: b
<x>
<a>1</a>
<b>2</b>
<y/>
</x>
The implementation doesn't know that the values of
these particular fields should be stored until it
has seen the entire subtree. It gets more complicated
if the descendant axis is used in the fields which
may match multiple elements.
8) Why must "[@y]" appear only at the far right end? It
seems that this is easy to implement at any child
step.
9) Is there any plan to expand the allowed predicates
to include things like "[4]", "[position()<4]",
"[@a='hello']", etc?
In general:
10) Is there any explicit limit to the length of XPath
expression used for selectors and fields? It seems
no but there are places where an explicit length is
mentioned (e.g. "note only 1 level" comment).
Is there a newer subset description available? If so, please
send that to me so that I can direct my questions to the most
recent document.
-AndyC
Received on Monday, 19 February 2001 22:20:19 UTC