Subject: Re: [xsl] JSON-encoding strings in XSLT 2.0 From: Michael Kay <mike@xxxxxxxxxxxx> Date: Wed, 6 Nov 2013 15:37:08 +0000 |
I must admit I wasn't really thinking in terms of performance. I guess for performance it would be better to write <xsl:variable name="json-escapes"> <esc j="\\" x="\"/> <esc j="\n" x="&10;"/> ... </xsl:variable> <xsl:key name="json-escapes" match="esc" use="@j"/> <xsl:analyze-string select="$in" regex="\\|\'|\n|...."> <xsl:matching-substring> <xsl:value-of select="key('json-escapes", ., $json-escapes)/@x"/> </xsl:matching-substring> <xsl:non-matching-substring> <xsl:value-of select="."/> </xsl:non-matching-substring> </xsl;analyze-string> Michael Kay Saxonica On 6 Nov 2013, at 14:18, Hermann Stamm-Wilbrandt <STAMMW@xxxxxxxxxx> wrote: > DataPower appliance had this cascade of regexp:relace() statements in the > past in stylesheet "store:///jsonx2json.xsl" for "<json:string>" escaping. > > > Customer raised a PMR on bad performance for JSONX <json:string> > conversions > to JSON (he proved by using stylesheet profiling). > > I did fix that in this May fixpack by introducing new extension function > for doing the escaping in firmware rather than XSLT and just calling that > by > "dp:encode(., 'json-escape')": > http://www-01.ibm.com/support/docview.wss?uid=swg1IC90781 > > This improved conversion runtime for a 2.2MB JSONX customer sample file > with 740KB JSON output by a factor of 11. > > > So if you have to do JSON escaping in XSLT, you have no choice. > If not, then better do it in a new extension function. > > > Mit besten Gruessen / Best wishes, > > Hermann Stamm-Wilbrandt > Level 3 support for XML Compiler team and Fixpack team lead > WebSphere DataPower SOA Appliances > https://www.ibm.com/developerworks/mydeveloperworks/blogs/HermannSW/ > https://twitter.com/HermannSW/ http://www.stamm-wilbrandt.de/ce/ > ---------------------------------------------------------------------- > IBM Deutschland Research & Development GmbH > Vorsitzende des Aufsichtsrats: Martina Koederitz > Geschaeftsfuehrung: Dirk Wittkopp > Sitz der Gesellschaft: Boeblingen > Registergericht: Amtsgericht Stuttgart, HRB 243294 > > > > From: Michael Kay <mike@xxxxxxxxxxxx> > > To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx, > > Date: 10/29/2013 12:46 PM > > Subject: Re: [xsl] JSON-encoding strings in XSLT 2.0 > > > > > > > > On 29 Oct 2013, at 11:02, Martynas Jusevihius <martynas@xxxxxxxxxxxx> > wrote: > >> Thanks Michael. I was looking at http://json.org and here's what I came > up with: >> >> <xsl:template match="text()" mode="json-identity"> >> <xsl:value-of >> select="replace(replace(replace(replace(replace(replace(., '\\', >> '\\\\'), '''', '\\'''), '"', '\\"'), '	', '\\t'), >> ' ', '\\n'), ' ', '\\r')"/> >> </xsl:template> >> >> Can this be improved? > > Well, I'm not going to check that the list of characters to be escaped is > complete, but you've got the right idea. I would code it like this for > readability: > >> <xsl:template match="text()" mode="json-identity"> > <xsl:variable name="v" select="."/> > <xsl:variable name="v" select="replace($v, '\\', '\\\\')"/> > <xsl:variable name="v" select="replace($v, '"', '\\"')"/> > ... > <xsl:value-of select="$v"/> > </xsl:variable> > > or in 3.0 you can use the "!" operator for function chaining: > >> <xsl:template match="text()" mode="json-identity"> > <xsl:value-of select="replace(., '\\', '\\\\') ! replace(., > '"', '\\"') ! ....."/> > </xsl:variable> > > Michael Kay > Saxonica > > > >> <xsl:value-of >> select="replace(replace(replace(replace(replace(replace(., '\\', >> '\\\\'), '''', '\\'''), '"', '\\"'), '	', '\\t'), >> ' ', '\\n'), ' ', '\\r')"/> > </xsl:template> > >> >> On Tue, Oct 29, 2013 at 10:37 AM, Michael Kay <mike@xxxxxxxxxxxx> wrote: >>> >>> There's no built-in function for the job, but picking out the characters > = >>> that need special treatment (e.g. replacing newline by "\n") isn't = >>> difficult. Handling astral characters is a bit tricky because JSON = >>> requires them to be represented as a surrogate pair, but again the logic > = >>> for that isn't really difficult. >>> >>> Michael Kay >>> Saxonica >>> >>> On 29 Oct 2013, at 00:56, Martynas Jusevihius <martynas@xxxxxxxxxxxx> > wrote: >>> >>>> Hey, >>>> >>>> is there some way in XSLT 2.0 to encode strings for use in JSON? In my >>>> case, the stylesheet has to encode all text nodes in a XHTML fragment >>>> which then gets passed to WYSIWYM editor constructor. Could this be >>>> done as identity transform? >>>> >>>> I had solved this problem when I used XSLT 1.0 on PHP by calling >>>> json_encode() as extension function, but now I'm in the Java world. >>>> http://php.net/manual/en/function.json-encode.php >>>> >>>> Martynas >>>> graphityhq.com
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
Re: [xsl] JSON-encoding strings in , Hermann Stamm-Wilbra | Thread | Re: [xsl] JSON-encoding strings in , Martynas Jusevičius |
Re: [xsl] xsl 2.0?, Wendell Piez | Date | Re: [xsl] find the name of the chi, henry human |
Month |