Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/88.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
XSLT中的javascript代码_Javascript_Html_Google Chrome_Xslt - Fatal编程技术网

XSLT中的javascript代码

XSLT中的javascript代码,javascript,html,google-chrome,xslt,Javascript,Html,Google Chrome,Xslt,我正在使用XSLT在客户端(Chrome浏览器)上将XML转换为HTML 我试图将HTML标记添加到XSLT中,但似乎其中的代码从未在生成的HTML上进行计算,尽管我已指定了延迟 另一方面,onclick事件本身运行正常 下面是一个XSLT示例,演示了该问题: <?xml version="1.0" encoding="UTF-8"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Tra

我正在使用XSLT在客户端(Chrome浏览器)上将XML转换为HTML

我试图将
HTML标记添加到XSLT中,但似乎其中的代码从未在生成的HTML上进行计算,尽管我已指定了
延迟

另一方面,
onclick
事件本身运行正常

下面是一个XSLT示例,演示了该问题:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:output method="html"
            encoding="UTF-8"
            indent="no"/>

<xsl:template match="/">
<html>
<head>

<script type="text/javascript" defer="defer">
<xsl:text>
<![CDATA[
function test(){
  window.alert('Test');
}
 ]]>
 </xsl:text>
</script>


</head>

<body>
  <button onclick="window.alert('Test')">This works</button>      
  <br/>
  <button onclick="test()">This does not work</button>      
</body>
</html>
</xsl:template>
</xsl:stylesheet>
更新 当它们出现在XSLT文件中时,我还需要以下内容才能正常工作:

  • 使用
    script
    元素加载外部javascript文件:
  • 包含javascript代码的裸
    元素,这些元素调用在外部javascript文件中声明的函数,这些函数由早期的
    脚本
    元素加载

据我研究,这是2013年Chrome上报告的一个已知错误。看起来并没有采取任何措施来修复它。但是,bug reporter也找到了一种解决方法,如果首先对片段调用
importNode
,则不使用
appendChild
insertBefore
或类似方法将
transformToFragment
返回的片段直接插入到文档中,当您将导入的片段插入文档时,将执行
脚本
元素

我已经编写了一个测试用例,它可以在Windows上运行最新版本的Chrome

  var proc = new XSLTProcessor();
  proc.importStylesheet(xsltDoc);
  targetElement.appendChild(targetElement.ownerDocument.importNode(proc.transformToFragment(xmlDoc, targetElement.ownerDocument), true));
但是,请注意,Microsoft Edge既不使用在片段上调用appendChild的常规方法,也不使用上述Chrome变通方法来执行脚本元素的代码。

可能的解决方案:(灵感来源)

function insertAndExecute(id,htmlResult){
document.getElementById(id).appendChild(htmlResult);
var scripts=document.getElementById(id).getElementsByTagName(“脚本”);
风险值递延=[];
//首先加载所有外部脚本
对于(var i=0;i
不确定-适用于firefox,不适用于edge或chromeI。我已尝试重现此问题,XML文档是,您的XSLT是,Windows 10上的Chrome 46显示了两个按钮的警报框,控制台中未显示脚本错误。不要使用w3schools测试台来运行XSLT。@MartinHonnen它在我的本地服务器上被复制。W3Schools只是作为一个例子。我将尝试给出另一个例子,使用W3Schools以外的一些其他在线工具。你能重现这个问题吗?这是哪个平台上的哪个版本的Chrome?这似乎是Chrome的一个已知问题:,他们似乎没有做出任何努力来修复它。bug reporter说使用
document.getElementById(“结果”).appendChild(document.importNode(htmlResult,true))
而不是直接的
appendChild
修复了Chrome的问题,我还没有对此进行测试。
importNode
方法在XSLT包含对外部javascript资源的引用时对我不起作用:
。嵌入的javascript代码无法使用
library.js
。在脚本中加载并转换XSLT样式表,创建带有外部源文件的HTML
script
,并由Chrome加载和执行。在Chrome中运行外部脚本,其中声明一个函数
foo
,并调用一个函数完成,并且创建的
input
按钮也能够成功调用按钮
foo
。我没有尝试使用
延迟
,因为我不确定为什么需要这样做。您的示例包括
脚本
元素和在其
onclick
操作中使用该外部脚本的
输入
元素。然而,在我的例子中,XSL文件中有一个裸露的
脚本
元素,它显式调用一个在外部.js文件中声明的函数(事实上,这部分没有出现在我的原始问题中,我将对其进行修订)。您的示例中缺少此部分,而这正是
importNode
无法正常工作的部分。(对动作属性(如
onclick
进行相同的函数调用时效果良好)