- From: Erik Bruchez <erik@bruchez.org>
- Date: Mon, 23 Nov 2015 10:12:50 -0800
- To: "Liam R. E. Quin" <liam@w3.org>
- Cc: "public-xformsusers@w3.org" <public-xformsusers@w3.org>, Forms WG <public-forms@w3.org>
Liam, > Have you looked at the JSOn to XML mapping used by XSLT 3 and XQuery 3.1? Yes we have looked at the XSLT 3 mapping. The XForms mapping is different in that it starts with the idea that you can write XPath against an XML data model created from JSON in a more natural way. Take the example in the XSLT 3 spec: { "desc" : "Distances between several cities, in kilometers.", "updated" : "2014-02-04T18:50:45", "uptodate": true, "author" : null, "cities" : { "Brussels": [ {"to": "London", "distance": 322}, {"to": "Paris", "distance": 265}, {"to": "Amsterdam", "distance": 173} ], "London": [ {"to": "Brussels", "distance": 322}, {"to": "Paris", "distance": 344}, {"to": "Amsterdam", "distance": 358} ], "Paris": [ {"to": "Brussels", "distance": 265}, {"to": "London", "distance": 344}, {"to": "Amsterdam", "distance": 431} ], "Amsterdam": [ {"to": "Brussels", "distance": 173}, {"to": "London", "distance": 358}, {"to": "Paris", "distance": 431} ] } } And say I want to access the distance in `{"to": "Paris", "distance": 344}`. With the XForms mapping I write, assuming the context item is the root element: cities/London[2]/distance or, as I suggest with my change to the mapping: cities/London/_[2]/distance With the XSLT 3 mapping, I would need to write: map[@key = 'cities']/array[@key = 'London']/map[2]/number[@key = 'distance'] or, to optimize for concision: *[@key = 'cities']/*[@key = 'London']/*[2]/*[@key = 'distance'] > In particular, what do you do about cases like { "< <": [[ "1 2 3" ] { "_" : 6 } ]} ? These cases are handled by replacing illegal character with `_` and adding the `@name` attribute on the element to expose the original name. For example with the mapping as it stands: <json object="true"> <___ array="true" name="< <"> <_ name="" array="true" type="string">1 2 3</_> </___> <___ array="true" name="< <" object="true"> <_ type="number">6</_> </___> </json> (The result would be slightly different with the update to the mapping I am suggesting above.) The XForms mapping optimizes paths for the most common scenarios where property names are "reasonable", while supporting the less frequent cases where property names which contain characters not allowed in XML elements. For those, XPath expressions won't look as clean. -Erik
Received on Monday, 23 November 2015 18:13:39 UTC