|
Subject: Re: [xsl] JSON-encoding strings in XSLT 2.0 From: David Cramer <david@xxxxxxxxxxxx> Date: Tue, 10 Dec 2013 09:29:07 -0600 |
On 11/06/2013 09:37 AM, Michael Kay wrote:
> 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
Very helpful. thanks! For reference, I made a couple of small adjustments (e.g. reversing x and j
in the key):
<xsl:variable name="regexp">\\|\n|\r|\t|"|/</xsl:variable>
<xsl:variable name="json-escapes">
<esc j="\\" x="\"/>
<esc j="\n" x=" "/>
<esc j="\"" x="""/><!-- " -->
<esc j="\t" x="	"/>
<esc j="\r" x=" "/>
<esc j="\/" x="/"/>
</xsl:variable>
<!-- use * to avoid namespace problems -->
<xsl:key name="json-escapes" match="*" use="@x"/>
<xsl:template match="text()" mode="escape-json">
<xsl:analyze-string select="." regex="{$regexp}">
<xsl:matching-substring>
<!-- This key() amounts to: $json-escapes/*[current() = @x]/@j
but perhaps is a little faster. -->
<xsl:value-of select="key('json-escapes', . ,$json-escapes)/@j"/>
</xsl:matching-substring>
<xsl:non-matching-substring>
<xsl:value-of select="."/>
</xsl:non-matching-substring>
</xsl:analyze-string>
</xsl:template>
Regards,
David
| Current Thread |
|---|
|
| <- Previous | Index | Next -> |
|---|---|---|
| Re: [xsl] How is fold-left useful t, Dimitre Novatchev | Thread | [xsl] XSLT 3.0 Last Call Working Dr, Michael Kay |
| Re: [xsl] How is fold-left useful t, Dimitre Novatchev | Date | [xsl] XSLT 3.0 Last Call Working Dr, Michael Kay |
| Month |