使用 JavaScript 的 Chrome 和 Safari XSLT [英] Chrome and Safari XSLT using JavaScript
问题描述
我有以下应用 XSLT 样式的代码
Test.Xml.xslTransform = function(xml, xsl) {尝试 {//IE 代码如果(window.ActiveXObject){ex = xml.transformNode(xsl);返回前;}//Mozilla、Firefox、Opera 等的代码else if (document.implementation && document.implementation.createDocument) {xsltProcessor = new XSLTProcessor();xsltProcessor.importStylesheet(xsl);resultDocument = xsltProcessor.transformToFragment(xml, document);返回结果文档;}} 捕获(异常){if (typeof (exception) == "object") {如果(异常消息){警报(异常.消息);}} 别的 {警报(例外);}}
代码在 IE 和 firefox 中有效,但在 Chrome 和 Safari 中无效.任何想法为什么?
更新
ResultDocument = xsltProcessor.transformToFragment(xml, document);
上面的行返回空值.没有抛出错误.
更新
代码不起作用,因为 xslt 文件包含 xsl:include.需要找到一种方法来使包含工作,我将在此处粘贴进度
更新
建议我使用 http://plugins.jquery.com/project/Transform/ 插件.我正在尝试使用客户端库作为包含在此处工作的示例(http://daersystems.com/jquery/transform/).
该代码在 IE 中有效,但在 chrome 中仍然无效.
Test.Xml.xslTransform = function(xml, xsl) {尝试 {$("body").append("<div id='test' style='display:none;'></div>");var a = $("#test").transform({ xmlobj: xml, xslobj: xsl });返回一个.html();}捕获(异常){if (typeof (exception) == "object") {如果(异常消息){警报(异常.消息);}} 别的 {警报(例外);}}}
xml 和 xsl 都是传入的对象.
更新
我尝试将 XSL 文件更改为没有包含的非常简单的文件,但 Chrome 仍然没有应用样式表,而 IE 是.作为对象引入的 XSL 是:
更新
我想要的最终结果是将 xsl 应用于 xml 文件.xsl 文件包含在其中.我希望理想情况下传输发生在客户端上.
已更新Rupert 能否用 xml 更新问题以及如何调用 Test.Xml.xslTransform ?
我使用 ie8 得到了 xml
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><soap:Body><SearchListItemsResponse xmlns="http://schemas.microsoft.com/sharepoint/soap/"><SearchListItemsResult><listitems xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14888rs:microsoft-xml-行集" xmlns:z="#RowsetSchema"><rs:data ItemCount="1"><z:row ows_Title="测试" ows_FirstName="测试 4" ows_UniqueId="74;#{1A16CF3E-524D-4DEF-BE36-68A964CC24DF}" ows_FSObjType="74;#0" ows_ID"Info="74="74" ows_owshiddenversion="10" ows_Created="2009-12-29 12:21:01" ows_FileRef="74;#Lists/我的列表名称/74_.000" ReadOnly="False" VerificationRequired="0"/></rs:data></listitems></SearchListItemsResult></SearchListItemsResponse></soap:Body></soap:Envelope>
代码调用如下:
xsl = Test.Xml.loadXMLDoc("/_layouts/xsl/xsl.xslt");var doc = Test.Xml.xslTransform(xData.responseXML, xsl);
xData 是 Web 服务返回的 xml.
如果您的 XSLT 使用 xsl:include
,您可能会收到奇怪的无法解释的错误,但最终结果总是相同:您的转换失败.
看到这个 Chromium 错误报告,请支持它!http://code.google.com/p/chromium/issues/detail?id=8441
这个错误实际上是在 webkit 中.欲了解更多信息这里是另一个更详细的链接为什么它不起作用.
解决这个问题的唯一方法是预处理样式表,以便它注入包含的样式表.这就是像 Sarissa 这样的跨浏览器 XSLT 库会自动为您做的事情.
如果您正在寻找 jQuery 解决方案:
http://plugins.jquery.com/project/Transform/ 是一个跨浏览器的 XSL 插件-在.我已经成功地使用它让 xsl:include
过去没有太多麻烦.你不必重写你的 xsl,这个插件会为你预处理它们.绝对值得一看,因为它比 Sarissa 更轻巧.
更新:
<头><脚本语言="javascript" src="jquery-1.3.2.min.js"></script><script language="javascript" src="jquery.transform.js"></script><script type="text/javascript">功能加载XML(文件){var xmlDoc = null;尝试//Internet Explorer{xmlDoc=new ActiveXObject("Microsoft.XMLDOM");xmlDoc.async=false;xmlDoc.load(文件);}捕获(e){试试//Firefox、Mozilla、Opera 等.{xmlDoc=document.implementation.createDocument("","",null);xmlDoc.async=false;xmlDoc.load(文件);}捕获(e){试试//谷歌浏览器{var xmlhttp = new window.XMLHttpRequest();xmlhttp.open("GET",file,false);xmlhttp.send(null);xmlDoc = xmlhttp.responseXML.documentElement;}捕获(e){错误=e.message;}}}返回 xmlDoc;}函数 xslTransform(xmlObject, xslObject){尝试{$("body").append("<div id='test'></div>");var a = $("#test").transform({ xmlobj: xmlObject, xslobj: xslObject });}捕获(例外){if (typeof (exception) == "object" && exception.message)警报(异常.消息);否则警报(异常);}}var xmlObject = loadXML("input.xml");var xslObject = loadXML("transform.xsl");$(document).ready(function(){xslTransform(xmlObject, xslObject);});头部><身体>