XSL解析缩短了脚本标记,导致IE中出现问题

时间:2009-10-07 22:10:33

标签: javascript internet-explorer

我有一个C#应用程序,它通过使用xsl文件转换xml文件来生成html文档。在我的xsl模板中,我引用了一个外部javascript文件,如下所示:

<script language="javascript" type="text/javascript" src="http://jqueryjs.googlecode.com/files/jquery-1.3.2.min.js" ></script>

转换后,上一行被翻译为:

<script language="javascript" type="text/javascript" src="http://jqueryjs.googlecode.com/files/jquery-1.3.2.min.js" />

对于Firefox和Chrome,这不是问题,但是IE会抛出“找不到对象”错误并且不起作用。有任何建议让IE喜欢这种语法吗?或者我需要在xsl(或C#XslCompiledTransform类)中做些什么才能保留语法?

解决方案:通过在脚本标记之间放置<![CDATA[ <!-- Some Comment --> ]]>,解析器不会尝试缩短结束标记。

7 个答案:

答案 0 :(得分:7)

尝试将空的CDATA部分放入其中。这应该强制解析器不要弄乱你的脚本标签。

<script language="javascript" type="text/javascript" src="http://jqueryjs.googlecode.com/files/jquery-1.3.2.min.js" ><![CDATA[ ]]></script>

答案 1 :(得分:3)

实际上,bobince是对的。如果你使用......

<xsl:output method="html"/>

...您可以为 XslCompiledTransform 获取正确的输出,但您必须将 OutputSettings 与您用作输出对象的XmlWriter一起使用:

XslCompiledTransform xslt = new XslCompiledTransform(true);

xslt.Load("stylesheetFile.xsl");

XmlWriter outputWriter = XmlWriter.Create("outputfile.html", xslt.OutputSettings);

xslt.Transform(input, null, outputWriter);

这样, method =“html”就可以了,所以脚本textarea 保留了结束标记。

答案 2 :(得分:2)

<script>

中生成XML注释
<script type="text/javascript" src="..." ><xsl:comment/></script>

输出将是:

<script type="text/javascript" src="..."><!-- --></script>

在语义上等同于空<script>

答案 3 :(得分:2)

不保留它,但是如果你正在生成向后兼容的HTML,你需要告诉XSLT处理器HTML-compatible-XHTML是你想要的而不是通用的自关闭允许的XML:

<xsl:output method="xhtml"/>

不幸的是,'xhtml'输出方法是.NET的XslTransform不支持​​的XSLT 2.0扩展,所以你必须使用旧的旧版HTML:

<xsl:output method="html"/>

(和适当的HTML 4.01 DOCTYPE而不是XHTML。)

<script>中放置一些虚拟内容可以解决您的直接问题,但可能还有其他地方默认的'xml'输出方法会为IE等旧版浏览器生成不适当的标记。

回复:评论。嗯......你说得对! 'html'输出方法不会产生有效的HTML; 'xhtml'输出方法不会产生符合XHTML附录C的XHTML。更重要的是,'html'包括诸如不转义'&lt;'之类的规定,以及去除古老和破坏甚至是它的时间Netscape的规定4构造'&amp; {...}',这将使你的工作标记失效。

因此更改输出方法完全没用,并且使用XSLT生成工作HTML的唯一方法是:

一个。手动破解每次出现不合适的自动关闭标签(可能不仅仅是这个脚本),或者

湾使用HTMLTidy之类的后期处理。

即使在XSLT 2.0中也没有解决这个问题,这是多么悲伤和邋。。

答案 4 :(得分:1)

有同样的问题。现在,这是我的解决方案:

<xsl:text disable-output-escaping="yes">
  <![CDATA[<script type="text/javascript" src="" ></script>]]>
</xsl:text>

答案 5 :(得分:0)

错过结束</script>.

答案 6 :(得分:0)

  <xsl:output method="html" omit-xml-declaration="yes" doctype-system="about:legacy-compat" encoding="utf-8"/>

应解决您的问题