- From: Erik Bruchez <ebruchez@orbeon.com>
- Date: Mon, 24 Jul 2006 16:45:25 +0200
- To: www-forms@w3.org
Andrew S. Townley wrote: >>> However, once the value is selected from the select1, I need to include >>> it in the following XML instance document: >>> >>> <Element> >>> <ItemName/> >>> <ItemCode/> >>> ... >>> <OtherElement/> >>> </Element> >> The above is not clear: what do you mean by "include it"? > > Apologies. It seemed perfectly clear when I wrote it yesterday. :) > > The root of the problem is that I need to convert a single element with > attributes into two elements within my model based on whatever the > current selection happens to be. > > So, if in the above, I have selected the following in the select1 > > <Item Code="Fred">Yellow</Item> > > I need this to end up in the instance document as: > > <Element> > <ItemName>Yellow</ItemName> > <ItemCode>Fred</ItemCode> > ... > <OtherFormElements/> > </Element> > > I realize that ideally the value from the select could be used "as > is" in the final instance document No, that's ok, you don't always have control over the format of your document, and XForms should provide you with enough flexibility to address such cases. > but I'm trying to populate an instance with what might as well be an > external schema. As I said ;-) > As I said, I suspect the only viable option is to create a new, > intermediate instance that allows me to embed the original <Item> > element as is, and the post-process the resulting instance to > generate the instance that I eventually need to create, but I wanted > to make sure there wasn't a better way. If you use xforms:select1, you are right, you have to bind that control to a node in an instance, where the selected value remains as text. Once you are there, you can post-process, but you should be able to do that with XForms. <xforms:instance id="selected-values"> <selected-values> <colors/> </selected-values> </xforms:instance> <xforms:instance id="items"> <Items> <Item Code="Fred">Yellow</Item> ... </Items> </xforms:instance> <xforms:instance id="insert-template"> <Element> <ItemName/> <ItemCode/> </Element> </xforms:instance> <xforms:select1 ref="instance('selected-values')/colors"> <xforms:action ev:event="xforms-value-changed"> <!-- Insert element if not present --> <xforms:insert context="/where/you/want/to/insert" if="not(Element)" origin="instance('insert-template')"/> <!-- Set item name --> <xforms:setvalue ref="/where/you/want/to/insert/Element/ItemName" value="instance('items')/Item[. = instance('selected-values')/colors]/@Code"/> <!-- Set item code --> <xforms:setvalue ref="/where/you/want/to/insert/Element/ItemCode" value="instance('selected-values')/colors"/> </xforms:action> </xforms:select1> I did not check the above code, but you get the idea. Note that this uses some XForms 1.1 features (supported by current OPS nightly builds). -Erik -- Orbeon - XForms Everywhere: http://www.orbeon.com/blog/
Received on Monday, 24 July 2006 14:45:32 UTC