Re: Controlling relevance in XForms 1.0 without changing context node and without using @context

Hi Adrian,

:) You are right that the spec isn't completely clear, but as it
happens, the picture is not too difficult.

I think the best way to look at it is that in general, you can use
*any* expression in a UI binding, and you don't really need to worry
about it.

So, at it's simplest you can do this:

  <xf:input ref="a">
    <xf:label>A:</xf:label>
  </xf:input>

  <xf:input ref="b">
    <xf:label>B:</xf:label>
  </xf:input>

  <xf:output value="a + b">
    <xf:label>Total:</xf:label>
  </xf:output>

And 'a + b' will be recalculated for you whenever there is a refresh.
Note that unfortunately, this has nothing to do with the dependency
graph, since all that happens in the refresh phase is that all
controls must update themselves. I know that many processors have
actually created a second dependency graph so as to be able to
optimise this processing, but it's a shame the spec is silent on this.

Anyway, that's not what we're discussing here, but the key point is
that when a refresh happens your calculation is updated.

Now, what if we have instance data like this:

  <data item="1" xmlns="">
    <a />
    <a />
  </data>

and controls like this:

  <xf:input ref="@item">
    <xf:label>Choose an item to edit:</xf:label>
  </xf:input>

  <xf:input ref="a[/data/@item]">
    <xf:label>Item:</xf:label>
  </xf:input>

This is a dynamic dependency, since if @item is 1, we are binding our
input to the first 'a' node, and if @item is 2 we are binding our
input to the second 'a' node. Now since 'binding' implies a
relationship between the node in the model and the control, such that
events are passed, styling is set, and so on, then we have to do a lot
of work if the node for the second input changes, and in the XForms
spec this is called 'rewiring', and it happens during the refresh
phase.

Note that all of this is happening independently of the dependency
engine, so we don't need to worry about dynamic dependencies. But when
we use the calcuation engine in bind statements, things are very
different.

Let's say that we want the 'a' being edited to be invalid if it is less than 10:

  <xf:bind nodeset="a[/data/@item]" constraint=". &lt; 10" />

Now we have to change the node that this expression is bound to--i.e.,
the node referred to in the dependency graph--every time the value in
@item changes. However, in the world of the dependency engine this
cannot happen until there is a rebuild--there is no notion of
'rewiring' automatically. The dependency graph of all the expressions
contains references to nodes, as a kind of 'snapshot', and when the
value of any node changes, the graph is used by the engine to work out
what calculations need to be re-run, and those that can be ignored. So
a bind statement like this is easy for the engine:

  <xf:bind nodeset="a" calculate="/data/@item" />

If @item changes then the expression is re-evaluated, and 'a' is
updated. But that is not the case for our previous example--if @item
changes in the previous example you are referring to a completely
different node, and the entire dependency graph needs to be
re-evaluated.

So that's what the spec means when it says that the author needs to
take care of this themselves! The author would have to trigger a
rebuild after any modification to @item, if they wanted to ensure that
the node represented by the statement:

  a[/data/@item]

Regards,

Mark

On 08/10/06, Adrian Baker <adrian@fastmail.net> wrote:
>
> Hi Mark,
>
> I guess I took Leigh's '/your/condition/here' path as just a placeholder
> for any expression! So sure, that path would be fine. Just to be clear
> then, if I had:
>
>     <xf:group ref=".[invoice/currency='euro']">...</xf:group>
>
> Then this would be an example of a dynamic dependency, correct?
>
> Regarding your second point: now that I re-read the spec I see this.
> Perhaps 7.5.1 could be made clearer, because it gave me the impression
> that dynamic dependencies were 'unacceptable' in *all* binding
> expressions. In particular, this sentence seems quite general:
>
>     "Not every possible XPath expression is acceptable as a binding
> expression."
>
> Perhaps 'binding expression' could be qualified with 'model binding
> expression'. Or, since 7.5.2 already states this, perhaps this can be
> removed altogether.
>
> A related question: here (7.5.1) the spec states that not every possible
> XPath is acceptable (ie not paths which create dynamic dependencies),
> whereas just below (7.5.2) it states that dynamic dependencies will
> require manual rebuilding - which implies that they *are* acceptable.
>
> Which is it - are they prohibited? Or permitted, as long as the form
> author is aware they may have to manually trigger a rebuild? In which
> case the statement that 'not every XPath expression is acceptable' seems
> inconsistent.
>
> Adrian
>
> Mark Birbeck wrote:
> > Hi Adrian,
> >
> > It's not a dynamic dependency, since for any given snapshot of the
> > instance data, the result of this expression won't change until nodes
> > are added or deleted, and then there will be a rebuild.
> >
> > Having said that, in this example it doesn't matter, since XForms
> > allows dynamic dependencies in UI expressions. A recalculation of the
> > nodes referenced is performed in the refresh phase, and then a
> > 'rewiring' takes place automatically between the model and the UI.
> >
> > Regards,
> >
> > Mark
> >
> > On 06/10/06, Adrian Baker <adrian@fastmail.net> wrote:
> >
> >>  Isn't this a case of
> >> http://www.w3.org/TR/xforms/slice7.html#expr-dynamic-dependency
> >> ?
> >>
> >>  Leigh Klotz wrote:
> >>  <xf:group ref=".[/your/condition/here]">...</xf:group>
> >>
> >>
> >>
> >>
> >
> >
> >
>
>
>
>


-- 
Mark Birbeck
CEO
x-port.net Ltd.

e: Mark.Birbeck@x-port.net
t: +44 (0) 20 7689 9232
w: http://www.formsPlayer.com/
b: http://internet-apps.blogspot.com/

Download our XForms processor from
http://www.formsPlayer.com/

Received on Sunday, 8 October 2006 23:35:42 UTC