- From: Erik Bruchez <erik@bruchez.org>
- Date: Fri, 6 Mar 2020 09:50:21 -0800
- To: XForms <public-xformsusers@w3.org>
- Message-ID: <CAAc0PEWcpxEt54Kt=GyBcTWOTUBiWAhMEzCVjZBUS1Yz94vGeg@mail.gmail.com>
All,
Here is a use case for `xf:copy` which we can support if we support
handling attributes.
Let's say we an XML representation which proposes a discriminated union
based on a `type` attribute. We have, in the data, either:
<label type="PredefinedButtonLabel"/>
or:
<label type="CustomButtonLabel">
<name type="object">
<values type="object">
<en>Custom Button</en>
</values>
</name>
</label>
If `xf:copy` supports attributes, then I can write successfully write my
selection as follows:
<xf:select1 ref="label" appearance="full">
<xf:item>
<xf:label>Predefined</xf:label>
<xf:copy ref="xf:attribute('type', 'PredefinedButtonLabel')"/>
</xf:item>
<xf:item>
<xf:label>Custom</xf:label>
<xf:copy
ref="
xf:attribute('type', 'CustomButtonLabel'),
if (@type = 'CustomButtonLabel') then
*
else
instance('my-custom-button-label-template')"/>
</xf:item>
</xf:select1>
<xf:input ref="label/name/values/en"/>
(Here I use the `xf:attribute()` function but we could also point to
attributes in a template instance.)
The `if ... then ... else` pattern in the second `xf:copy` is there so
that, in case the user has already selected a `CustomButtonLabel` and
edited the value of the button label (here "Custom Button" initially),
there will still be an exact match and the item can show as selected.
The `xf:copy` logic must:
- to determine a match: compare the attributes in addition to the other
nodes returned by `xf:copy/@ref`
- to deselect: remove the matching attributes of the item being deselected
- to select: add the attributes of the item being selected
So really it's not much harder than not supporting attributes.
-Erik
Received on Friday, 6 March 2020 17:50:45 UTC