xslt, Javascript und HTML-Entities unescaped
-
10-07-2019 - |
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 < 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 <
}
// ]]>
</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('<')"/> 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 ...
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 < 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 `<` 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
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 < foo.length; i++) { … }
]]>
</script>