XSLT中的javascript代码
我正在使用XSLT在客户端(Chrome浏览器)上将XML转换为HTML 我试图将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
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文件中时,我还需要以下内容才能正常工作:
- 使用
元素加载外部javascript文件:script
- 包含javascript代码的裸
元素,这些元素调用在外部javascript文件中声明的函数,这些函数由早期的
元素加载脚本
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样式表,创建带有外部源文件的HTMLscript
,并由Chrome加载和执行。在Chrome中运行外部脚本,其中声明一个函数foo
,并调用一个函数完成,并且创建的input
按钮也能够成功调用按钮foo
。我没有尝试使用延迟
,因为我不确定为什么需要这样做。您的示例包括脚本
元素和在其onclick
操作中使用该外部脚本的输入
元素。然而,在我的例子中,XSL文件中有一个裸露的脚本元素,它显式调用一个在外部.js文件中声明的函数(事实上,这部分没有出现在我的原始问题中,我将对其进行修订)。您的示例中缺少此部分,而这正是importNode
无法正常工作的部分。(对动作属性(如onclick
进行相同的函数调用时效果良好)