- From: Erik Bruchez <ebruchez@orbeon.com>
- Date: Fri, 27 Apr 2007 17:32:03 +0800
- To: www-forms-editor@w3.org
All,
What this is about
------------------
This comment is about xforms-compute-exception and
xforms-binding-exception, in particular:
* The clarity (or lack thereof) of the current wording.
* The need for an xforms-compute-error event.
The current text
----------------
For reference:
Section "4.5.4 The xforms-compute-exception Event" says:
"Dispatched as an indication of: an error occurring during XPath
evaluation for a model item property [...]"
The introduction to section "7 XPath Expressions in XForms" says:
"XPath expressions that are not syntactically valid, including
attempted calls to undefined functions, result in an exception
(4.5.4 The xforms-compute-exception Event), except for binding
expressions, which produce a different exception (4.5.1 The
xforms-binding-exception Event)."
Section "7.6 The XForms Function Library" says:
"If an error occurs in an XPath function, an
xforms-compute-exception occurs if the function appears in the
expression of a model item property. If the error occurs in a
function that appears in any other XForms attribute that contains
an XPath expression, such as nodeset, ref or at, then an
xforms-binding exception occurs."
Section "7.12 Extension Functions" says:
"XForms Processors perform this check at the time the document is
loaded, and stop processing by signaling an exception (4.5.4 The
xforms-compute-exception Event) if the XForms document declares an
extension function for which the processor does not have an
implementation."
One thing to keep in mind
-------------------------
As hinted by Mike Kay in his LC comments [1] from the XSL and XQuery
WG, XPath 2.0 explicitly makes a distinction between two types of
errors: static errors (which do not require evaluating expressions,
i.e. typically syntactic errors) and dynamic errors (errors occurring
while evaluating the XPath expression).
I think that in XPath 1.0, the behavior of standard functions is
designed so that you don't get dynamic errors. For example, converting
a string to a number type will return NaN if the conversion fails,
while with XPath 2.0 casting an xs:string that does not represent an
integer to xs:integer will raise a runtime error.
This said, while XPath 1.0 does not make this distinction explicitly,
XForms does talk about a type of dynamic errors in the intro to
section 7.6 under "if an error occurs in an XPath function", and also
mentions errors occurring "during XPath evaluation" in section
4.5.4. So we do have, in XForms 1.0, static AND dynamic XPath errors,
whether these terms are used or not.
The problems
------------
I am confused by the current text, which in my eyes contradicts itself
at times, and does not clearly lay out the intent of these events.
1. Section 7 indicates with the words "binding expressions" that the
intent of a "binding exception" is to signal there is an error with
a binding, whether the syntax is incorrect or whether there is a
runtime error. I understand this to regard any XPath expression not
only in xforms:bind/@nodeset but also in @ref/@nodeset expressions
that bind controls to instance data.
Issue #1: Section 7.6 says that syntax errors in attribute @at
dispatch xforms-binding-exception. I think that this is wrong, as
@at does not define a binding at all.
(Note that xforms-binding-exception can also be dispatched for
mismatched ids, etc., but here I am only interested in XPath
expressions).
2. It seems that section 7.12 is the only place where the spec hints
that the XForms engine must check the syntax of XPath expressions.
Issue #2: It must be made 100% explicit that during XForms
initialization (exact place TBD), every single XPath expression in
the XForms document is checked for its syntax, and not only for
undeclared extension functions. This includes XPath expressions on
XForms actions, such as xforms:setvalue/@value, etc., XPath
expressions in @if and @while attributes on actions as well, and
also @context on actions. Such static XPath errors should dispatch
xforms-binding-exception or xforms-compute-exception depending on
whether the XPath expression is in a binding or not (see #4 below
as well).
3. xforms-binding-exception is not cancelable and halts XForms
processing altogether. It seems reasonable to do this for MIP and
control bindings, because there isn't much you can do with such an
error in your XForms document. But what about other uses of @ref
and @nodeset?
Issue #3: Is it reasonable to dispatch xforms-binding-exception
and fatally stop XForms processing for xforms:setvalue/@ref or
xforms:insert/@nodeset?
I think that the answer to this question is "yes" provided issue #2
above is resolved to mandate that all expressions are checked for
syntax during initialization.
4. @ref and @nodeset on actions are single-node and node-set bindings
respecively, but they don't act like MIP or control bindings.
Issue #4: Should errors in XPath expressions on @ref and @nodeset
on actions dispatch xforms-binding-exception or
xforms-compute-exception?
An action is not really "bound" to a node as a MIP or control
is. So as a form author, I am not sure why xforms:setvalue/@ref
would dispatch a different event from xforms:setvalue/@value.
5. My understanding is that errors in other XPath expressions,
including xforms:bind/@calculate, xforms:insert/@at,
xforms:setvalue/@value, etc. should dispatch
xforms-compute-exception.
But the problem with this is that any error, whether static or
dynamic, halts XForms engine processing altogether. This is not a
huge problem with XPath 1.0, as mentioned above, since dynamic
errors are fairly rare (if possible at all with the standard XPath
1.0 function library) and most likely confined to extension
functions.
Still, it appears reasonable to think that you can recover from
dynamic XPath errors, and this is certainly the case when such
errors do not occur in bindings. This also prepares XForms for a
future where XPath 2.0 is supported, as also suggested by Mike Kay
in [1].
Issue #5: Dynamic XPath errors should dispatch a new event:
xforms-compute-error (and possibly xforms-binding-error), which
do not halt XForms engine processing. Whether to support
xforms-binding-error for MIP and control bindings can be
discussed, but it would make sense for xforms:setvalue/@ref and
the likes as those errors can often be recovered.
A possible strategy
-------------------
Here is a tentative strategy based on the above:
* Dispatch xforms-binding-exception for static XPath errors occurring
in @ref and @nodeset expressions on xforms:bind and controls
bindings. Static errors must be checked during XForms engine
initialization.
* Also dispatch xforms-binding-exception for dynamic XPath errors
occurring in @ref and @nodeset expressions on xforms:bind and
controls bindings.
* Dispatch xforms-compute-exception for static XPath errors occurring
anywhere else, including single-node or node-set bindings on
actions. Static errors must be checked during XForms engine
initialization.
* Dispatch xforms-compute-error (a new event) for dynamic XPath errors
occurring anywhere else.
While this is done, the relevant text in the spec should be
consolidated and clarified.
-Erik
[1] http://lists.w3.org/Archives/Public/www-forms-editor/2007Apr/0052.html
--
Orbeon Forms - Web Forms for the Enterprise Done the Right Way
http://www.orbeon.com/
Received on Friday, 27 April 2007 09:32:13 UTC