Javascript变量= xsl value-of

时间:2013-05-08 07:07:24

标签: javascript xslt cross-browser escaping

我正在使用这样的JavaScript:

<script>
  <xsl:for-each select = '/request/alldata'>

    var l_allDataValue   = '<xsl:value-of select="." />';
    var l_dataArray = l_allDataValue.split('!~');

    callFunction(l_dataArray);

  </xsl:for-each>
</script>

但是如果'中有一个撇号/request/alldata,它会破坏JavaScript,因为下面的表达式用撇号括起来:

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

但是如果我用以下任何一个替换它就可以了......

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

现在我知道撇号'与JavaScript代码冲突,但哪种解决方案适用于所有浏览器?

1 个答案:

答案 0 :(得分:2)

你可以使用'<xsl:value-of select="." />',但是你需要通过预先加上像<alldata>这样的斜杠来转义\'中的所有单引号撇号

您可以使用"<xsl:value-of select="." />" or "<xsl:value-of select='.' />",但如果<alldata>有可能包含双引号,那么您也需要将其转义,例如\"

如果你想使用第一个,那么这将逃避单引号:

<xsl:template name="escapeSingleQuotes">
  <xsl:param name="txt"/>

  <xsl:variable name="backSlashSingleQuote">&#92;&#39;</xsl:variable>
  <xsl:variable name="singleQuote">&#39;</xsl:variable>

  <xsl:choose>
    <xsl:when test="string-length($txt) = 0">
      <!-- empty string - do nothing -->
    </xsl:when>

    <xsl:when test="contains($txt, $singleQuote)">
      <xsl:value-of disable-output-escaping="yes" 
                    select="concat(substring-before($txt, $singleQuote), $backSlashSingleQuote)"/>

      <xsl:call-template name="escapeSingleQuotes">
        <xsl:with-param name="txt" select="substring-after($txt, $singleQuote)"/>
      </xsl:call-template>
    </xsl:when>

    <xsl:otherwise>
      <xsl:value-of disable-output-escaping="yes" select="$txt"/>
    </xsl:otherwise>
  </xsl:choose>
</xsl:template>

您可以在代码中使用:

var l_allDataValue = '<xsl:call-template name="escapeSingleQuotes">
                        <xsl:with-param name="txt" select="."/>
                      </xsl:call-template>'