使用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应用程序。