Javascript 如果输入位于HTML命名空间中且属性值包含JS,Chrome 39 XSLTProcessor将返回null
长话短说,我正在开发一个Chrome扩展,它将XSL转换应用于网页的DOM。这是可行的,除非是在非常特殊的情况下;如果属性值包含内联Javascript,即以字符串Javascript:开头,并且该值的其余部分包含小于符号,即使该符号已正确转义 示例-工作代码:Javascript 如果输入位于HTML命名空间中且属性值包含JS,Chrome 39 XSLTProcessor将返回null,javascript,google-chrome,xslt,Javascript,Google Chrome,Xslt,长话短说,我正在开发一个Chrome扩展,它将XSL转换应用于网页的DOM。这是可行的,除非是在非常特殊的情况下;如果属性值包含内联Javascript,即以字符串Javascript:开头,并且该值的其余部分包含小于符号,即使该符号已正确转义 示例-工作代码: xml = '\ <p xmlns="http://www.w3.org/1999/xhtml">\ <a href="javascript:foo bar">my link</a>\
xml = '\
<p xmlns="http://www.w3.org/1999/xhtml">\
<a href="javascript:foo bar">my link</a>\
</p>';
xsl = '<?xml version="1.0"?>\
<xsl:stylesheet version="1.0" xmlns="http://www.w3.org/1999/xhtml" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">\
<xsl:output version="1.0" method="xml" />\
</xsl:stylesheet>';
parse = new DOMParser();
xmlDOM = parse.parseFromString(xml, 'text/xml');
xslDOM = parse.parseFromString(xsl, 'text/xml');
xsltProc = new XSLTProcessor();
xsltProc.importStylesheet(xslDOM);
result = xsltProc.transformToFragment(xmlDOM, document);
…这将导致转换失败,结果将为空
这个问题的触发因素非常具体。包含javascript:prefix和小于符号的属性必须位于[X]HTML命名空间中,并且只有通常包含URL的属性才会受到影响,因此除了a@href, iframe@src, script@src和img@src都受到了影响
如果值的前缀不是javascript:,则不会发生此问题
这个问题在命令行xsltproc或Firefox中似乎也没有出现
所以我的问题很简单:为什么会发生这种情况
我想一个明显的后续问题是,这是否允许在XSL中嵌入和执行Javascript
万一有人想知道。。。是的,很难找出是什么触发了这一切D在您的示例中,属性不在名称空间中,它是XHTML名称空间中的a元素的属性,但属性本身肯定不在名称空间中。所以我不明白你为什么说属性。。。必须在[X]HTML命名空间中。我创建了,可以确认它在Chrome39中不起作用。我认为这是Chrome中的一个bug,transformToFragment应该始终返回一个文档片段,并且不为null,除非转换抛出错误,但是Chrome不会显示错误,只有片段上的最后一个子元素给出错误。我还创建了至少可以进行转换的地方,尽管Chrome在单击链接时不显示javascript href的结果。最后显示Chrome在静态HTML中单击此类链接时甚至不显示javascript:href的结果。Re命名空间,是的,你是对的。我的意思是父对象必须位于HTML命名空间中。因此,在我的示例中,如果我们将输入XML中的xmlns声明更改为,那么转换将成功,也就是说,按照预期工作。从我有限的测试看来,属性的值并不像预期的那样重要。。。它只是一个文本节点,但只有当该值与regexp/^\s*javascript:匹配时才会触发该错误*
<a href="javascript:foo <bar">my link</a>\