Frage

ich habe ein winziges kleines Problem mit xslt, js und HTML-Entitäten, z. B. innerhalb einer Vorlage:

<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>

Hat jemand eine Idee, wo mein Problem herkommen könnte? Ich dachte immer, der XSLT-Prozessor den Inhalt eines Element unescaped verlassen würde, wenn die HTML-Ausgabemethode unter Verwendung von ...

i laufen libxslt2 Version 1.1.24 auf OSX, die macportsports installiert wurde ...

War es hilfreich?

Lösung

ok. lange Geschichte, kurze Antwort:

es scheint, dass mit einige libxslt Versionen der XSLT-Prozessor verlässt den Inhalt eines Element unescaped, wenn die HTML-Ausgabemethode verwenden, mit anderen nicht ... daher wird folgendes empfohlen:

<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>

Andere Tipps

  

Ich dachte immer, der XSLT-Prozessor den Inhalt eines Skriptelement unescaped verlassen würde, wenn die HTML-Ausgabemethode mit

Sie sind richtig: http://www.w3.org / TR / xslt # Abschnitt-HTML-Output-Methode

The html output method should not perform escaping for the content of the script and style elements.
For example, a literal result element written in the stylesheet as
    <script>if (a &lt; b) foo()</script>
or
    <script><![CDATA[if (a < b) foo()]]></script>
should be output as
    <script>if (a < b) foo()</script>

Wenn Ihr XSLT-Prozessor ist sonst tun, es ist ein Fehler.

Doch in jedem Fall ist es eine gute Idee zu vermeiden, ‚<‘ und ‚&‘ in eingebetteten Skripten und eine noch bessere Idee, den Code alle aus in eine verknüpften js-Datei zu treten.

Versuchen Sie, den doppelten Schrägstrich vor dem CDATA Ihrer dritten Lösung Entfernen

Die CDATA Blöcke sollten gearbeitet haben; sie haben für mich immer. Was ist Ihr disable-output-escaping Wert?

UPDATE: Xalan verwenden, mit disable-output-escaping auf seinen Standard, die ich bin mir ziemlich sicher no ist, habe ich die folgenden in meinem Arbeits XSL-Dateien:

  • Nein CDATA Block:

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

    <![CDATA[
    
    for (var i = 0; i < foo.length; i++) { … }
    
    ]]>
    

Wenn die xsl:output Methode html ist, würde der CDATA-Abschnitt arbeiten. Wenn die xsl:output Methode xml ist, würde die Zeichen noch umgesetzt werden.

Um dieses Problem zu umgehen, können Sie das Skript Element definieren nicht auf diese Weise verhalten, die xsl: Ausgangselement. Sie können auch die Methode der Ausgabe unter Verwendung von XML erzwingen oder 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>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top