2

私は次のような 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 コードと競合していることはわかりましたが、すべてのブラウザーで機能するソリューションはどれでしょうか?

4

1 に答える 1

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>'
于 2013-05-08T07:51:22.847 に答える