- From: Erik Bruchez <erik@bruchez.org>
- Date: Fri, 20 Nov 2015 14:33:32 -0800
- To: "public-xformsusers@w3.org" <public-xformsusers@w3.org>, Forms WG <public-forms@w3.org>
All,
The following JSON:
{"g": [["a", "b", "c"], ["d", "e"]]}
currently translates to:
<json object="true">
<g array="true">
<_ name="" array="true" type="string">a</_>
<_ name="" array="true" type="string">b</_>
<_ name="" array="true" type="string">c</_>
</g>
<g array="true">
<_ name="" array="true" type="string">d</_>
<_ name="" array="true" type="string">e</_>
</g>
</json>
If you were to use xf:repeat, xf:insert and xf:delete around this, you
would have to handle specifically the removal of the last element in
an array. For example:
<_ name="" array="true" type="string">d</_>
becomes:
<_ name="" array="true" />
instead of just deleting the last element.
If we switched to a scheme where arrays always have an enclosing
element, the mapping would be instead:
<json type="object">
<g type="array">
<_ type="array">
<_ type="string">a</_>
<_ type="string">b</_>
<_ type="string">c</_>
</_>
<_ type="array">
<_ type="string">d</_>
<_ type="string">e</_>
</_>
</g>
</json>
There are some benefits to this:
- xf:repeat, xf:insert and xf:delete are much easier (see below)
- we don't need `array="true"`, but instead can use `type="array"`
- array elements are always anonymous (or their name can be ignored)
- the implementation of the conversion is a little simpler
- XPath expressions are more consistent
There are some drawbacks too:
- simple JSON cases without array nesting require slightly more complex XPath
- the XML is a little bigger due to the extra nesting
For example, say you want to reach the value "b". With the current scheme:
g[1]/_[2]
or:
g[1]/*[2]
With the proposed scheme:
g/_[1]/_[2]
or:
g/*[1]/*[2]
I think it's biggest appeal is the much easier xf:repeat, xf:insert
and xf:delete. To show this better, I created an XForms example
showing the two schemes here:
https://gist.github.com/ebruchez/fd1c8d88f7966a9f0707
Handling xf:repeat, xf:insert and xf:delete is a puzzle with the older
scheme, but trivial with the proposed scheme. If have only shown Add
and Remove buttons for the inner repeat.
Feedback welcome,
-Erik
Received on Friday, 20 November 2015 22:34:23 UTC