使用JavaScript的Chrome和Safari XSLT
我有以下代码应用XSLT样式
Test.Xml.xslTransform = function(xml, xsl) { try { // code for IE if (window.ActiveXObject) { ex = xml.transformNode(xsl); return ex; } // code for Mozilla, Firefox, Opera, etc. else if (document.implementation && document.implementation.createDocument) { xsltProcessor = new XSLTProcessor(); xsltProcessor.importStylesheet(xsl); resultDocument = xsltProcessor.transformToFragment(xml, document); return resultDocument; } } catch (exception) { if (typeof (exception) == "object") { if (exception.message) { alert(exception.message); } } else { alert(exception); } }
该代码适用于IE和Firefox,但不适用于Chrome和Safari。 有什么想法吗?
更新
ResultDocument = xsltProcessor.transformToFragment(xml, document);
上面的行返回null。 没有错误被抛出。
更新
代码无效,因为xslt文件包含xsl:include。 需要找到一种方法来使包含工作我将在此处粘贴进度
更新
我建议使用http://plugins.jquery.com/project/Transform/插件。 我正在尝试使用客户端libary作为include的示例( http://daersystems.com/jquery/transform/ )。
该代码适用于IE,但仍然不在Chrome中。
Test.Xml.xslTransform = function(xml, xsl) { try { $("body").append(""); var a = $("#test").transform({ xmlobj: xml, xslobj: xsl }); return a.html(); } catch (exception) { if (typeof (exception) == "object") { if (exception.message) { alert(exception.message); } } else { alert(exception); } } }
xml和xsl都是传入的对象。
更新
我尝试将XSL文件更改为非常简单但没有包含的内容,Chrome仍未应用样式表和IE。 作为对象引入的XSL是:
test
更新
我想要的最终结果是将xsl应用于xml文件。 xsl文件包含在其中。 我希望trasnfer理想地发生在客户端上。
更新了 Rupert你可以用xml更新问题以及你如何调用Test.Xml.xslTransform?
我使用ie8获得了xml
代码调用如下:
xsl = Test.Xml.loadXMLDoc("/_layouts/xsl/xsl.xslt"); var doc = Test.Xml.xslTransform(xData.responseXML, xsl);
xData是Web服务返回的xml。
如果您的XSLT使用的是xsl:include
您可能会收到奇怪的无法解释的错误,但总是会产生相同的最终结果:您的转换失败。
看到这个铬虫报告,请支持它! http://code.google.com/p/chromium/issues/detail?id=8441
这个bug实际上是在webkit中。 有关详细信息,请参阅此链接,其中详细说明了为什么它不起作用。
解决这个问题的唯一方法是预处理样式表,以便它注入包含的样式表。 这是像Sarissa这样的crossbrowser XSLT库会自动为您做什么。
如果您正在寻找jQuery解决方案:
http://plugins.jquery.com/project/Transform/是一个跨浏览器的XSL插件。 我成功地使用它来获取xsl:include
过去没有太多麻烦。 您无需重写xsl,此插件将为您预处理它们。 绝对值得一看,因为它比Sarissa更轻巧。
更新:
此测试html页面适用于Chrome / FireFox / IE。
input.xml只是一个简单的xml文件,包含
transform.xsl是你发布的精简版xsl。
编辑
然而,似乎$ .transform在从包含文件导入样式表时遇到问题:
以下是解决此问题的方法:
定位
var safariimportincludefix = function(xObj,rootConfig) {
在jquery.transform.js
中用这个替换整个函数:
var safariimportincludefix = function(xObj,rootConfig) { var vals = $.merge($.makeArray(xObj.getElementsByTagName("import")),$.makeArray(xObj.getElementsByTagName("include"))); for(var x=0;x
现在使用以前粘贴的测试index.html,将其用于transform.xsl
:
这适用于include.xsl
Test
通过先前在jquery.transform.js
发布的修复,现在将在所有浏览器上插入包含的
Test
。
你可以在这里看到它: http : //www.mpdreamz.nl/xsltest
这不是原始问题的答案,但在我通过互联网搜索期间寻找适用于chrome的示例xslt转换时,我发现了多次链接到此线程。 我一直在寻找一种不使用任何开源或第三方库/插件的解决方案,并且与Silverlight配合得很好。
chrome和safari的问题是阻止直接加载xml文件的限制。 http://www.mindlence.com/WP/?p=308上建议的解决方法是通过任何其他方法加载xml文件,并将其作为字符串传递给xslt处理器。
通过这种方法,我能够在javascript中执行xsl转换,并通过HTML Bridge将结果传递给silverlight应用程序。