javascript - 组件返回失败代码: 0x80600011 [nsIXSLTProcessorObsolete.transformDocument]

标签 javascript jquery jquery-plugins xslt

所以,我正在使用 JQuery 的 XSLT 插件,这是我的代码:

function AddPlotcardEventHandlers(){
    // some code
}

function reportError(exception){
    alert(exception.constructor.name + " Exception:  " + ((exception.name) ? exception.name : "[unknown name]") + " - " + exception.message);
}

function GetPlotcards(){
    $("#content").xslt("../xml/plotcards.xml","../xslt/plotcards.xsl", AddPlotcardEventHandlers,reportError);
}

这是修改后的 jquery 插件。我说它已修改,因为我添加了成功和错误处理的回调。

/*
 * jquery.xslt.js
 *
 * Copyright (c) 2005-2008 Johann Burkard (<mailto:jb@eaio.com>)
 * <http://eaio.com>
 * 
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
 * to deal in the Software without restriction, including without limitation
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 * and/or sell copies of the Software, and to permit persons to whom the
 * Software is furnished to do so, subject to the following conditions:
 * 
 * The above copyright notice and this permission notice shall be included
 * in all copies or substantial portions of the Software.
 * 
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
 * NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
 * USE OR OTHER DEALINGS IN THE SOFTWARE.
 * 
 */

/**
 * jQuery client-side XSLT plugins.
 * 
 * @author <a href="mailto:jb@eaio.com">Johann Burkard</a>
 * @version $Id: jquery.xslt.js,v 1.10 2008/08/29 21:34:24 Johann Exp $
 */
(function($) {
    $.fn.xslt = function() {
        return this;
    }
    var str = /^\s*</;
    if (document.recalc) { // IE 5+
        $.fn.xslt = function(xml, xslt, onSuccess, onError) {

             try{

                var target = $(this);

                var change = function() {
                    try{
                        var c = 'complete';
                        if (xm.readyState == c && xs.readyState == c) {
                                window.setTimeout(function() {
                                    target.html(xm.transformNode(xs.XMLDocument));
                                    if (onSuccess) onSuccess();
                                }, 50);
                        }
                    }catch(exception){
                        if (onError) onError(exception);
                    }
                };

                var xm = document.createElement('xml');
                xm.onreadystatechange = change;
                xm[str.test(xml) ? "innerHTML" : "src"] = xml;

                var xs = document.createElement('xml');
                xs.onreadystatechange = change;
                xs[str.test(xslt) ? "innerHTML" : "src"] = xslt;

                $('body').append(xm).append(xs);
                return this;

            }catch(exception){
                if (onError) onError(exception);
            }
       };
    }
    else if (window.DOMParser != undefined && window.XMLHttpRequest != undefined && window.XSLTProcessor != undefined) { // Mozilla 0.9.4+, Opera 9+
       var processor = new XSLTProcessor();
       var support = false;
       if ($.isFunction(processor.transformDocument)) {
           support = window.XMLSerializer != undefined;
       }
       else {
           support = true;
       }
       if (support) {
            $.fn.xslt = function(xml, xslt, onSuccess, onError) {

                try{

                    var target = $(this);
                    var transformed = false;

                    var xm = {
                        readyState: 4
                    };
                    var xs = {
                        readyState: 4
                    };

                    var change = function() {
                        try{
                             if (xm.readyState == 4 && xs.readyState == 4  && !transformed) {
                                var processor = new XSLTProcessor();
                                if ($.isFunction(processor.transformDocument)) {
                                    // obsolete Mozilla interface
                                    resultDoc = document.implementation.createDocument("", "", null);
                                    processor.transformDocument(xm.responseXML, xs.responseXML, resultDoc, null);
                                    target.html(new XMLSerializer().serializeToString(resultDoc));
                                }
                                else {
                                    processor.importStylesheet(xs.responseXML);
                                    resultDoc = processor.transformToFragment(xm.responseXML, document);
                                    target.empty().append(resultDoc);
                                }
                                transformed = true;
                                if (onSuccess) onSuccess();
                            }
                        }catch(exception){
                            if (onError) onError(exception);
                        }
                    };

                    if (str.test(xml)) {
                        xm.responseXML = new DOMParser().parseFromString(xml, "text/xml");
                    }
                    else {
                        xm = $.ajax({ dataType: "xml", url: xml});
                        xm.onreadystatechange = change;
                    }

                    if (str.test(xslt)) {
                        xs.responseXML = new DOMParser().parseFromString(xslt, "text/xml");
                        change();
                    }
                    else {
                        xs = $.ajax({ dataType: "xml", url: xslt});
                        xs.onreadystatechange = change;
                    }

                }catch(exception){
                    if (onError) onError(exception);
                }finally{
                    return this;
                }
            };
       }
    }
})(jQuery);

