这个任务似乎相当简单:如何将一个Javascript文件包含在XML文档中,以便至少Opera和Firefox可以实际解析它并执行其中的代码?
这个任务似乎相当简单:如何将一个Javascript文件包含在XML文档中,以便至少Opera和Firefox可以实际解析它并执行其中的代码?
添加声明XHTML命名空间的脚本,它会正常运行。
<xhtml:script xmlns:xhtml="http://www.w3.org/1999/xhtml"
src="file.js"
type="application/javascript"/>
xhtml
表示“http://www.w3.org/1999/xhtml”
命名空间”。这基本上允许您在任何XML文档中包含XHTML元素。 - wizzwizz4如果我理解正确,您希望在浏览器中查看XML文档时运行JavaScript?
这不是XML标准的一部分,因此在XML标准未支持之前将不会得到支持(我认为这永远不会得到支持,因为XML不是用于显示而是用于数据)。如果您说的是XHTML,则情况就不同了。
--
编辑:只是为了澄清我的答案。
XML从未旨在成为像HTML那样的显示标记语言,这就是为什么开发了XHTML(符合XML标准的HTML)。浏览器已经被制作成以某种方式解释XHTML,但XML只是原始数据。
如果您想让XML运行JavaScript等附加功能,您需要考虑使用XSLT将XML转换为XHTML,从而利用浏览器的功能。
<script xmlns="http://www.w3.org/1999/xhtml"><![CDATA[
alert('Hello');
]]></script>
或者对于外部JavaScript:
<script xmlns="http://www.w3.org/1999/xhtml" src="external.js"></script>
适用于Firefox和Opera浏览器。
I did this:
XSLT:
<xsl:value-of select="/label[@id='MyScript']/text()" disable-output-escaping="yes"/>
XML:
<label id="MyScript"><![CDATA[
<script type="text/javascript">
alert("Hello world");
</script>
]]></label>
与上面类似,但可能会出错,因为<![CDATA[
和]]>
部分不是有效的代码。如果您将其放入XSL脚本中,可以在这些开始和结束元素之前放置JS注释标记。
我还使用了xsl:text
元素来输出<![CDATA[
部分。这部分可能有点欺骗性,但它会产生格式良好的XML。一个在xsl:choose
块内的示例可能是...
...
<xsl:when test='name()="script"'>
<script>
<xsl:for-each select='@*'><xsl:copy-of select='.' /></xsl:for-each>
<xsl:text disable-output-escaping='yes'>
// <![CDATA[
</xsl:text>
<xsl:copy-of select='./text()' />
<xsl:text disable-output-escaping='yes'>
//]]>
</xsl:text>
</script>
</xsl:when>
...
浏览这些代码片段...
<script>
元素。<script>
标签到输出结果中。xsl:for-each
语句来保留输出结果中的标签属性。// <![CDATA[
。其中//
将其余行呈现为注释,从而防止JS错误。<script>
标记的文本内容。注意:必须保留换行符(可采用以上方式或其他方式),以便在此行之前被注释掉的行不会出现在同一行。显然,如果它确实出现了,它也会注释掉这一行。保留该行后面的部分并非必要,但可以让两个匹配的CDATA标记美观匹配。// ]]>
。这结束了CDATA块,而且在读取JS时,浏览器会忽略CDATA标记。</script>
标记关闭该块。xsl:choose
块,请先关闭xsl:when
。...
<script type='javascript'>alert('Hello World!');</script>
...
然后变成了:
...
<script type='javascript'>
// <![CDATA[
alert('Hello World!');
// ]]>
</script>
能够有效地保存,并且可以被XML和浏览器读取。