xslt、javascript 和未转义的 html 实体

IT技术 javascript xslt html-entities
2021-03-03 08:52:03

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

5个回答

行。长话短说:

似乎对于某些 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>
这在我的情况下不起作用。我收到 XSLT 错误The content of elements must consist of well-formed character data or markup.,它指向带有<
2021-05-05 08:52:03
Gidday 那里,这个问题现在有点老了,但如果你得到这个,也许你可以帮助我的问题?stackoverflow.com/questions/6411376/... 同样的问题,但您的解决方案适用于我的本地主机,但不适用于我的托管服务器。它们似乎具有相同的配置:/
2021-05-07 08:52:03
嘿!你救了我的命。不,至少需要几个小时!谢谢。
2021-05-08 08:52:03

我一直认为 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 文件是更好的主意。

那么看起来像一个错误......我会尽量缩小它的范围,我可以提交错误报告......cheerz为你的答案......
2021-04-29 08:52:03
如果 XSLT 生成可变 JS 脚本,则链接的 js 文件并不总是可能的,并且避免 < 和 & 是不现实的
2021-05-13 08:52:03

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

这些CDATA块应该有效;他们总是为我准备。你的disable-output-escapingvalue是什么?

更新:使用 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++) { … }
    
    ]]>
    
你的意思是使用以下内容: <xsl:value-of disable-output-escaping="yes" select="string('&')"/> 有效,但这不是应该如何工作,对吗?
2021-05-10 08:52:03

如果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>
这在我的情况下不起作用,我在输出中得到的是&amp;lt;,而我的输出类型是html
2021-04-22 08:52:03