XSLT + Replacing double quotes with escape sequence

前端 未结 1 1516
梦如初夏
梦如初夏 2020-12-17 15:36

I have the following xslt to transform data into a JQuery-accepted format. However, because JSON doesn\'t accept double quotes in the data string, I need to replace \" with

相关标签:
1条回答
  • 2020-12-17 16:35

    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, '&quot;'), '&quot;')"/>
    
           <xsl:if test="contains($pText, '&quot;')">
            <xsl:text>\"</xsl:text>
    
            <xsl:call-template name="escapeQuote">
              <xsl:with-param name="pText" select=
              "substring-after($pText, '&quot;')"/>
            </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, '&quot;'), '&quot;')"/>
    
               <xsl:if test="contains($pText, '&quot;')">
                <xsl:text>\"</xsl:text>
    
                <xsl:call-template name="escapeQuote">
                  <xsl:with-param name="pText" select=
                  "substring-after($pText, '&quot;')"/>
                </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"]] }
    
    0 讨论(0)
提交回复
热议问题