- From: Erik Bruchez <ebruchez@orbeon.com>
- Date: Sun, 20 Jun 2010 17:22:33 -0700
- To: Forms WG <public-forms@w3.org>
- Message-ID: <AANLkTil9aIZ1OintLo_-x_y7uPe0rbGpafXr39PLvGR1@mail.gmail.com>
I think that context() with id is useful and a good shortcut. Note that variables also solve (among other things) this issue, although in a slightly more verbose way, e.g.: <xf:repeat id="status-repeat" nodeset="instance('statuses')/statuses/status"> <xf:variable name="status-repeat" value="."/> ... <xf:repeat id="set-status-repeat" nodeset="instance('statuses')/statuses/status[$status-repeat/status != .]"> -Erik On Fri, Jun 18, 2010 at 2:46 PM, Klotz, Leigh <Leigh.Klotz@xerox.com> wrote: > OK, I put in a proposal in the wiki with the hotels use case: > > http://www.w3.org/MarkUp/Forms/wiki/@context_id > > Leigh. > > ------------------------------ > *From:* John Boyer [mailto:boyerj@ca.ibm.com] > *Sent:* Friday, June 18, 2010 2:28 PM > > *To:* Klotz, Leigh > *Cc:* public-forms@w3.org > *Subject:* RE: @context everywhere; applies to ref and value separately, > or applies before ref, then ref applies to value? > > > Hi Leigh, > > Yes, I agree that context() would need to be more powerful, but frankly I > thought we eventually would need to do that. > > So, once we decide there is a real use case, maybe we should discuss how an > additional optional parameter could be added to context() to allow it to > obtain the inscope eval context of an element other than the default of the > immediate ancestor element. > > Cheers, > John M. Boyer, Ph.D. > IBM Distinguished Engineer, Interactive Web Applications and Documents > IBM Lotus Forms Architect > Workplace, Portal and Collaboration Software > IBM Canada Software Lab, Victoria > 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: "Klotz, Leigh" <Leigh.Klotz@xerox.com> To: John > Boyer/CanWest/IBM@IBMCA Cc: <public-forms@w3.org> Date: 06/18/2010 01:56 > PM Subject: RE: @context everywhere; applies to ref and value separately, > or applies before ref, then ref applies to value? > ------------------------------ > > > > Thanks for clarifying the context on child elements. That's a relief. > > I believe you're right about the expressive power of repeat nodesets and > index() being up to the task of the context() function. > > The problem I encountered was when the inner repeat used, as a predicate on > its nodeset, a value from the outer repeat. > It does turn out to be solvable with index, but it's not pretty. > > In fact, I believe that when you get to triply-nested repeats, you have to > go back to copying repeat-nodesets and index, and cannot use context(), > because index() takes an ID argument but context() does not, so there's no > way to get back to the grandparent. > > > Here's the context example with two nested repeats, using context: > > <xf:repeat id="statuses-repeat" > nodeset="instance('statuses')/statuses/status"> > <xf:repeat id="hotels-repeat" > nodeset="instance('hotels')/hotel[status=current()]"> > <xf:trigger> > <xf:label>Mark Vacant</xf:label> > <xf:action ev:event="DOMActivate"> > <xf:setvalue ref="instance('mark')/status">vacant</xf:setvalue> > <xf:setvalue ref="instance('mark')/name" > value="context()/name" /> > <xf:send submission="mark-status" /> > </xf:action> > </xf:trigger> > </xf:repeat> > </xf:repeat> > > and here it is without context(), using index(), position(), and > duplicating the nodesets of the two repeats, including their predicates: > > <xf:repeat id="statuses-repeat" > nodeset="instance('statuses')/statuses/status"> > <xf:repeat id="hotels-repeat" > nodeset="instance('hotels')/hotel[status=current()]"> > <xf:trigger> > <xf:label>Mark Vacant</xf:label> > <xf:action ev:event="DOMActivate"> > <xf:setvalue ref="instance('mark')/status">vacant</xf:setvalue> > <xf:setvalue ref="instance('mark')/name" > value="instance('hotels')/hotel[status=instance('statuses')/statuses/status[index('statuses-repeat')] > and position()=index('hotels-repeat')]/name" /> > <xf:send submission="mark-status" /> > </xf:action> > </xf:trigger> > </xf:repeat> > </xf:repeat> > > Now let's add a set of triggers, one for each status, here done with index: > > <xf:repeat id="statuses-repeat" > nodeset="instance('statuses')/statuses/status"> > <xf:repeat id="hotels-repeat" > nodeset="instance('hotels')/hotel[status=current()]"> > <xf:repeat id="set-status-repeat" > nodeset="instance('statuses')/statuses/status"> > <xf:trigger> > <xf:label>Mark <output value="." /></xf:label> > <xf:action ev:event="DOMActivate"> > <xf:setvalue ref="instance('mark')/status" value=" > instance('status')/status[index('set-status-repeat')]" /> > <xf:setvalue ref="instance('mark')/name" > value="instance('hotels')/hotel[status=instance('statuses')/statuses/status[index('statuses-repeat')] > and position()=index('hotels-repeat')]/name" /> > <xf:send submission="mark-status" /> > </xf:action> > </xf:trigger> > </xf:repeat> > </xf:repeat> > </xf:repeat> > > I don't see that we can handle this with context() though. We can do this > line: > > <xf:setvalue ref="instance('mark')/status" value="context()" /> > but I don't see how the next setvalue can profit from context(). > <xf:setvalue ref="instance('mark')/name" > value="???" /> > > Leigh. > > > > > > > > > > > ------------------------------ > *From:* John Boyer [mailto:boyerj@ca.ibm.com <boyerj@ca.ibm.com>] * > Sent:* Friday, June 18, 2010 11:49 AM* > To:* Klotz, Leigh* > Cc:* public-forms@w3.org* > Subject:* RE: @context everywhere; applies to ref and value separately, or > applies before ref, then ref applies to value? > > > Hi Leigh, > > Every element has an in-scope evaluation context, including those child > elements you talked about [1]. See especially the text after the list, > which indicate that elements that are not binding elements have an in-scope > evaluation context equivalent to what they would have if they were binding > elements. > > [1] *http://www.w3.org/TR/xforms11/#expr-eval*<http://www.w3.org/TR/xforms11/#expr-eval> > > So, yes you actually should be able to use context() in > output/mediatype/@value. > > Although context() is the "right" answer, can you still let me know whether > or not you see a specific problem with using index() in that case you raised > earlier, when further amended to be an inner repeat? I'd like to assume it > is actually not a problem unless you say otherwise. > > Cheers, > John M. Boyer, Ph.D. > IBM Distinguished Engineer, Interactive Web Applications and Documents > IBM Lotus Forms Architect > Workplace, Portal and Collaboration Software > IBM Canada Software Lab, Victoria > E-Mail: boyerj@ca.ibm.com > > Blog: *http://www.ibm.com/developerworks/blogs/page/JohnBoyer*<http://www.ibm.com/developerworks/blogs/page/JohnBoyer> > Blog RSS feed: * > http://www.ibm.com/developerworks/blogs/rss/JohnBoyer?flavor=rssdw*<http://www.ibm.com/developerworks/blogs/rss/JohnBoyer?flavor=rssdw> > > > > From: "Klotz, Leigh" <Leigh.Klotz@xerox.com> To: John > Boyer/CanWest/IBM@IBMCA Cc: <public-forms@w3.org> Date: 06/18/2010 11:24 > AM Subject: RE: @context everywhere; applies to ref and value separately, > or applies before ref, then ref applies to value? > > ------------------------------ > > > > Thank you, John. That's great news. I had gotten confused and thought > context was an XForms 1.2 feature; so @context everywhere is, but context() > isn't. > I'll note this in the wikipage on @context everywhere. > > I have another question about context(), though, and it would have applied > equally to my misunderstood @context: > > #fn-context says that it applies to "context node of the nearest ancestor > element". So, that means it isn't useful for child elemements which allow > evaluation of xpath expressions for what would otherwise be static attribute > values. > For example, *output/mediatype/@value* <output/mediatype/@value> cannot > use context(). > > Leigh. > > > ------------------------------ > * > From:* John Boyer [*mailto:boyerj@ca.ibm.com* <boyerj@ca.ibm.com>] * > Sent:* Friday, June 18, 2010 7:19 AM* > To:* Klotz, Leigh* > Cc:* public-forms@w3.org* > Subject:* Re: @context everywhere; applies to ref and value separately, or > applies before ref, then ref applies to value? > > > Hi Leigh, > > First, to clarify, you're trying to get the value attr in setvalue to > evaluate "name" as the name of the hotel that is both good and cheap, i.e. > the value expression evaluates relative to the repeat item node rather than > the result of the ref in setvalue. > > While the ref sets the starting node of the value, the repeat item node > happens to be the "inscope evaluation context node" of the setvalue action, > which sets the starting node of the ref. > > Therefore, no, the context attribute will not help you with resetting the > evaluation node for the value attr. The context attribute allows override > of the inscope evaluation context of the element containing the context > attribute, so it would only help you to set a context for the ref of the > setvalue. > > Unfortunately, Mark's blog post is also incorrect, and you are correct, > that using the current() function does not work. Later in Mark's post, he > does acknowledge that. > > The actual fix to the problem is the context() function [1], and you're > hitting on the exact reason it was added. > > [1] *http://www.w3.org/TR/xforms11/#fn-context*<http://www.w3.org/TR/xforms11/#fn-context> > > In your markup, use this: > <setvalue ev:event="DOMActivate" > ref="instance('home')/hang/your/hat" value="*context()/*name" /> > > If Mark's post contained context() where it currently contains current(), > then his blog post would work without having to resort to the index() > function: > > <xf:setvalue bind="testBind" value="context()/VO_ID" /> > > Finally, note that context() is one of the harder functions to implement, > so you may have to file an issue with your flavourite XForms implementer if > the above doesn't work. And meanwhile, could you explain further what > breaks when you use the alternative method of the index() function to solve > this problem in an inner repeat? Offhand, the only reason I can think of > why it wouldn't work is that the harder part of implementing the index() > function has not been done properly, which would mean another issue for your > flavourite XForms implementer. > > Cheers, > John M. Boyer, Ph.D. > IBM Distinguished Engineer, Interactive Web Applications and Documents > IBM Lotus Forms Architect > Workplace, Portal and Collaboration Software > IBM Canada Software Lab, Victoria > E-Mail: boyerj@ca.ibm.com > > Blog: *http://www.ibm.com/developerworks/blogs/page/JohnBoyer*<http://www.ibm.com/developerworks/blogs/page/JohnBoyer> > Blog RSS feed: * > http://www.ibm.com/developerworks/blogs/rss/JohnBoyer?flavor=rssdw*<http://www.ibm.com/developerworks/blogs/rss/JohnBoyer?flavor=rssdw> > > > From: "Leigh L. Klotz, Jr." <Leigh.Klotz@Xerox.com> To: > public-forms@w3.org Date: 06/17/2010 11:37 PM Subject: @context > everywhere; applies to ref and value separately, or applies before ref, > then ref applies to value? > > > ------------------------------ > > > > When we add @context to actions [1], would this work to deal with the > lost repeat context in setvalue problem? > > <repeat nodeset="instance('directory')/hotels/hotel[@good='yes' and > @cheap='yes']"> > <trigger> > <label>Book <output ref="name" /></label> > <setvalue ev:event="DOMActivate" context="." > ref="instance('home')/hang/your/hat" value="name" /> > </trigger> > </repeat> > > (You can work around this loss of context with index(), but not in the > case of nested repeats.) > > Interestingly, Mark Birbeck suggests [2] that current() solves this > problem, but my understanding was that > <setvalue ref="instance('home')/hang/your/hat" value="current()/name" /> > was the same as > <setvalue ref="instance('home')/hang/your/hat" value="./name" /> > and current() would be useful only inside predicates. > > Am I wrong on this count? > > [1] *http://www.w3.org/MarkUp/Forms/wiki/@context_everywhere*<http://www.w3.org/MarkUp/Forms/wiki/@context_everywhere> > [2] *http://www.formsplayer.com/node/200*<http://www.formsplayer.com/node/200> > > Leigh. > > > > > > >
Received on Monday, 21 June 2010 00:23:26 UTC