3

xslt、js、およびhtmlエンティティに小さな問題があります。テンプレート内:

<script type="text/javascript">
    <xsl:value-of select="/some/node"/>
    for (var i = 0; i &lt; 5; i++) {
        //            ^^^ js error
    }
</script>

<script type="text/javascript">
    <xsl:value-of select="/some/node"/>
    for (var i = 0; i < 5; i++) {
        //            ^ xslt error
    }
</script>

<script type="text/javascript">
    <xsl:value-of select="/some/node"/>
    // <![CDATA[
    for (var i = 0; i < 5; i++) {
        //            ^ becomes &lt;
    }
    // ]]>
</script>


<script type="text/javascript">
    <xsl:value-of select="/some/node"/>
    for (var i = 0; i <xsl:value-of disable-output-escaping="yes" select="string('&lt;')"/> 5; i++) {
        // works of course
    }
</script>

私の問題がどこから来るのか誰にも分かりませんか?私はいつも、xslt プロセッサが HTML 出力メソッドを使用するときに <script/> 要素のコンテンツをエスケープしないままにするだろうと思っていました ...

macportsports を使用してインストールされた OSX で libxslt2 バージョン 1.1.24 を実行します ...

4

5 に答える 5

14

わかった。長い話、短い答え:

一部の libxslt バージョンでは、xslt プロセッサが html 出力メソッドを使用するときに <script/> 要素のコンテンツをエスケープしないままにしておくようですが、そうでないバージョンもあるようです ... したがって、以下が推奨されます:

<script type="text/javascript">
    <xsl:value-of select="/some/node"/>
    <xsl:text disable-output-escaping="yes">
        // ^ does the trick ...
        for (var i = 0; i < 5; i++) {
            //            ^ works
        }
    </xsl:text>
</script>
于 2009-01-12T13:54:28.093 に答える
1

ブロックは機能しているCDATAはずです。彼らはいつも私のために持っています。あなたのdisable-output-escaping価値は?

更新: Xalan を使用しdisable-output-escapingて、デフォルトでno.

  • CDATAブロックなし:

    for (var i = 0; i `&lt;` foo.length; i++) {
    …
    }
    
  • CDATAブロック:

    <![CDATA[
    
    for (var i = 0; i < foo.length; i++) { … }
    
    ]]>
    
于 2009-01-12T10:21:18.600 に答える
1

3 番目のソリューションの CDATA の前にある二重スラッシュを削除してみてください

于 2009-01-12T10:25:13.507 に答える
0

メソッドが htmlの場合xsl:output、CDATA セクションが機能します。メソッドが xmlの場合xsl:output、< および > 記号は引き続き変換されます。

この問題を回避するには、xsl:output 要素を使用して、script 要素がこのように動作しないように定義することができます。xml または html を使用して出力の方法を強制することもできます

<xsl:output method="xml" cdata-section-elements="script" />
...
<script type="text/javascript" language="javascript">
<![CDATA[
  for (var i = 0; i &lt; foo.length; i++) { … }
]]>
</script>
于 2010-03-18T12:32:19.077 に答える