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 回答
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 &lt; b) foo()</script>
or
    <script><![CDATA[if (a < b) foo()]]></script>
should be output as
    <script>if (a < b) foo()</script>

如果您的 XSLT 处理器不这样做,那就是一个错误。

但是,在任何情况下,最好避免在嵌入式脚本中使用 '<' 和 '&',将所有代码踢出到链接的 .js 文件中是一个更好的主意。

于 2009-01-12T10:55:01.043 回答
1

这些CDATA块应该已经工作了;他们总是有我。你的disable-output-escaping价值是什么?

更新:使用 Xalan,disable-output-escaping默认情况下,我很确定no,我的工作 XSL 文件中有以下内容:

  • 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

尝试在第三个解决方案的 CDATA 之前删除双斜杠

于 2009-01-12T10:25:13.507 回答
0

如果xsl:output方法是 html,则 CDATA 部分将起作用。如果xsl:output方法是 xml,< 和 > 符号仍然会被转换。

要解决此问题,您可以使用 xsl:output 元素将脚本元素定义为不以这种方式运行。您还可以使用 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 回答