而且,这是我的错误消息:

Object Exception: [unknown name] - Component returned failure code: 0x80600011 [nsIXSLTProcessorObsolete.transformDocument]

这是我用于测试的浏览器的信息(安装了 firebug v1.5.4 插件):

Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3

这是我的 XML:

<?xml version="1.0" encoding="ISO-8859-1"?>
<plotcardCollection sortby="order">
    <plotcard order="2" id="1378">
        <name><![CDATA[[placeholder for name of plotcard 1378]]]></name>
        <content><![CDATA[[placeholder for content of plotcard 1378]]]></content>
        <tagCollection>
            <tag id="3"><![CDATA[[placeholder for tag with id=3]]]></tag>
            <tag id="7"><![CDATA[[placeholder for tag with id=7]]]></tag>
        </tagCollection>
    </plotcard>
    <plotcard order="1" id="2156">
        <name><![CDATA[[placeholder for name of plotcard 2156]]]></name>
        <content><![CDATA[[placeholder for content of plotcard 2156]]]></content>
        <tagCollection>
            <tag id="2"><![CDATA[[placeholder for tag with id=2]]]></tag>
            <tag id="9"><![CDATA[[placeholder for tag with id=9]]]></tag>
        </tagCollection>
    </plotcard>
</plotcardCollection>

这是我的 XSLT:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/plotcardCollection">
    <xsl:variable name="sortby" select="@sortby" />
    <xsl:for-each select="plotcard">
      <xsl:sort select="$sortby" data-type="number" order="ascending"/>
      <div>

          <!-- Start Plotcard -->
          <xsl:attribute name="class">Plotcard</xsl:attribute>
          <xsl:for-each select="@">
              <xsl:value-of select="name()"/>
              <xsl:text>='</xsl:text>
              <xsl:if test="name() = 'id'">
                  <xsl:text>Plotcard-</xsl:text>
              </xsl:if>
              <xsl:value-of select="." />
              <xsl:text>'</xsl:text>
          </xsl:for-each>

          <!-- Start Plotcard Name Section -->
          <div>
              <xsl:attribute name="class">
                  <xsl:text disable-output-escaping="yes">PlotcardName</xsl:text>
              </xsl:attribute>
              <xsl:value-of select="name/text()"/>
          </div>

          <!-- Start Plotcard Content Section -->
          <div>
              <xsl:attribute name="class">
                  <xsl:text disable-output-escaping="yes">PlotcardContent</xsl:text>
              </xsl:attribute>
              <xsl:value-of select="content/text()"/>
          </div>
      </div>
    </xsl:for-each>
  </xsl:template>
</xsl:stylesheet>

我真的不知道该怎么办......有什么想法吗?

最佳答案

所以,我想出了这个。显然我错误地引用了属性名称变量。 XSLT 失败的部分是:

          <xsl:for-each select="@">
              <xsl:value-of select="name()"/>
              <xsl:text>='</xsl:text>
              <xsl:if test="name() = 'id'">
                  <xsl:text>Plotcard-</xsl:text>
              </xsl:if>
              <xsl:value-of select="." />
              <xsl:text>'</xsl:text>
          </xsl:for-each>

应该是这样的:

      <xsl:for-each select="@*">
          <xsl:variable name="attrName">
              <xsl:value-of select="name()"/>
          </xsl:variable>
          <xsl:attribute name="{$attrName}">
            <xsl:if test="name() = 'id'">
                <xsl:text>Plotcard-</xsl:text>
            </xsl:if>
            <xsl:value-of select="."/>
          </xsl:attribute>
      </xsl:for-each>

关于javascript - 组件返回失败代码: 0x80600011 [nsIXSLTProcessorObsolete.transformDocument],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2937782/

相关文章:

javascript - Rails JQuery 和 Ajax 无法正常工作?

JQuery/CSS 转换内容

javascript - svg.js 缩放和移动/中心的奇怪交互

javascript - 检测浏览器窗口时调整大小

javascript - 下拉菜单上的问题

jquery-plugins - 使用MapHilight Jquery插件以不同颜色高亮显示

javascript - 如何对特定数据表应用过滤器

javascript - 在 Javascript 中动态分配正则表达式模式

javascript - 如何将最后一类元素复制到 jQuery 中的另一个元素?

javascript - 如果条件为真,是否可以加载新网页(单击按钮时),否则在同一网页上执行某些操作?