xslt、javascript和未设置场景的html实体

xslt、javascript和未设置场景的html实体,javascript,xslt,html-entities,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"&g

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

对于(变量i=0;i 5;i++){
//^^^^js错误
}
对于(变量i=0;i<5;i++){
//^xslt错误
}
// 
对于(变量i=0;i 5;i++){
//当然可以
}
有人知道我的问题来自哪里吗?我一直认为xslt处理器在使用html输出方法时会使元素的内容不被替换


我在OSX上运行libxslt2版本1.1.24,该版本是使用macportsports安装的…

CDATA块应该可以工作;他们总是给我钱。您的
禁用输出转义值是多少

更新: 使用Xalan,默认设置为
禁用输出转义
,我很确定这是
,我的工作XSL文件中有以下内容:

  • CDATA
    块:

    for (var i = 0; i `&lt;` foo.length; i++) {
    …
    }
    
    <![CDATA[
    
    for (var i = 0; i < foo.length; i++) { … }
    
    ]]>
    
  • CDATA
    block:

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

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

我一直认为xslt处理器在使用html输出方法时会使脚本元素的内容不被替换

你是对的:

html输出方法不应对脚本和样式元素的内容执行转义。
例如,在样式表中编写的文本结果元素
如果(a b)foo()
或
应输出为
如果(a
如果XSLT处理器不这样做,那就是一个bug


然而,在任何情况下,避免“ok”都是一个好主意。长话短说:

某些libxslt版本中,xslt处理器在使用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>

//^有什么诀窍吗。。。
对于(变量i=0;i<5;i++){
//^工作
}

如果
xsl:output
方法是html,则CDATA部分可以工作。如果
xsl:output
方法是xml,那么符号仍然会被转换

为了解决这个问题,可以使用xsl:output元素将script元素定义为不以这种方式工作。您还可以使用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>

...

您的意思是使用以下命令:可以,但这不是应该的工作方式,对吗?(回答已删除,不再相关)如果XSLT正在生成变量JS脚本,则链接JS文件并不总是可能的,并且避免元素的内容必须由格式良好的字符数据或标记组成。
并且它指向带有
的行。这在我的情况下不起作用,我在输出中得到的是
&;lt,我的输出类型是
html