Re: Binding : Do I need a nodeset?

Just to clarify for archival purposes, when Mark said you always need a 
bind nodeset even for calculate, that's not exactly true.  You always need 
to have a node to which you are attaching the model item property, which 
is what Mark is explaining.

The nodeset binding on xf:bind is optional, but if you leave it off, then 
the other bind attributes are evaluated according to the inscope 
evaluation context.  This is handy when you are using inner binds.  So, 
for example, you can say

<xf:bind nodeset="some/common/node">
   <xf:bind relevant="some expression"/>
   <xf:bind nodeset="some child" calculate="some expression"/>
</xf:bind>

Notice that the inner bind with the relevant attribute has no nodeset 
attribute.

If you have an outermost bind with no nodeset, then the model item 
property is being attached to the default node, which is the root element 
of the default instance. 

Also, if you define the same model item property more than once for a 
given node, the processor is supposed to quit with an exception.   When 
you didn't use nodeset, you were attaching two relevant model item 
properties to the root element of the default instance, which is why your 
program wasn't working.  If you had tried to do a second calculate, you 
would have gotten the same error.

As Mark explained, attributes like relevant and calculate are not applied 
to the bind itself, which is what I believe you were thinking.  Instead, 
the bind *binds* those properties to data nodes.  Then, your UI controls 
use "single node bindings" (e.g. ref) to refer to the same nodes in order 
to get at their value (whether or not calculated) and their other model 
item properties (like relevant).

Cheers,
John M. Boyer, Ph.D.
STSM, Interactive Documents and Web 2.0 Applications
Chair, W3C Forms Working Group
Workplace, Portal and Collaboration Software
IBM Victoria Software Lab
E-Mail: boyerj@ca.ibm.com 

Blog: http://www.ibm.com/developerworks/blogs/page/JohnBoyer
Blog RSS feed: 
http://www.ibm.com/developerworks/blogs/rss/JohnBoyer?flavor=rssdw





From:
Mark Birbeck <mark.birbeck@webbackplane.com>
To:
adam.flinton@nhs.net
Cc:
"www-forms@w3.org" <www-forms@w3.org>
Date:
08/06/2009 05:50 AM
Subject:
Re: Binding : Do I need a nodeset?



Hi Adam,

You always need a nodeset, even with @calculate. I'm surprised that
you are getting Chiba to output something using @calculate with no
@nodeset value, so you might want to double-check that you really are
seeing what you think you are seeing.

One way to understand xf:bind is to see it as adding extra
'properties' to an instance node. I realise that in your particular
example you want to have relevance based only on the result of an
expression, but that's not possible; in XForms you have to make some
existing node relevant, based on the expression you want. And if no
obvious node exists, then unfortunately, as you have discovered, you
usually need to invent one.

So the minimum you will need is this:

  <xf:bind
   nodeset="instance('systemInformation')//@localEdit[1]"
   relevant="
    instance('OIDVals')//oids[1]/@active = 0
     and
    instance('systemInformation')//@nodeEditable[1] = 1
   "
  />

The reason I say "minimum" is that I haven't added an @id value here.
You only need the @id value if you want a shorthand for the node
referred to by @nodeset. If all you want is the relevance mechanism
itself, you can do this:

  <xf:group ref="instance('systemInformation')//@localEdit[1]">
    ...
  </xf:group>

I mention this only to draw attention to the two roles that xf:bind
plays -- one to give a 'name' to a nodeset, and the other to add extra
'properties' to each node in that nodeset.

Of course, in your example it's a good idea to use the named binding
feature too, so that you don't need to worry about keeping the two
XPath expressions in sync:

  <xf:bind
   id="bnd-oid-edit"
   nodeset="instance('systemInformation')//@localEdit[1]"
   relevant="
    instance('OIDVals')//oids[1]/@active = 0
     and
    instance('systemInformation')//@nodeEditable[1] = 1
   "
  />

  <xf:group bind="bnd-oid-edit">
    ...
  </xf:group>

If you're wondering about the "bnd-oid-edit" ID value, by the way,
it's because over the years we've discovered that a little Hungarian
notation can go a long way to helping keep the numerous @id values
that you need in XForms, distinct.

It's also worth pointing out -- and I hope I'm not telling grandmother
to suck eggs here :) -- that "//" usually causes quite a performance
hit in XSLT/XPath engines, so it's often worth spelling out the full
XPath for your instance data. (Especially if you are mapping that
XPath to a named nodeset, via xf:bind.)

Regards,

Mark

On Thu, Aug 6, 2009 at 1:58 PM, Adam Flinton<adam.flinton@nhs.net> wrote:
> Dear All,
>
> I have a couple of groups one for editing (i.e. uses input fields) & one
> for readonly (ie only uses output fields).
>
> Which to show is determined by binding to a bind which has a "relevant"
> attrib set e.g.
>
>      <xforms:bind id="OID_EDIT"
> relevant="instance('OIDVals')//oids[1]/@active = 0 and
> instance('systemInformation')//@nodeEditable[1] = 1"
> nodeset="instance('systemInformation')//@localEdit[1]"/>
>       <xforms:bind id="OID_NO_EDIT"
> relevant="instance('OIDVals')//oids[1]/@active = 1 and
> instance('systemInformation')//@nodeEditable[1] = 1"
> nodeset="instance('systemInformation')//@localNoEdit[1]"/>
>
> & then:
>
> <xforms:group appearance="minimal" bind="OID_EDIT" 
id="OID_Group_Editable">
>
> etc.
>
> I can only seem to get it to work (in Chiba) is via having a nodeset
> which is just there to bind to. I.e. I create 2 dummy/empty attributes
> within an instance & use them as the nodeset reference.
>
> Do I need a nodeset ?
>
> e.g. should
>
>    <xforms:bind id="OID_EDIT"
> relevant="instance('OIDVals')//oids[1]/@active = 0 and
> instance('systemInformation')//@nodeEditable[1] = 1" />
>    <xforms:bind id="OID_NO_EDIT"
> relevant="instance('OIDVals')//oids[1]/@active = 1 and
> instance('systemInformation')//@nodeEditable[1] = 1" />
>
> Work in the same way?
>
> It appears to work for calculated values e.g.
>
> <xforms:bind id="CountOv" calculate="count(instance('OIDVals')//ov)"/>
>
> So are there any rules wrt binding & when you need a nodeset & when you
> don't?
>
> TIA
>
> Adam
>
> 
********************************************************************************************************************
>
> This message may contain confidential information. If you are not the
> intended recipient please inform the
> sender that you have received the message in error before deleting it.
> Please do not disclose, copy or distribute information in this e-mail or
> take any action in reliance on its contents:
> to do so is strictly prohibited and may be unlawful.
>
> Thank you for your co-operation.
>
> NHSmail is the secure email and directory service available for all NHS
> staff in England and Scotland
> NHSmail is approved for exchanging patient data and other sensitive
> information with NHSmail and GSI recipients
> NHSmail provides an email address for your career in the NHS and can be
> accessed anywhere
> For more information and to find out how you can switch, visit
> www.connectingforhealth.nhs.uk/nhsmail
>
> 
********************************************************************************************************************
>
>
>



-- 
Mark Birbeck, webBackplane

mark.birbeck@webBackplane.com

http://webBackplane.com/mark-birbeck

webBackplane is a trading name of Backplane Ltd. (company number
05972288, registered office: 2nd Floor, 69/85 Tabernacle Street,
London, EC2A 4RR)

Received on Thursday, 6 August 2009 14:28:38 UTC