我对xslt,js和html实体有一个小问题,例如。在模板中:
<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>
有没有人知道我的问题可能来自哪里?我一直以为xslt处理器会留下&lt; script /&gt;的内容。元素在使用html输出方法时未转义...
我在使用macportsports安装的OSX上运行libxslt2版本1.1.24 ...
答案 0 :(得分:11)
确定。长话短说,简答:
似乎使用某些libxslt版本 xslt处理器会留下&lt; script /&gt;的内容。元素在使用html输出方法时未转义,与其他人一起使用 不 ...因此建议采用以下方法:
<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>
答案 1 :(得分:4)
我一直以为xslt处理器会在使用html输出方法时保留未转义的脚本元素的内容
你是对的:http://www.w3.org/TR/xslt#section-HTML-Output-Method
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>
如果您的XSLT处理器正在执行其他操作,那就是一个错误。
然而,无论如何,避免'&lt;'是个好主意。和'&amp;'在嵌入式脚本中,更好的想法是将所有代码放入链接的.js文件中。
答案 2 :(得分:1)
CDATA
块应该有效;他们总是有我。你的disable-output-escaping
价值是多少?
更新:
使用Xalan,默认为disable-output-escaping
,我很确定no
,我在工作的XSL文件中有以下内容:
否CDATA
阻止:
for (var i = 0; i `<` foo.length; i++) {
…
}
CDATA
阻止:
<![CDATA[
for (var i = 0; i < foo.length; i++) { … }
]]>
答案 3 :(得分:1)
尝试在第三个解决方案的CDATA之前删除双斜杠
答案 4 :(得分:0)
如果xsl:output
方法是html,则CDATA部分可以正常工作。如果xsl:output
方法是xml,则&lt;和&gt;标志仍将被转换。
要解决此问题,您可以使用xsl:output元素将脚本元素定义为不以此方式运行。你也可以使用xml或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>