Re: Evaluating the relevant property expression when the bound instance node doesn't exist...

Fennell, Philip wrote:
 > Hello,
 >
 > I believe I'm correct when I say that a relevant expression is
 > evaluated relative to the target nodeset of a bind instruction. If
 > so then, where an xforms:bind targets an attribute node e.g.
 >
 >
 > <xforms:instance xmlns="">
 > 	<area x="0" y="0"/>
 > </xforms:instance>
 >
 > <xforms:bind id="area.width" nodeset="area/@width"
 > relevant="../@height"/>

I'll start with something slightly off-topic: I think there is a
mistake in your code above: the default XPath evaluation context for
xforms:bind/@nodeset is the root element of the first instance of the
model, so you would have to write:

   <xforms:bind id="area.width" nodeset="@width" relevant="../@height"/>

Alternatively, you can write:

   <xforms:bind id="area.width"
                nodeset="/area/@width"
                relevant="../@height"/>

A practice I like, especially when there are many instances, is to
make things explicit and use the instance() function and provide an id
on your instance:

   <xforms:instance xmlns="" id="my-instance>
     <area x="0" y="0"/>
   </xforms:instance>

   <xforms:bind nodeset="instance('my-instance')">
     <xforms:bind id="area.width"
                  nodeset="@width"
                  relevant="../@height"/>
   </xforms:bind

or:

   <xforms:bind id="area.width"
                nodeset="instance('my-instance')/@width"
                relevant="../@height"/>

 > and the binding is only relevant if some other attribute exists, then if
 > @width was absent, how could I test the relevancy of the 'area.width'
 > binding?

1. Your question seems to imply that model item properties (MIPs) are
    somehow stored and associated with the id of the xforms:bind.

    But this is not the case: MIPs are stored on particular instance
    data nodes. If the node referred to by the @nodeset attribute
    doesn't exist, the MIP simply doesn't exist at all!

    So you can't test a relevant, readonly, constraint, or type MIP if
    there is no node pointed to by the xforms:bind/@nodeset attribute.

2. Following #1 above, and except for proprietary extension functions,
    the only way to test the relevance of a node is to actually bind a
    control to it!

    Using the id "area.width" is just a shortcut to refer to the node
    at area/@width. If you had a control bound this way:

     <xforms:input bind="area.width">

   This is equivalent to writing:

     <xforms:input ref="/area/@width">

   Once the control is bound to a node, it determines its relevance by
   looking at whether the node is relevant or not (with inheritance).

   Now there is a twist: a control bound to a non-existing node is
   considered non-relevant. But this is specific to relevance, and
   doesn't apply to the other MIPs.

 > Would this example binding always be 'non-relevant' when the @width
 > is missing?

As discussed in #2 above, a *control* defined as follows:

   <xforms:input bind="area.width">

will be non-relevant because it is not bound to an existing node.

 > If so does this imply that the form/data design is incorrect and the
 > problem has to be resolved by a change to the schema and form?

Hard to tell without knowing what problem you are trying to solve ;-)

-Erik

-- 
Orbeon Forms - Web Forms for the Enterprise Done the Right Way
http://www.orbeon.com/

Received on Monday, 12 February 2007 14:38:31 UTC