scope of id() (was: recalculating several models)

Hi Jérôme,

Good to see such in-depth analysis of XForms!

   <xform:instance id="i1">
    <i:dad>
...
   <xform:bind ... calculate="id('i1')/i:dad/i:son1"/>

In this example the function id() would return an empty node-set.

Why?

The XPath expressions apply to instance data, not the containing document.
Since the instance data, which is a copy of everything between
<xforms:instance>...</xforms:instance>, doesn't contain an id of "i1",
there's no match on the function id().

.micah

P.S. On your broader point about recalculation dependencies, let's ask our
calculation expert, John Boyer.

P.P.S. If the recalculate event applied to all models, to which element
would the event be targeted?

Thanks! -m



-----Original Message-----
From: Jérôme Nègre [mailto:jerome.negre@e-xmlmedia.fr]
Sent: Monday, January 07, 2002 2:48 AM
To: www-forms@w3.org
Subject: recalculating several models


Hi,

In the current working draft, events xforms:recalculate and xform:revalidate
are dispatched to element model. This implies that recalculation and
revalidation are done a model after another (as described in chapter
11.3.6).

But, for some kind of dependencies, such as in the following example, this
is not possible:

<html xml:...="...">
 <head>

  <xform:model id="m1">
   <xform:instance id="i1">
    <i:dad>
     <i:son1>value</i:son1>
     <i:son2>value</i:son2>
    </i:dad>
   </xform:instance>
   <xform:bind ref="i:dad/i:son2" calculate="id('i2')/i:mom/i:daughter"/>
  </xform:model>

  <xform:model id="m2">
   <xform:instance id="i2">
    <i:mom>
     <i:daughter>value</i:daughter>
    </i:mom>
   </xform:instance>
   <xform:bind ref="i:mom/i:daughter" calculate="id('i1')/i:dad/i:son1"/>
  </xform:model>

 </head>
 <body>
  <xform:input model="m1" ref="i:dad/i:son1">
   <xform:caption>Change me</xform:caption>
  </xform:input>
 </body>
</html>

The recalculation must happen in the following order :
1/ The user changes the value of id('i1')/i:dad/i:soon1 via the input
control.
2/ id('i2')/i:mom/i:daughter is recalculated.
3/ id('i1')/i:dad/i:son2 is recalculated.

In order to have this behaviour, I think recalculation/revalidation should
be made global, and their corresponding events should be dispatched to
either the root element of the document, or to a new element containing all
the models.

Am I missing something ?

Regards,
Jérôme Nègre

Received on Monday, 7 January 2002 14:30:03 UTC