xslt,javascript和未转义的html实体

时间:2009-01-12 10:17:04

标签: javascript xslt html-entities

我对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处理器会留下&lt; script /&gt;的内容。元素在使用html输出方法时未转义...

我在使用macportsports安装的OSX上运行libxslt2版本1.1.24 ...

5 个答案:

答案 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 &lt; 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 `&lt;` 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 &lt; foo.length; i++) { … }
]]>
</script>