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

Javascript XSL解析缩短了脚本标记,导致IE出现问题,javascript,internet-explorer,Javascript,Internet Explorer,我有一个C#应用程序,它通过将xml文件转换为xsl文件来生成html文档。在我的xsl模板中,我引用了如下外部javascript文件: <script language="javascript" type="text/javascript" src="http://jqueryjs.googlecode.com/files/jquery-1.3.2.min.js" ></script> 转换后,前一行将转换为: <script language="java

我有一个C#应用程序,它通过将xml文件转换为xsl文件来生成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节放入其中。这将强制解析器不要弄乱脚本标记

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


中生成XML注释:


输出将是:

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

这在语义上等同于空的

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

<xsl:output method="xhtml"/>

不幸的是,“xhtml”输出方法是一个XSLT 2.0扩展,而.NET的XslTransform不支持该扩展,因此您必须使用良好的旧旧HTML:

<xsl:output method="html"/>

(并使用适当的HTML4.01doctype代替XHTML。)

中放置一些虚拟内容可能会解决您眼前的问题,但在其他地方,默认的“xml”输出方法可能会为IE等传统浏览器生成不适当的标记


回复:评论。隐马尔可夫模型。。。你说得对!“html”输出方法不生成有效的html;“xhtml”输出方法不会生成符合xhtml附录C的xhtml。此外,“html”还包括诸如“不转义”之类的规定。实际上,bobince是正确的。如果你使用

<xsl:output method="html"/>

这样,method=“html”就可以工作了,因此script、textarea等保留了它们的结束标记。

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

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

]]>


应该解决你的问题

正确。我不允许。您必须使用。我在XSL模板中有这样的语法,但是在C#中使用XslCompiledTransform对象转换为XML后,自动关闭元素与空的完整元素相同,因此XSLT可以任意对其进行序列化,但这不起作用,因为在CDATA部分添加了注释,这迫使解析器不删除结束脚本标记。谢谢你的建议!请注意,CDATA中的“注释”不是注释。它的文本将被输入浏览器中的JS解释器,并可能被报告为脚本错误(尝试在IE中运行它,并查看状态栏上的脚本错误图标)。在IE8中测试时,我没有看到任何脚本错误,但是,使用javascript“/”注释会更好吗?或者不使用CDATA内容:或者使用javascript注释:如果我没有弄错,浏览器将解析从src属性检索到的文件中的文本,并且仅在该文件不可用(如果没有)时解析标记的内部文本。因此,这可能就是为什么您在输入非语法JS的文本时没有看到任何错误。这实际上没有帮助,因为
method=“html”
不会以任何方式影响
xslcomiledtransform
的自动关闭元素行为(我不确定它是否真的做了任何其他事情)。。。。事实上,在XSLT1.0规范中,我没有看到任何东西要求
元素在为空时不作为自动关闭元素写入,即使使用
method=“html”
(请参见)。在CDATA元素中不转义
Yes。然而,XSLT也在属性值中执行此操作。天知道为什么,也许是一些被遗忘已久的古老破浏览器不支持?
XslCompiledTransform xslt = new XslCompiledTransform(true);

xslt.Load("stylesheetFile.xsl");

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

xslt.Transform(input, null, outputWriter);
<xsl:text disable-output-escaping="yes">
  <![CDATA[<script type="text/javascript" src="" ></script>]]>
</xsl:text>
  <xsl:output method="html" omit-xml-declaration="yes" doctype-system="about:legacy-compat" encoding="utf-8"/>