如何将Javascript包含在XML文档中?

24

这个任务似乎相当简单:如何将一个Javascript文件包含在XML文档中,以便至少Opera和Firefox可以实际解析它并执行其中的代码?


你所尝试实现的范围需要扩大,编辑问题以添加更多细节。 - AnthonyWJones
1
我投反对票,因为我认为你混淆了因果关系:浏览器能够显示XML并不意味着它们会像解释HTML一样解释它。就个人而言,我认为xml-stylesheet指令是一个坏主意。 - kdgregory
1
我投票支持它,因为问题对我来说非常清晰,@Ady给出了一个很好的答案。 - Greg
7个回答

26

@user4815100 这句话的意思是:“在这个标签及其子元素中,命名空间xhtml表示“http://www.w3.org/1999/xhtml”命名空间”。这基本上允许您在任何XML文档中包含XHTML元素。 - wizzwizz4

11

如果我理解正确,您希望在浏览器中查看XML文档时运行JavaScript?

这不是XML标准的一部分,因此在XML标准未支持之前将不会得到支持(我认为这永远不会得到支持,因为XML不是用于显示而是用于数据)。如果您说的是XHTML,则情况就不同了。

--

编辑:只是为了澄清我的答案。

XML从未旨在成为像HTML那样的显示标记语言,这就是为什么开发了XHTML(符合XML标准的HTML)。浏览器已经被制作成以某种方式解释XHTML,但XML只是原始数据。

如果您想让XML运行JavaScript等附加功能,您需要考虑使用XSLT将XML转换为XHTML,从而利用浏览器的功能。


是的,你说对了,我正在谈论XML而不是XHTML。 我不关心标准,只关心实际浏览器功能。 它们支持<?xml-stylesheet type="text/css" href="style.css"?>,我认为应该有类似于JavaScript的东西。 - orion3
我认为你需要考虑XML的用途。你可以使用XSLT把XML转换成XHTML,然后将页面作为HTML文档打开,并运行你想要的所有JavaScript。 - Ady
xhtml只是xml的一种特殊情况。那么为什么xml不适合运行JavaScript呢?从理论上讲,JavaScript与xml的设计目的没有任何关系,我没有看到任何连接,并且我也没有看到任何限制JavaScript在xml文档中运行的原因。 - orion3
@snitko - 首要问题是没有任何浏览器能够将其识别为显示标记,并且为了使基本的事件工作,您必须定义很多扩展,这时您可能会使用 XHTML,因为它已经方便地定义了这些内容。 - annakata

9
<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浏览器。


可以确认 xmlns 就是解决方案 :) 真不错的回答!在 Chrome 中可行!虽然我觉得奇怪的是,它可以运行 getElementById/querySelectorAll,因为它不在正确的命名空间中,而我的模式可能使用不同的属性来表示它们。 - Dmytro

4

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>

0

与上面类似,但可能会出错,因为<![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'>
// &lt;![CDATA[
  </xsl:text>
  <xsl:copy-of select='./text()' />
  <xsl:text disable-output-escaping='yes'>
//]]&gt;
  </xsl:text>
  </script>
</xsl:when>
...

浏览这些代码片段...

  1. 检测<script>元素。
  2. 复制<script>标签到输出结果中。
  3. 一定要使用快捷的xsl:for-each语句来保留输出结果中的标签属性。
  4. 输出非转义文本:// <![CDATA[。其中//将其余行呈现为注释,从而防止JS错误。
  5. 复制<script>标记的文本内容。注意:必须保留换行符(可采用以上方式或其他方式),以便在此行之前被注释掉的行不会出现在同一行。显然,如果它确实出现了,它也会注释掉这一行。保留该行后面的部分并非必要,但可以让两个匹配的CDATA标记美观匹配。
  6. 输出非转义文本:// ]]>。这结束了CDATA块,而且在读取JS时,浏览器会忽略CDATA标记。
  7. 当然,使用</script>标记关闭该块。
  8. 如果您将其用于xsl:choose块,请先关闭xsl:when
只有步骤2、3、5和7实际上复制脚本块。其余的都是为了使它工作而忙碌的工作。
转换如下代码块...
...
<script type='javascript'>alert('Hello World!');</script>
...

然后变成了:

...
<script type='javascript'>
// <![CDATA[
alert('Hello World!');
// ]]>
</script>

能够有效地保存,并且可以被XML和浏览器读取。


0
将XML和Javascript嵌入XHTML文档中,然后利用动态HTML的广泛和充分记录的功能。这样做比通过推理得出某些浏览器实现了弱且文档不完整的CSS样式化XML文档,因此它们必须支持嵌入XML的Javascript执行要快得多,好像这两个想法之间有任何联系一样。

-2
一个能帮到你的函数是eval()函数。这个函数会把你传进去的字符串当做Javascript代码来执行。
同时,在Javascript中解析XML也是可能的。只需要在谷歌上搜索“javascript xml parser”即可。
结合这两个想法,你就可以开始了。
如果您只想在XML文件中放置JavaScript代码: 这里是一些JavaScript代码; 这里还有更多的JavaScript代码; 这里甚至有更多的JavaScript代码; 这里也有更多的JavaScript代码;

请再次阅读问题。我并不是在询问如何从JavaScript解析JavaScript,或者从JavaScript解析XML。 - orion3
考虑到原问题质量差,这是一个合理的答案。 - AnthonyWJones
<js script="file.js"/> 未被浏览器执行。 - orion3
好的,让我试一下这种方式:我想让Firefox加载xml文件,然后解析与之关联的javascript文件并执行它的代码。 - orion3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接