XSLT + Replacing double quotes with escape sequence XSLT + Replacing double quotes with escape sequence json json

XSLT + Replacing double quotes with escape sequence


Add this template to your code:

    <xsl:template name="escapeQuote">      <xsl:param name="pText" select="."/>      <xsl:if test="string-length($pText) >0">       <xsl:value-of select=        "substring-before(concat($pText, '"'), '"')"/>       <xsl:if test="contains($pText, '"')">        <xsl:text>\"</xsl:text>        <xsl:call-template name="escapeQuote">          <xsl:with-param name="pText" select=          "substring-after($pText, '"')"/>        </xsl:call-template>       </xsl:if>      </xsl:if>    </xsl:template>

Then change:

<xsl:value-of select="."/>

to:

<xsl:call-template name="escapeQuote"/>

Your complete transformation now becomes:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:java="http://xml.apache.org/xslt/java" exclude-result-prefixes="java">        <xsl:output method="text" media-type="text/csv" encoding="UTF-8"/>        <xsl:param name="RowDelim">],</xsl:param>        <xsl:param name="RowLast">]</xsl:param>        <xsl:param name="RowStart">[</xsl:param>        <xsl:param name="startBracket">{ </xsl:param>        <xsl:param name="JQTableData">"aaData": [</xsl:param>        <xsl:param name="JQTableEnd">] }</xsl:param>        <xsl:param name="FieldDelim">,</xsl:param>        <xsl:param name="StringDelim">"</xsl:param>        <xsl:param name="DateFormat">yyyy-MM-dd HH:mm:ss</xsl:param>        <xsl:template match="/">            <xsl:for-each select="Rowsets">                <xsl:for-each select="Rowset">                <xsl:value-of select="$startBracket"/>                <xsl:value-of select="$JQTableData"/>                    <xsl:variable name="CurrentColumns" select="Columns"/>                    <xsl:for-each select="Columns">                        <xsl:for-each select="Column">                            <xsl:if test="not(position() = last())">                            </xsl:if>                        </xsl:for-each>                    </xsl:for-each>                    <xsl:for-each select="Row">                    <xsl:value-of select="$RowStart"/>                        <xsl:for-each select="*">                            <xsl:variable name="ColName">                                <xsl:value-of select="name(.)"/>                            </xsl:variable>                            <xsl:variable name="ColType">                                <xsl:value-of select="$CurrentColumns/Column[@Name=$ColName]/@SQLDataType"/>                            </xsl:variable>                            <xsl:choose>                                <xsl:when test="$ColType= '2' or $ColType= '3' or $ColType= '4' or $ColType= '5' or    $ColType= '6' or $ColType= '7' or $ColType= '8' or $ColType= '-7'">                                    <xsl:value-of select="."/>                                </xsl:when>                                <xsl:otherwise>                                    <xsl:value-of select="$StringDelim"/>                                    <xsl:choose>                                        <xsl:when test="$ColType= '91' or $ColType= '92' or $ColType= '93'">                                            <xsl:choose>                                                <xsl:when test=". = 'TimeUnavailable'">                                                    <xsl:value-of select="."/>                                                </xsl:when>                                                <xsl:otherwise>                                                                                            </xsl:otherwise>                                            </xsl:choose>                                        </xsl:when>                                        <xsl:otherwise>                                        <xsl:choose>                                            <xsl:when test=". = 'true'">                                                <xsl:text>Y</xsl:text>                                            </xsl:when>                                            <xsl:when test=". = 'false'">                                                <xsl:text>N</xsl:text>                                            </xsl:when>                                            <xsl:otherwise>                                              <xsl:call-template name="escapeQuote"/>                                                <!-- <xsl:value-of select="."/> -->                                            </xsl:otherwise>                                            </xsl:choose>                                        </xsl:otherwise>                                    </xsl:choose>                                    <xsl:value-of select="$StringDelim"/>                                </xsl:otherwise>                            </xsl:choose>                            <xsl:if test="not(position() = last())">                                <xsl:value-of select="$FieldDelim"/>                            </xsl:if>                        </xsl:for-each>                                <xsl:if test="not(position() = last())">                                <xsl:value-of select="$RowDelim"/>                            </xsl:if>                                <xsl:if test="position() = last()">                                <xsl:value-of select="$RowLast"/>                            </xsl:if>                    </xsl:for-each>                    <xsl:value-of select="$JQTableEnd"/>                </xsl:for-each>            </xsl:for-each>        </xsl:template>        <xsl:template name="escapeQuote">          <xsl:param name="pText" select="."/>          <xsl:if test="string-length($pText) >0">           <xsl:value-of select=            "substring-before(concat($pText, '"'), '"')"/>           <xsl:if test="contains($pText, '"')">            <xsl:text>\"</xsl:text>            <xsl:call-template name="escapeQuote">              <xsl:with-param name="pText" select=              "substring-after($pText, '"')"/>            </xsl:call-template>           </xsl:if>          </xsl:if>        </xsl:template></xsl:stylesheet>

when this transformation is applied on the provided XML document:

<Rowsets>    <Rowset>        <Columns>            <Column Description="Element_1" SQLDataType="12" />            <Column Description="Element_2" SQLDataType="12" />            <Column Description="Element_3" SQLDataType="93" />        </Columns>        <Row>            <Element_1>test_data</Element_1>            <Element_2>test_quo"te</Element_2>            <Element_3>test_data</Element_3>        </Row>    </Rowset></Rowsets>

the wanted, correct result is produced:

{ "aaData": [["test_data","test_quo\"te","test_data"]] }