使用 JavaScript 的 Chrome 和 Safari XSLT

2024-03-02

我有以下应用 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 中运行。有什么想法吗?

Update

ResultDocument = xsltProcessor.transformToFragment(xml, document);

上面的行返回 null。没有抛出任何错误。

Update

该代码不起作用,因为 xslt 文件包含 xsl:include。需要找到一种方法来使包含工作,我将在此处粘贴进度

Update

有人建议我使用http://plugins.jquery.com/project/Transform/ http://plugins.jquery.com/project/Transform/插入。我尝试使用客户端库作为包含作品的示例(http://daersystems.com/jquery/transform/ http://daersystems.com/jquery/transform/).

该代码在 IE 中有效,但在 chrome 中仍然无效。

Test.Xml.xslTransform = function(xml, xsl) {
        try {
                $("body").append("<div id='test' style='display:none;'></div>");
                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都是传入的对象。

Update

我尝试将 XSL 文件更改为非常简单的文件,不包含任何内容,Chrome 仍然没有应用样式表,而 IE 是。作为对象引入的 XSL 是:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:rs="urn:schemas-microsoft-com:rowset"
    xmlns:z="#RowsetSchema"
    xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:spsoap="http://schemas.microsoft.com/sharepoint/soap/"
    >
    <xsl:output method="html"/>
    <xsl:template match="/">
        <h1>test</h1>
    </xsl:template>

</xsl:stylesheet>

Update

我想要的最终结果是将 xsl 应用于 xml 文件。 xsl 文件中包含。我希望传输理想地发生在客户端上。

Updated Rupert 您可以使用 xml 更新问题以及如何调用 Test.Xml.xslTransform 吗?

我使用 ie8 获取了 xml

<?xml version="1.0"?>
<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-00AA00C14882" xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:z="#RowsetSchema">
                    <rs:data ItemCount="1">
                        <z:row ows_Title="Test" ows_FirstName="Test 4" ows_UniqueId="74;#{1A16CF3E-524D-4DEF-BE36-68A964CC24DF}" ows_FSObjType="74;#0" ows_MetaInfo="74;#" ows_ID="74" ows_owshiddenversion="10" ows_Created="2009-12-29 12:21:01" ows_FileRef="74;#Lists/My List Name/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 bug 报告并支持它!http://code.google.com/p/chromium/issues/detail?id=8441 http://code.google.com/p/chromium/issues/detail?id=8441

但该错误实际上是在 webkit 中。欲了解更多信息here's http://www.experts-exchange.com/Web_Development/Web_Languages-Standards/XSLT/Q_24311395.html另一个链接更详细地说明了它不起作用的原因。

解决这个问题的唯一方法是预处理样式表,以便它注入包含的样式表。这就是像 Sarissa 这样的跨浏览器 XSLT 库会自动为您做的事情。

如果您正在寻找 jQuery 解决方案:
http://plugins.jquery.com/project/Transform/ http://plugins.jquery.com/project/Transform/是一个跨浏览器的XSL插件。我已经成功地使用它来获得xsl:include过去工作没有太多麻烦。您不必重写您的 xsl,这个插件将为您预处理它们。绝对值得一看,因为它比 Sarissa 更轻。

UPDATE:

<html>
<head>
<script language="javascript" src="jquery-1.3.2.min.js"></script> 
<script language="javascript" src="jquery.transform.js"></script>  
<script type="text/javascript">
function loadXML(file)
{
    var xmlDoc = null;
    try //Internet Explorer
    {
        xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
        xmlDoc.async=false;
        xmlDoc.load(file);
    }
    catch(e)
    {
        try //Firefox, Mozilla, Opera, etc.
        {
            xmlDoc=document.implementation.createDocument("","",null);
            xmlDoc.async=false;
            xmlDoc.load(file);
        }
        catch(e)
        {
            try //Google Chrome
            {
                var xmlhttp = new window.XMLHttpRequest();
                xmlhttp.open("GET",file,false);
                xmlhttp.send(null);
                xmlDoc = xmlhttp.responseXML.documentElement;
            }
            catch(e)
            {
            error=e.message;
            }
        }
    }
    return xmlDoc;
}
function xslTransform(xmlObject, xslObject)
{
    try 
    {
        $("body").append("<div id='test'></div>");
        var a = $("#test").transform({ xmlobj: xmlObject, xslobj: xslObject });
    }
    catch (exception) 
    {
        if (typeof (exception) == "object" && exception.message) 
            alert(exception.message);
        else alert(exception);
    }
}
var xmlObject = loadXML("input.xml");
var xslObject = loadXML("transform.xsl");
$(document).ready(function()  
{
    xslTransform(xmlObject, xslObject);
});
</script>
</head>
<body>

</body>
</html>

此测试 html 页面在 Chrome/FireFox/IE 中均有效。

input.xml 只是一个简单的 xml 文件,包含<root />transform.xsl 是您发布的精简的 xsl。

EDIT

然而,似乎 $.transform 从包含的文件导入样式表时遇到问题:

解决此问题的方法如下:

Locate

var safariimportincludefix = function(xObj,rootConfig) {

in jquery.transform.js并将整个函数替换为:

var safariimportincludefix = function(xObj,rootConfig) {
    var vals = $.merge($.makeArray(xObj.getElementsByTagName("import")),$.makeArray(xObj.getElementsByTagName("include")));

    for(var x=0;x<vals.length;x++) {
        var node = vals[x];
        $.ajax({
            passData : { node : node, xObj : xObj, rootConfig : rootConfig},
            dataType : "xml",
            async : false,
            url : replaceref(node.getAttribute("href"),rootConfig),
            success : function(xhr) {
                try {
                    var _ = this.passData;
                    xhr = safariimportincludefix(xhr,_.rootConfig);

                    var imports = $.merge(childNodes(xhr.getElementsByTagName("stylesheet")[0],"param"),childNodes(xhr.getElementsByTagName("stylesheet")[0],"template"));
                    var excistingNodes = [];
                    try 
                    {
                        var sheet = _.xObj;
                        var params = childNodes(sheet,"param");
                        var stylesheets = childNodes(sheet,"template");
                        existingNodes = $.merge(params,stylesheets);
                    }
                    catch(exception) 
                    {
                        var x = exception;
                    }
                    var existingNames = [];
                    var existingMatches = [];
                    for(var a=0;a<existingNodes.length;a++) {
                        if(existingNodes[a].getAttribute("name")) {
                            existingNames[existingNodes[a].getAttribute("name")] = true;
                        } else {
                            existingMatches[existingNodes[a].getAttribute("match")] = true;
                        }
                    }

                    var pn = _.node.parentNode;
                    for(var y=0;y<imports.length;y++) {
                        if(!existingNames[imports[y].getAttribute("name")] && !existingMatches[imports[y].getAttribute("match")]) {
                            var clonednode = _.xObj.ownerDocument.importNode(imports[y],true);
                            //pn.insertBefore(clonednode,_.xObj);
                            pn.insertBefore(clonednode,childNodes(_.xObj,"template")[0]);
                        }
                    }
                    pn.removeChild(_.node);
                } catch(ex) { 

                }
            }
        });
    }

    return xObj;
};

现在使用之前粘贴的测试index.html,将其用于transform.xsl:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    >
        <xsl:include href="include.xsl" />
    <xsl:output method="html"/>
    <xsl:template match="/">
            <xsl:call-template name="giveMeAnIncludedHeader" />
    </xsl:template>
</xsl:stylesheet>

而这对于include.xsl

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template name="giveMeAnIncludedHeader">
        <h1>Test</h1>
    </xsl:template>
</xsl:stylesheet>

随着之前发布的修复jquery.transform.js现在将插入包含的<h1>Test</h1>在所有浏览器上。

您可以在这里看到它的实际效果:http://www.mpdreamz.nl/xsltest http://www.mpdreamz.nl/xsltest

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 JavaScript 的 Chrome 和 Safari XSLT 的相关文章

  • 可以在初始 DOM 解析期间/之前修改 DOM 吗?

    是否可以在初始 DOM 解析期间或之前修改 DOM 或者我是否必须等到 DOM 被解析和构建之后才能与其交互 更具体地说 是否有可能阻止 DOM 中的脚本元素使用用户脚本 内容脚本或 Chrome 或 Firefox 中的类似脚本运行 在解
  • Snap.svg - 停止在可悬停元素的子元素上重新触发悬停事件

    对于一个项目 我使用的 SVG 形状由背景多边形和背景多边形上方的一些文本 我已将其转换为路径 组成 我正在使用 Snap svg 为我的形状设置动画 当我将鼠标悬停在多边形上时 形状应该缩放到特定尺寸 包括其中的所有内容 鼠标移开时 形状
  • 隐藏 Div 的父级

    我只是想隐藏父divcomments section div class content content green div div div 我试过这个 document getElementById comments section pa
  • React-Redux:state.setIn() 和 state.set() 有什么区别?

    我见过使用setIn and set 在一些react redux代码中 state setIn state set 我在这里找到了一些文档https facebook github io immutable js https facebo
  • JQuery Mobile 与 MVC 的链接

    我正在使用 ASP NET MVC 3 和 Razor UI 设置 JQuery 移动网站 我正在生成我的链接 例如 a href See Group 2 a 假设我从 Home Index 访问它 我遇到的问题是 当我点击链接时 它会出现
  • Jquery 数据表列总和

    我只是参考一下这个链接 https datatables net examples advanced init footer callback html了解如何获取 jquery 数据表中的列总计 但我已经完成了一半的项目 我在html页面
  • 尝试将数据存储在点击器网站中

    我正在尝试存储一个名为的变量score无论何时刷新 您都会一次又一次地使用它 我不明白的是它的代码是什么 我尝试了一些方法 但似乎都不起作用 这是我的答题器网站 但是当我尝试使用 JavaScript 来存储它时 它不起作用window o
  • 如何解决 Typescript 构建中的错误“找不到模块 'jquery'”

    我目前在 ts 文件的顶部有这个import require jquery 我这样做是因为我试图在我的打字稿文件中使用 jquery 但我似乎无法编译它 因为它返回标题中所述的错误 我正在使用 ASP NET CORE 脚本文件夹 tsco
  • 为什么我们在打字稿中使用 HTMLInputElement ?

    我们为什么使用 document getElementById ipv as HTMLInputElement value 代替 document getElementById ipv value 功能getElementById返回具有类
  • 页面上使用 HTML Editor Extender 进行回发会导致 IE11 中出现 JavaScript 错误

    我已将 HTML 编辑器扩展程序添加到我正在处理的页面中 现在每当我在页面上发回帖子时 都会收到以下 Javascript 错误 JavaScript 运行时错误 参数无效 之后什么也没有发生 这在 IE10 或更低版本以及我所知道的所有其
  • 日期出现奇怪的错误,“未捕获非法访问”

    所以我试图找到最新的DateJavascript 可以处理 我把它减少到 9 月 275760 并增加了我开始捕获未捕获的天数illegal access例外new Date 09 24 275760 to new Date 10 13 2
  • Three.js 各种大小的粒子

    我是 Three js 的新手 正在尝试找出添加 1000 个粒子的最佳方法 每个粒子都有不同的大小和颜色 每个粒子的纹理是通过绘制画布创建的 通过使用粒子系统 所有粒子都具有相同的颜色和大小 为每个粒子创建一个粒子系统是非常低效的 有没有
  • 使用 Vue 的多模式组件

    我在 Vue 中实现动态模式组件时遇到问题 A common approach I follow to display a set of data fetched from the db is I dump each of the rows
  • 代码镜像错误:未捕获错误:扩展集中无法识别扩展值([对象对象])

    全部 我目前正在从事一个React Electron项目 该项目的目标是完成一个Markdown编辑器 当我配置codemirror 该程序报告错误说 Uncaught Error Unrecognized extension value
  • Chrome//kendoUI/jQuery:超出最大调用堆栈大小

    我正在使用 hottowell 模板来创建 spa 应用程序 并且我从 jquery 中收到了一个很好的错误 基本上我的问题从此刻开始尝试绑定我的视图 viewModelBinder js 来自 durandal 库 viewModelBi
  • 在 JavaScript 循环之外声明变量可以提高速度和内存?

    C 也有类似的问题 但我们没有看到 JavaScript 的任何问题 在循环内声明变量是否可以接受 假设循环有 200 次迭代 使用样本 2 相对于样本 1 是否有性能要求 内存和速度 我们使用 jQuery 来循环 它提高了我们将 var
  • Javascript - 水波纹效果

    我需要 JS 上的脚本 它将以 水波纹 样式更改 images html 抱歉 6MB GIF 文件 http fcuunited ru temp listening2 gif http fcunited ru temp listening
  • JavaScript 相对路径

    在第一个 html 文件中 我使用了一个变量类别链接 var categoryLinks Career prospects http localhost Landa DirectManagers 511 HelenaChechik Dim0
  • 如何使用asm.js进行测试和开发?

    最近我读到asm js规范 看起来很酷 但是是否有任何环境 工具来开发和测试这个工具 这还只是处于规范阶段吗 您可以尝试使用 emscripten 和 ASM JS 1 并从侧分支在 firefox 构建中运行它 有关 asm js 的链接
  • Vue.js[vuex] 如何从突变中调度?

    我有一个要应用于 json 对象的过滤器列表 我的突变看起来像这样 const mutations setStars state payload state stars payload this dispatch filter setRev

随机推荐

  • 更新后 python 和 virtualenvwrapper 出现问题:没有名为 virtualenvwrapper 的模块

    我在 ubuntu 14 04 下使用 virtualenv virtualenvwrapper 运行 python 2 7 6 现在我已经从源代码安装了 python 2 7 9 新的 python 解释器现在位于 usr local b
  • 用户默认值看似随机地更改为以前的值 - Swift

    我正在创建一个应用程序 它是一个需要存储高分的游戏 我相信 如果我错了请纠正我 但是这个问题 https stackoverflow com questions 28628225 how do you save local storage
  • 测试 API REST SCALA

    我正在使用 Scala Akka 和 Spray 开发一个应用程序 我想测试 API 的服务 我不明白怎么办spray testkit帮助我们进行测试 我也尝试过Specs2 and ScalaTest但它们都不是为了测试 API 而设计的
  • 指定从本机 WiFi 设置屏幕返回的活动

    在我的特定情况下 应用程序旨在在嵌入式系统中运行 其中应用程序流程由应用程序本身处理 并且 Android 导航栏被禁用 也没有硬件按钮 在某些时候 我必须提供要连接的 WiFi 设置 并且我想调用本机设置屏幕 但是 我发现设置完成后很难返
  • 变换(旋转)UIBarButtonItem

    有人知道如何转换 UIBarButtonItem 吗 我尝试了这个但没有结果 它不适用于 UIBarButtonItem 及其自定义视图 UIView beginAnimations nil context NULL UIView setA
  • 突出显示被拖过的 TreeView 项目

    在我的应用程序中 我有一个允许拖放的 TreeView 我的所有功能都工作正常 但是当 TreeViewItem 被拖过时 我很难突出显示它 这是我的树视图项目的样式 IsMouseOver 触发器在拖动时不起作用 因为拖动似乎会阻止其他鼠
  • 如何快速将图像文件路径列表转换为位图列表?

    ArrayList
  • 我应该在哪里配置 max_result_window 索引设置?

    我正在尝试添加到我的elasticsearch yml index max result window 10000 但问题是它不喜欢我添加index 在配置中 它会导致错误 这在elastica版本2 X中工作 但现在在6 X中似乎不起作用
  • 如何使用反引号捕获 time(1) 的经过时间输出?

    我正在尝试获取输出time http www kernel org doc man pages online pages man1 time 1 html使用以下命令 我唯一想要的就是得到经过的时间 但我什么也没得到 result usr
  • WiX:多个 MSI 文件?

    Visual Studio 的解决方案中是否可以有一个 WiX Installer 项目 但该项目输出多个安装程序文件 通过具有多个 wxs 文件或多个
  • 如何在C++中实现向量混合?

    struct vec2 union struct float x y struct float r g struct float s t vec2 vec2 float a float b x a y b struct vec3 union
  • sql Management Studio 超过 7 列的 t-sql 唯一约束

    我想在表中为 7 列创建唯一约束 因此当有人想要在此表中插入数据时 这些列在一起是唯一的 在oracle中这很简单 但是在这里 我可以通过sql代码来做到这一点 CREATE TABLE Example Col1 int NOT NULL
  • ImageMagick 不再在 AWS Lambda 中转换 pdf

    过去 18 个月里 我在 S3 对象上运行了一个 AWS Lambda 函数 大约一个月前 它在一次小更新后失效了 我已恢复它 但它仍然损坏 我研究过使用 ImageMagick 进行最基本的 pdf 转换 但没有成功 所以我认为 AWS
  • JaCoCo 在跳过 JaCoCo 执行后才生成 jacoco.exec

    我在我的模块之一中通过 JaCoCo 生成 AHP 报告时遇到问题 当构建开始时 我看到 JaCoCo 正确设置 argLine 为 INFO jacoco agent argLine set to javaagent lt gt m2 r
  • Sidekiq 中是否有控制台命令可以查看队列中的内容并清除队列?

    我习惯使用delayed jobs方法进入控制台来查看队列中的内容 以及在需要时轻松清除队列的方法 Sidekiq 中有类似的命令吗 谢谢 有一个符合人体工学的用于查看和管理队列的 API https github com mperham
  • 如果所有子节点都分配了类,则选择父节点

    我正在寻找一种有效的方法来遍历无序列表 该列表包含多个级别 其中包含类 selected 如果组中的所有 UL LI 都具有 selected 类 我需要将 selected 类添加到子 UL 的父 LI 中 ul li one lt th
  • 从 C++ 使用 Neo4j 数据库

    我的问题是我想从 C 程序使用 Neo4j 数据库 我读了很多 但仍然不知道如何开始 首先 我想在 Neo4j 和 C 之间建立连接 并且我想从 C 程序创建节点 任何人都有示例代码 或者有人可以帮忙 我该如何开始 对于即将推出的二进制远程
  • Rserve - 一台服务器上有多个实例?

    是否可以在一台服务器上同时运行 Rserve 的多个实例 例如 10 个实例意味着 10 个独立的 R 工作区通过同一台计算机上的 Rserve 监听不同端口 在 Oleksandr指定的同一文档中 它在第5 6页明确指出 在Windows
  • 透视变换三角点

    我试图找到从一个三角形到另一个三角形的等效点 理想情况下 我希望能够给出三角形 A 的 3 个点和三角形 B 的 3 个点 然后计算变换矩阵 然后将其应用于该点以找到等效点 我为此找到了一些 JavaScript 库 方法 但它们都使用四边
  • 使用 JavaScript 的 Chrome 和 Safari XSLT

    我有以下应用 XSLT 样式的代码 Test Xml xslTransform function xml xsl try code for IE if window ActiveXObject ex xml transformNode xs