- From: Robie, Jonathan <jonathan.robie@emc.com>
- Date: Tue, 22 Sep 2015 21:18:52 +0000
- To: Public Joint XSLT XQuery XPath <public-xsl-query@w3.org>
Thinking about the desire to optimize for creating XML, HTML, JSON, and CSS, I realized that there are a variety of JavaScript libraries designed to do just that: http://mustache.github.io/ http://www.dustjs.com/ http://handlebarsjs.com/ https://github.com/Mrdigs/Interpose.js Several of these delimit expressions in string content with "{{" and "}}". Suppose we think very much in-the-box, using syntax that others have used for this purpose. Although "{{" and "}}" can easily occur with nested JSON objects, it's easy enough to either add whitespace ("{ {") or embed the "{{" as a string if you just can't stand using whitespace in JSON objects. So I would like to add the following possibility to the list: 5. <<< ... >>> and {{ ... }} Let me apply this to a standard Mustache example. In Mustache syntax, this is a template with a conditional section: Hello {{name}} You have just won {{value}} dollars! {{#in_ca}} Well, {{taxed_value}} dollars, after taxes. {{/in_ca}} In Mustache, a JSON object is supplied to provide the values of variables: { "name": "Chris", "value": 10000, "taxed_value": 10000 - (10000 * 0.4), "in_ca": true } When rendered, this results in the following string: Hello Chris You have just won 10000 dollars! Well, 6000.0 dollars, after taxes. Assuming that the variable $a has been bound to the object shown above, here is the XQuery string template using Syntax #5: <<<Hello {{$a.name}} You have just won {{$a.value}} dollars! {{ if ($a.in_ca) then <<<Well, {{$a.taxed_value}} dollars, after taxes.>>> else "" }}>>> Here's what it looks like embedded in a function: declare function local:prize-message($a) as xs:string { <<< <div> <h1>Hello {{$a.name}}</h1> <p>You have just won {{$a.value}} dollars!</p> {{ if ($a.in_ca) then <<< <p>Well, {{$a.taxed_value}} dollars, after taxes.</p> >>> else "" }} </div> >>> } Here's what it looks like if we produce HTML instead of text: declare function local:prize-message($a) as xs:string { <<< <div> <h1>Hello {{$a.name}}</h1> <p>You have just won {{$a.value}} dollars!</p> {{ if ($a.in_ca) then <<< <p>Well, {{$a.taxed_value}} dollars, after taxes.</p> >>> else "" }} </div> >>> } Here's what it looks like if we produce JSON: declare function local:prize-message($a) as xs:string { <<< { "greetings" : "Hello!", "value" : $a.value {{ if ($a.in_ca) then <<<, "taxed_value", {{ $a.taxed_value }} >>> else "" }} } >>> } Let's compare that to the other four syntaxes using the same functions: ### 1. <<[ ... ]>> and <<{ ... }>> declare function local:prize-message($a) as xs:string { <<[ <div> <h1>Hello <{$a.name}></h1> <p>You have just won <{$a.value}> dollars!</p> <{ if ($a.in_ca) then <<[ <p>Well, <{$a.taxed_value}> dollars, after taxes.</p> ]>> else "" }> </div> ]>> } Here's what it looks like if we produce HTML instead of text: declare function local:prize-message($a) as xs:string { <<[ <div> <h1>Hello <{$a.name}></h1> <p>You have just won <{$a.value}> dollars!</p> <{ if ($a.in_ca) then <<[ <p>Well, <{$a.taxed_value}> dollars, after taxes.</p> ]>> else "" }> </div> ]>> } Here's what it looks like if we produce JSON: declare function local:prize-message($a) as xs:string { <<[ { "greetings" : "Hello!", "value" : $a.value <{ if ($a.in_ca) then <<[, "taxed_value", <{ $a.taxed_value }> ]>> else "" }> } ]>> } ### 2. <[ ... ]> and <{ ... }> declare function local:prize-message($a) as xs:string { <[ <div> <h1>Hello <{$a.name}></h1> <p>You have just won <{$a.value}> dollars!</p> <{ if ($a.in_ca) then <[ <p>Well, <{$a.taxed_value}> dollars, after taxes.</p> ]> else "" }> </div> ]> } Here's what it looks like if we produce HTML instead of text: declare function local:prize-message($a) as xs:string { <[ <div> <h1>Hello <{$a.name}></h1> <p>You have just won <{$a.value}> dollars!</p> <{ if ($a.in_ca) then <[ <p>Well, <{$a.taxed_value}> dollars, after taxes.</p> ]> else "" }> </div> ]> } Here's what it looks like if we produce JSON: declare function local:prize-message($a) as xs:string { <[ { "greetings" : "Hello!", "value" : $a.value <{ if ($a.in_ca) then <[, "taxed_value", <{ $a.taxed_value }> ]> else "" }> } ]> } ### 3. @@[ ... ]@@ and @@{ ... }@@ declare function local:prize-message($a) as xs:string { @@[ <div> <h1>Hello @@{$a.name}@@</h1> <p>You have just won @@{$a.value}@@ dollars!</p> @@{ if ($a.in_ca) then @@[ <p>Well, @@{$a.taxed_value}@@ dollars, after taxes.</p> ]@@ else "" }@@ </div> ]@@ } Here's what it looks like if we produce HTML instead of text: declare function local:prize-message($a) as xs:string { @@[ <div> <h1>Hello @@{$a.name}@@</h1> <p>You have just won @@{$a.value}@@ dollars!</p> @@{ if ($a.in_ca) then @@[ <p>Well, @@{$a.taxed_value}@@ dollars, after taxes.</p> ]@@ else "" }@@ </div> ]@@ } Here's what it looks like if we produce JSON: declare function local:prize-message($a) as xs:string { @@[ { "greetings" : "Hello!", "value" : $a.value @@{ if ($a.in_ca) then @@[, "taxed_value", @@{ $a.taxed_value }} ]@@ else "" }} } ]@@ } ### 4. <[" ... "]> and <{ ... }> declare function local:prize-message($a) as xs:string { <[" <div> <h1>Hello <{$a.name}></h1> <p>You have just won <{$a.value}> dollars!</p> <{ if ($a.in_ca) then <[" <p>Well, <{$a.taxed_value}> dollars, after taxes.</p> "]> else "" }> </div> "]> } Here's what it looks like if we produce HTML instead of text: declare function local:prize-message($a) as xs:string { <[" <div> <h1>Hello <{$a.name}></h1> <p>You have just won <{$a.value}> dollars!</p> <{ if ($a.in_ca) then <[" <p>Well, <{$a.taxed_value}> dollars, after taxes.</p> "]> else "" }> </div> "]> } Here's what it looks like if we produce JSON: declare function local:prize-message($a) as xs:string { <[" { "greetings" : "Hello!", "value" : $a.value <{ if ($a.in_ca) then <[", "taxed_value", <{ $a.taxed_value }> "]> else "" }> } "]> }
Received on Tuesday, 22 September 2015 21:19:36 UTC