- From: Michael Kay <mike@saxonica.com>
- Date: Wed, 23 Sep 2015 17:22:52 +0100
- To: "Robie, Jonathan" <jonathan.robie@emc.com>
- Cc: Public Joint XSLT XQuery XPath <public-xsl-query@w3.org>
I think it would be rather confusing to use {{expr}} for embedding an expression in a string template, given that we use {expr} in attribute value templates, especially as in AVTs double-curlies are used to escape single-curlies.
Michael Kay
Saxonica
> On 22 Sep 2015, at 22:18, Robie, Jonathan <jonathan.robie@emc.com> wrote:
>
> 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 Wednesday, 23 September 2015 16:23:19 UTC